使用 Azure Pipelines 生成并部署到 Azure Kubernetes 服务

Azure DevOps Services

使用 Azure Pipelines 自动部署到 Azure Kubernetes 服务(AKS)。 Azure Pipelines 允许您使用 Azure DevOps 通过持续集成(CI)和持续交付(CD)进行生成、测试和部署。

本文介绍如何创建一个持续生成和部署应用的管道。 每当你更改包含 Dockerfile 的存储库中的代码时,都会将映像推送到 Azure 容器注册表,然后将清单部署到 AKS 群集。

先决条件

获取代码

创建包含示例应用程序和 Dockerfile 的以下存储库的分支:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

创建 Azure 资源

使用 Azure CLI 登录到 Azure 门户

创建容器注册表

# Create a resource group
az group create --name myapp-rg --location chinaeast2

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

登录到 Azure Pipelines

登录到 Azure Pipelines。 登录后,浏览器会转到 https://dev.azure.com/my-organization-name 并显示 Azure DevOps 仪表板。

在所选组织中,创建 个项目。 如果组织中没有任何项目,则会显示“创建项目并开始使用”屏幕。 若未显示,请选择仪表板右上角的“创建项目”按钮。

创建管道

连接并选择存储库

  1. 登录到你的 Azure DevOps 组织,并转到你的项目。

  2. 转到“管道”,然后选择“新建管道”。

  3. 完成向导中的各个步骤。首先选择“GitHub”作为源代码位置。

  4. 可能会重定向到 GitHub 进行登录。 如果是这样,请输入 GitHub 凭据。

  5. 看到存储库列表时,请选择你的存储库。

  6. 你可能会被重定向到 GitHub 来安装 Azure Pipelines 应用。 如果是,请选择“批准并安装”。

  7. 选择“部署到 Azure Kubernetes 服务”。

  8. 如果出现提示,请选择在其中创建了注册表和群集的订阅。

  9. 选择 myapp 群集。

  10. 对于“命名空间”,请选择“现有”,然后选择“默认”。

  11. 选择你的容器注册表名称。

  12. 可将映像名称保留默认设置。

  13. 将服务端口设置为 8080。

  14. 设置“ 为拉取请求启用审阅应用 ”复选框,以便在后续步骤中自动生成的管道 YAML 中包括 与评审应用 相关的配置。

  15. 选择“Validate and configure”。

    在 Azure Pipelines 创建管道的过程中,将会:

    • 创建一个 Docker 注册表服务连接,使管道能够将映像推送到容器注册表中。

    • 创建一个环境,并在该环境中创建一个 Kubernetes 资源。 对于启用了 RBAC 的群集,创建的 Kubernetes 资源将在该群集中隐式创建 ServiceAccount 和 RoleBinding 对象,这样,创建的 ServiceAccount 就无法在所选命名空间之外执行操作。

    • 生成一个 azure-pipelines.yml 文件用于定义管道。

    • 生成 Kubernetes 清单文件。 这些文件是通过根据您所做的选择填充 deployment.ymlservice.yml 模板生成的。 准备就绪后,选择“保存并运行”。

  16. 选择“保存并运行”。

  17. 可将“提交消息”更改为类似于“将管道添加到我们的存储库”的内容。 准备就绪后,选择“保存并运行”以将新管道提交到存储库中,然后开始首次运行新管道!

查看应用部署

管道运行后,请依次观察生成阶段和部署阶段,管道的状态将从蓝色(正在运行)变为绿色(已完成)。 可以选择阶段和作业来观察管道的运作方式。

备注

如果你正在使用 Microsoft 托管的代理,则必须将 Microsoft 托管代理的 IP 范围添加到防火墙。 从 每周 JSON 文件(每周三发布)获取 IP 范围的每周列表。 新的 IP 范围将在下周一开始生效。 有关详细信息,请参阅 Microsoft托管代理。 若要查找 Azure DevOps 组织所需的 IP 范围,请了解如何 识别Microsoft托管代理的可能 IP 范围

管道运行完成后,浏览发生的情况,然后查看部署的应用。 在管道摘要中:

  1. 选择“环境”选项卡。

  2. 选择“查看环境”。

  3. 选择部署到的命名空间的应用实例。 如果使用了默认值,则它是默认命名空间中的 myapp 应用。

  4. 选择“服务”选项卡。

  5. 选择外部 IP 地址并将其复制到剪贴板。

  6. 打开新的浏览器标签页或窗口并输入“<IP 地址>:8080”。

如果你正在生成我们的示例应用,则浏览器中会显示“Hello world”。

管道如何生成

在你选择完选项并继续验证和配置管道后,Azure Pipelines 会使用“部署到 Azure Kubernetes 服务”模板为你创建一个管道。

生成阶段使用 Docker 任务 生成映像并将其推送到 Azure 容器注册表。

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
          
    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

部署作业使用 Kubernetes 清单任务创建所需的 ,供 Kubernetes 群集节点从 Azure 容器注册表资源中拉取映像。 然后,Kubernetes 清单任务使用清单文件部署到 Kubernetes 群集。 清单文件 service.ymldeployment.yml 是在您使用 “部署到 Azure Kubernetes 服务” 模板时生成的。

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@1
            displayName: Create imagePullSecret
            inputs:
              action: 'createSecret'
              connectionType: 'kubernetesServiceConnection'
              kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
              secretType: 'dockerRegistry'
              secretName: '$(imagePullSecret)'
              dockerRegistryEndpoint: '$(dockerRegistryServiceConnection)'

          - task: KubernetesManifest@1
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: 'deploy'
              connectionType: 'kubernetesServiceConnection'
              kubernetesServiceConnection: 'myapp-default' #customize for your Kubernetes service connection
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              containers: '$(containerRegistry)/$(imageRepository):$(tag)'
              imagePullSecrets: '$(imagePullSecret)'

清理资源

每当处理完所创建的资源后,都可以使用以下命令将其删除:

az group delete --name myapp-rg

出现提示时输入 y