ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署
通過上文所介紹的內容,我們已經完成了RESTful API的開發,現在,就可以使用Azure DevOps來進行持續集成(CI)和k8s持續部署(CD)了。本文我會對使用Azure DevOps進行CI/CD的過程中需要注意的地方進行詳細介紹,而對于Azure DevOps配置的詳細步驟,我不會做太多注解,大家可以參考我前面寫的《ASP.NET Core應用程序容器化、持續集成與Kubernetes集群部署》系列文章。
在使用Azure DevOps進行CI/CD之前,首先來了解一下整個開發部署的架構拓撲,下圖展示了基于Azure DevOps進行持續集成和持續部署的架構拓撲:
我們首先使用Visual Studio 2019來開發ML.NET模型訓練的項目,用以生成訓練模型,并使用Visual Studio 2019開發了基于ASP.NET Core的RESTful API,這些代碼都由Azure DevOps Repo進行托管。然后,Azure DevOps Build Pipeline會對源代碼進行編譯,將RESTful API應用程序編譯成docker鏡像然后推送到Azure Container Registry上,并執行模型訓練程序,產生訓練模型ZIP文件,并由Release Pipeline將訓練模型保存到Azure Blob Storage中。Release Pipeline的另一個任務就是通過定義好的Kubernetes部署文件,將RESTful API部署到Azure Kubernetes Services集群。運行于ASP.NET Core中的RESTful API在啟動的時候,會訪問Azure Blob Storage讀取訓練模型,同時向客戶端提供API端點。整套CI/CD體系,包括代碼托管,包括容器注冊表,包括容器集群等,全部都由Microsoft Azure提供。不過,出于費用方面的考慮,我沒有使用Azure Container Registry,而是使用docker hub,在代碼托管方面,也沒有使用Azure Repo,而是使用的Github。
總結起來,Build Pipeline和Release Pipeline的任務如下:
Build Pipeline:從代碼庫下載代碼,編譯并運行訓練程序,生成訓練模型文件;將ASP.NET Core RESTful API編譯成docker鏡像并推送到docker hub;最后,將訓練模型文件以及用于k8s部署的配置文件進行存檔,以供Release Pipeline使用
Release Pipeline:讀取Build Pipeline所保存的訓練模型文件,將其保存到Azure Blob Storage;然后讀取Build Pipeline所保存的k8s配置文件,將RESTful API容器鏡像部署到k8s環境運行
下面,我簡要介紹一下這兩個部分的配置過程以及注意事項。
以下是本案例的Build Pipeline的配置:
在Build Pipeline里,我定義了兩個Agent job:Build Training Model以及Build Web API。前者運行在Hosted VS2017的Agent pool中,后者運行在Hosted Ubuntu 1604的Agent pool中。兩者可以并行執行,因為互相并沒有依賴。Build Training Model會下載訓練程序,在.NET Core下編譯并執行這個訓練程序,并產生訓練模型文件,通過Publish Artifact: Trained Model任務,將訓練模型保存起來。而Publish Artifact: Drop k8s deployment script任務則比較簡單了,僅僅是將代碼庫中預先寫好的k8s配置文件保存下來,僅此而已。
在Build Web API這個job里,會將ASP.NET Core RESTful API編譯成docker容器鏡像,并推送到docker hub中,詳細配置步驟都比較簡單,也就不多說明了。
以下是本案例的Release Pipeline的配置:
在Artifacts設置中,會從Build Pipeline將訓練模型文件和部署文件復制過來,接下來,在Publish Model to Azure Blob stage中,會將訓練模型復制到Azure Blob Storage中,這里使用的是Azure File Copy任務,我們只需要將Azure Subscription的信息以及Azure Blob Storage的連接信息填入即可。
在Kubernetes Deployment job中,使用Deploy to Kubernetes任務,即可快速方便地將ASP.NET Core RESTful API方便地部署到Azure Kubernetes Services托管的k8s集群中。需要注意的是,由于RESTful API需要訪問Azure Blob Storage來讀取機器學習的訓練模型(這一點在上一講已經提到過),因此,在這里就要將訪問Blob Storage的連接信息通過ConfigMap配置到k8s集群中:
從k8s.deploy.yml文件可以看到,環境變量是如何通過ConfigMap設置到集群中的服務上的:
apiVersion: v1 items: - apiVersion: extensions/v1beta1 ??kind: Deployment ??metadata: ????name: mlnet-webapi-deployment ??spec: ????replicas: 2 ????template: ??????metadata: ????????labels: ??????????app.name: mlnet ??????spec: ????????containers: ??????????- image: daxnet/mlnet_webapi ????????????name: mlnet-webapi ????????????ports: ????????????- containerPort: 80 ????????????env: ????????????- name: BLOB_DEFAULT_ENDPOINTS_PROTOCOL ??????????????valueFrom: ????????????????configMapKeyRef: ??????????????????name: mlnet-config ??????????????????key: BLOB_DEFAULT_ENDPOINTS_PROTOCOL ????????????- name: BLOB_ACCOUNT_NAME ??????????????valueFrom: ????????????????configMapKeyRef: ??????????????????name: mlnet-config ??????????????????key: BLOB_ACCOUNT_NAME ????????????- name: BLOB_ACCOUNT_KEY ??????????????valueFrom: ????????????????configMapKeyRef: ??????????????????name: mlnet-config ??????????????????key: BLOB_ACCOUNT_KEY ????????????- name: BLOB_ENDPOINT_SUFFIX ??????????????valueFrom: ????????????????configMapKeyRef: ??????????????????name: mlnet-config ??????????????????key: BLOB_ENDPOINT_SUFFIX ????????restartPolicy: Always - apiVersion: v1 ??kind: Service ??metadata: ????labels: ??????app.name: mlnet ????name: mlnet-webapi-service ??spec: ????type: LoadBalancer ????ports: ??????- name: "expose-80" ????????port: 80 ????????targetPort: 80 ????selector: ??????app.name: mlnet kind: List metadata: {} |
通過kubectl客戶端命令,可以查看我們的API是否已經部署成功:
然后,使用mlnet-webapi-service服務的EXTERNAL-IP地址,對API進行測試:
已經得到預測結果,API部署和調用成功。
本系列文章一共四個部分,首先介紹了機器學習的基本概念,然后介紹了基于ML.NET的機器學習案例以及訓練模型生成、RESTful API的開發,最后簡要介紹了基于Azure DevOps實現持續集成、持續部署以及Azure Kubernetes Service k8s集群部署的過程。本系列文章也是我在Microsoft Global Azure Bootcamp 2019上海站活動中所分享的內容。整個案例的源代碼可以從Github下載:https://github.com/daxnet/mlnet-trainer。
原文地址:https://sunnycoding.cn/2019/05/15/mlnet-containerize-and-azure-devops-practices-part4/
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从阿里中台战略看企业IT架构转型之道(上
- 下一篇: ML.NET机器学习、API容器化与Az