标题很对仗,目的很明确,蹭热度!!!前天看了 A 站的童鞋搞了一个,今儿我换个姿势用软 A 也搞一个。Azure Container Instance 服务是一种无服务器化的容器解决方案。ACI 服务是一个完全托管的容器服务,客户不需要搭建和维护容器计算集群(如用 VM 去搭建 Swarm 或者 Kubernetes ),客户管理视图和颗粒度在容器,可以直接进行容器消费,创建删除容器,并且按照容器分配的 CPU 和 内存资源的占用时间进行收费,并且容器生命周期跳转是非常快速的,可以快速的删除、创建容器。为了方便用户顺应客户的使用和操作习惯,ACI 服务可以与现有的 K8S 集成,注册为虚拟的 K8S compute agent node,是用户可以沿用现有的工具方法来调度使用云端的计算资源。容器正在变成对云应用程序执行打包、部署和管理操作的首选方式,今天我们就来一起了解一些如何通过 Virtual Studio Team Service + ACI 服务实现应用的CI/CD。

先来看一下整体的架构图:

AZURE ACI -- 无服务器化容器解决方案

 下面我们来分几个部分来介绍整个架构的实现:

  • 在 GitHub 上准备演示所需要的 Code Source Repo
  • 准备 Azure Container Registry
  • VSTS 中以 Github 为 Code Souce 创建 CI 任务,将 Build 打包发布到 Azure Container Registry
  • VSTS 中 创建 CD 任务,将 Build 的最新版本发布到 Azure Container Instance 服务中部署实施
  • 检查发布结果,模拟 Code Commit,查看 CI/CD 过程

开搞!

第一步:在 GitHub 中准备 Code Source Repo

       为了大家快速上手理解方便,本示例中 Code Source Repo 采用 Github,VSTS 服务内部也支持Git Repo,用户也可以选择讲 Code Control 这部分也托管给 VSTS 服务。所有 Code Source 大家可以到 https://github.com/nonokangwei/vstscicddemo 查阅。童鞋们自行准备自己的 Repo 这里不做赘述。

第二部:创建 Azure Container Registry

       登入 Azure Portal,选择 Azure Container Registry 服务,并创建

AZURE ACI -- 无服务器化容器解决方案

        输入 Registry 名称,输入资源组名称,开启 Admin User, 点击创建

AZURE ACI -- 无服务器化容器解决方案

 

第三步:VSTS 中以 Github 为 Code Souce 创建 CI 任务,将 Build 打包发布到 Azure Container Registry

        登入 VSTS,创建新项目

AZURE ACI -- 无服务器化容器解决方案

     选择 New Project

AZURE ACI -- 无服务器化容器解决方案

        进入创建的 Project,选择 Build and Release --> Builds

AZURE ACI -- 无服务器化容器解决方案

       选择 New Builds

AZURE ACI -- 无服务器化容器解决方案

      选择 GitHub 作为 Code Source,填入自己 Code Repo 的信息

AZURE ACI -- 无服务器化容器解决方案

选择 Empty Process 模板

AZURE ACI -- 无服务器化容器解决方案

选择 Agent queue 为 Hosted Linux,Agent 扮演 Worker 的角色来执行 Build 任务,VSTS 已经内置了托管的 Agent,本示例中以 Build Linux 环境的 Docker 为例,所以这里选择 Hosted Linux。

AZURE ACI -- 无服务器化容器解决方案

点击保存后,开始添加 Build Task

AZURE ACI -- 无服务器化容器解决方案

添加 Command Line Task,原生托管的 Linux Agent 内没有安装 Docker,所以我们需要借助 Command Task 来定制化托管 Agent 的 Runtime

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

1 echoinstall docker-ce”
2 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
3 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
4 echo “apt-get update”
5 apt-get update
6 sudo apt-get install -y docker-ce

添加 Dokcer Build Task

