ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

栏目: 编程工具 · 发布时间: 4年前

内容简介:(总访问量:19;当日访问量:19)

通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行详细介绍,而对于Azure DevOps配置的详细步骤,我不会做太多注解,大家可以参考我前面写的《 ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署 》系列文章。

在使用Azure DevOps进行CI/CD之前,首先来了解一下整个开发部署的架构拓扑,下图展示了基于Azure DevOps进行持续集成和持续部署的架构拓扑:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

我们首先使用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的配置:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

在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的配置

以下是本案例的Release Pipeline的配置:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

在Artifacts设置中,会从Build Pipeline将训练模型文件和部署文件复制过来,接下来,在Publish Model to Azure Blob stage中,会将训练模型复制到Azure Blob Storage中,这里使用的是Azure File Copy任务,我们只需要将Azure Subscription的信息以及Azure Blob Storage的连接信息填入即可。

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

在Kubernetes Deployment job中,使用Deploy to Kubernetes任务,即可快速方便地将ASP.NET Core RESTful API方便地部署到Azure Kubernetes Services托管的k8s集群中。需要注意的是,由于RESTful API需要访问Azure Blob Storage来读取机器学习的训练模型(这一点在上一讲已经提到过),因此,在这里就要将访问Blob Storage的连接信息通过ConfigMap配置到k8s集群中:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与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: {}

测试已部署的RESTful API

通过kubectl客户端命令,可以查看我们的API是否已经部署成功:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

然后,使用mlnet-webapi-service服务的EXTERNAL-IP地址,对API进行测试:

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

已经得到预测结果,API部署和调用成功。

总结

本系列文章一共四个部分,首先介绍了机器学习的基本概念,然后介绍了基于ML.NET的机器学习案例以及训练模型生成、RESTful API的开发,最后简要介绍了基于Azure DevOps实现持续集成、持续部署以及Azure Kubernetes Service k8s集群部署的过程。本系列文章也是我在Microsoft Global Azure Bootcamp 2019上海站活动中所分享的内容。整个案例的源代码可以从Github下载: https://github.com/daxnet/mlnet-trainer

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

(总访问量:19;当日访问量:19)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂的站长

疯狂的站长

温世豪 / 清华大学出版社 / 2010年05月 / 29.00元

受全球性金融危机的影响,就业变得越来越困难,众多青年,包括大学毕业生,无不感到就业的巨大压力,站长这一职业不但创业门槛低,而且还自由自在。其实,搭建一个网站是相当简单的,但要成为一名成功的站长则不那么容易。 本书作者是一名站长,从事互联网相关工作已十余年,自已也在经营一个知名网站,积累了大量网站运营经验。作者结合自身真实的“疯狂”创业经历,以平实、通俗的语言讲述如何从零开始起步,最终成为一名......一起来看看 《疯狂的站长》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具