中国大搞建设,温州做网站优化,美空摄影网,工商服务网通过上文所介绍的内容#xff0c;我们已经完成了RESTful API的开发#xff0c;现在#xff0c;就可以使用Azure DevOps来进行持续集成#xff08;CI#xff09;和k8s持续部署#xff08;CD#xff09;了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行… 通过上文所介绍的内容我们已经完成了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 jobBuild 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: v1items:- 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: mlnetkind: Listmetadata: {}通过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