AZURE ACI -- 无服务器化容器解决方案

        选择 Container Registry Type 为 Azure Container Registry,选择第二步创建 ACR 所使用的订阅,选择前面创建的 ACR, Action 选择 Build an Image,指定 Github Repo 中的 Dockerfile,Image Name 输入 YourImageName:$(Build.BuildId),并勾选 Include Latest Tag。通过此步完成 CI 中 Build Docker Image 的工作。

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        添加 Task,Dokcer Build Task

AZURE ACI -- 无服务器化容器解决方案

        选择 Container Registry Type 为 Azure Container Registry,选择第二步创建 ACR 所使用的订阅,选择前面创建的 ACR, Action 选择 Push an Image,指定 Github Repo 中的 Dockerfile,Image Name 输入 YourImageName:$(Build.BuildId),并勾选 Include Latest Tag。通过此步完成 CI 中 Push Docker Image 到 ACR 的工作。

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        选择 Trigger,开启 Enable continuous integration

AZURE ACI -- 无服务器化容器解决方案

 

点击 Save & queue 保存

第四步:VSTS 中 创建 CD 任务,将 Build 的最新版本发布到 Azure Container Instance 服务中部署实施

        选择 Build and Release --> Releases

AZURE ACI -- 无服务器化容器解决方案

        创建 Release Defination,选择 Empty Process

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        添加 Artifacts,选择 Source Type Build,选择前面创建的 VSTS Project,选择前面创建的 Build Defination。通过此步定义 CD Pipline,将 CD 与 CI Link 在一起。

AZURE ACI -- 无服务器化容器解决方案

        开启 Continuous deployment trigger

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        添加 CD Task, 选择 Tasks,点击添加

AZURE ACI -- 无服务器化容器解决方案

        选择  Check out our Marketplace, 选择 Replace Tokens 插件并安装

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        添加 Replace Token Task,指定 Root Directory 为 Github Source Repo 中的 armtemplate 目录, target files 设置为 **/*.json。CD 过程在部署中由于 VSTS 还没有原生的和 ACI 服务的集成,所以这里面选择 Azure Resource Template 部署方式,将 CD 部署通过 Azure Resource Template 来描述,Template 中需要从 CI 过程中抓取参数,此步是通过 Replace Token 插件在参数 json 文件中进行动态传参的效果。

AZURE ACI -- 无服务器化容器解决方案

        添加 Azure Deployment Task,选择目标 CD 要部署 ACI 所在的 Azure 订阅,选择 Action 为 Create or Update resource group,指定目标部署资源组,指定目标部署区域,Template 选择 Github Code Souce Repo 中 armtemplate 目录下的 azuredeploy.json,Template parameters  选择 Github Code Souce Repo 中 armtemplate 目录下的 azuredeploy.parameters.json

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        选择 Variables,添加 Process variables,image 名称按照前面 CI Build 中的命名进行填写,imagePassword,imageRegistryLoginServer,imageUsername 从Azure Portal 中找到前面创建的 ACR 资源中获取。

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        点击 Save 保存。

第五步:检查发布结果,模拟 Code Commit,查看 CI/CD 过程

        登入 Github,在 Code Source Repo 中模拟创建一个 Empty 文件并 Commit,在 VSTS 中查看 CICD Pipeline。 

AZURE ACI -- 无服务器化容器解决方案

AZURE ACI -- 无服务器化容器解决方案

        登入 Azure Portal,查看 Azure container Instance 服务中已经发布了容器服务,并浏览器模拟访问登陆。

AZURE ACI -- 无服务器化容器解决方案

 AZURE ACI -- 无服务器化容器解决方案

        修改 Github Code Source Repo 中 webpage 目录下的 index.html,<title>Welcome to Azure Container Instances!</title> 替换为 <title>CICD with Azure Container Instances!</title> ,<h1>Welcome to Azure Container Instances!</h1> 替换为 <h1>CICD with Azure Container Instances!</h1> 并 Commit 提交。重新访问站点,查看页面更新。

AZURE ACI -- 无服务器化容器解决方案

        好啦,我们实现 VSTS 和 ACI 服务的整合来实现基于无服务器架构的容器应用 CI/CD。心动不如行动,赶紧动手吧。

相关文章: