介绍

创建每个资源(AKS、ACR)后,可以使用 kubectl 命令轻松执行到 AKS 的部署。在实际开发中,如果你懒得敲命令来执行部署,你将无法快速释放该功能。因此,最好实施 CI/CD 管道以自动部署到 AKS。在本文中,我们将使用 Azure Pipeline 和 Github 自动将 docker 容器部署到 AKS。

为 Azure Kubernetes 服务和 Azure 容器注册表创建资源。

下面描述如何创建每个资源。

尝试将容器化的 Spring Boot 应用程序部署到 Azure Kubernetes 服务 - Qiita

创建 Azure DevOps

创建项目

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

添加服务连接

为了从 Azure DevOps 访问 Azure 资源,需要为每个资源创建一个服务连接。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

添加 Docker Container Registry 服务连接

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

如果在注册表类型中选择 Azure 容器注册表,将显示另一个弹出窗口。如果您在浏览器中阻止弹出窗口,它们将不会出现,因此您需要更改设置。此外,如果弹出窗口没有出现,即使它没有被阻止,更新浏览器可能会解决问题。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

从弹窗中,如果可以成功登录Azure,Azure端的订阅和ACR资源会显示在订阅和Azure容器注册表的下拉菜单中。选择任何项目,确定服务连接名称,然后注册。

为 Azure Kubernetes 服务添加服务连接

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

创建 Azure 管道

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

在这种情况下,我们将与 Github 一起设置一个 Azure Pipeline,以便在将新代码推送到特定分支时运行。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

如果 Github 和 Azure Pipeline 没有链接,您将被自动重定向到 Github 的 OAuth 页面,因此请授予请求的访问权限。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

与 Github 成功链接后,选择任意一个仓库。此演示中的应用程序与上一篇文章中创建的 Spring Boot 应用程序相同,将容器化的 Spring Boot 应用程序部署到 Azure Kubernetes 服务。实际的 Github 存储库在这里 →https://github.com/ryuichi-f/deploy-aks

k8s/deployaks-app-depl.yml 中只有一处更改。向 spec.template.spec.containers.image 添加了 azure 容器注册表 URL 和图像名称。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployaks-app-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deployaks-app
  template:
    metadata:
      labels:
        app: deployaks-app
    spec:
      containers:
        - name: deployaks-app
          image: nicetestacr.azurecr.io/deploy-aks # <- 変更

---
apiVersion: v1
kind: Service
metadata:
  name: deployaks-app-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: deployaks-app
  ports:
    - name: deployaks-port
      protocol: TCP
      port: 80
      targetPort: 8080

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

由于是选择管道 YAML 模板,所以选择最简单的 Starter 管道。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

将以下代码粘贴到管道 YAML 中。然后点击“保存并运行”。

trigger:
- main

variables:
  ACRServiceConnection: 'niceTestACRServiceConnection'
  AKSServiceConnection: 'niceTestAKCServiceConnection'
  dockerRegistryURL: 'nicetestacr.azurecr.io'
  imageRepo: deploy-aks
  tag: '$(Build.BuildId)'

stages:
  - stage: build_image
    displayName: build an image
    jobs:

      - job: build_container_image_job
        pool:
          vmImage: ubuntu-latest
        steps:

        - task: Docker@2
          inputs:
            containerRegistry: $(ACRServiceConnection)
            repository: '$(imageRepo)'
            command: buildAndPush
            Dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
            buildContext: '$(Build.SourcesDirectory)'
            tags: |
              $(tag)

      - job: publish_k8s_manifest_files_job
        pool:
          vmImage: ubuntu-latest
        steps:
          - task: PublishPipelineArtifact@1
            inputs:
              targetPath: '$(Pipeline.Workspace)/s/k8s'
              artifact: 'manifests'
              publishLocation: 'pipeline'

  - stage: deploy_container
    dependsOn: build_image
    displayName: deploy a container
    jobs:

      - job: deployment_job
        pool:
          vmImage: ubuntu-latest
        variables:
          aksSecretName: testAKSSecretName
        steps:

        - task: DownloadPipelineArtifact@2
          inputs:
            buildType: 'current'
            artifactName: 'manifests'
            targetPath: '$(Pipeline.Workspace)/manifests'

        - task: KubernetesManifest@0
          inputs:
            action: 'deploy'
            kubernetesServiceConnection: $(AKSServiceConnection)
            namespace: 'default'
            containers: |
              $(dockerRegistryURL)/$(imageRepo):$(tag)
            manifests: |
              $(Pipeline.Workspace)/manifests/deployaks-app-depl.yml

Pipeline YAML 各部分的描述

trigger:
- main

将代码推送到trigger 指定的分支时执行 Azure 管道。

variables:
  ACRServiceConnection: 'niceTestACRServiceConnection'
  AKSServiceConnection: 'niceTestAKCServiceConnection'
  dockerRegistryURL: 'nicetestacr.azurecr.io'
  imageRepo: deploy-aks
  tag: '$(Build.BuildId)'

您可以使用variables 定义要在管道上使用的变量。变量的范围根据定义它的层次结构而变化。这次我们将它定义在最高层次结构中,因此我们可以从所有层次结构中访问该变量。

stages:
    - stage: build_image
    # 以下省略...
    - stage: deploy_container
    # 以下省略...

在 Azure 管道中,可以分阶段定义每个流程。从广义上讲,共有三种类型:stagejobstep。其中stage对应最高层级划分。这次,我们定义了两个阶段,build_image 阶段和 deploy_container 阶段。

 jobs:
      - job: build_container_image_job
      # 以下省略...
      - job: publish_k8s_manifest_files_job
      # 以下省略...

job 对应于在stage 的部门内进一步划分的部门。每个job 与一个单独的agent 并行运行。

steps:
    - task: DownloadPipelineArtifact@2
    # 以下省略...
    - task: KubernetesManifest@0
    # 以下省略...

step 对应于job 部门中的进一步部门。每个step 从上到下依次执行。

- task: Docker@2
          inputs:
            containerRegistry: $(ACRServiceConnection)
            repository: '$(imageRepo)'
            command: buildAndPush
            Dockerfile: '$(Build.SourcesDirectory)/Dockerfile'
            buildContext: '$(Build.SourcesDirectory)'
            tags: |
              $(tag)

Docker@2 是构建镜像并将其推送到容器注册表的任务。

  • containerRegistry:为 Azure 容器注册表指定服务连接
  • repository:指定 docker dockrt 镜像的存储库名称
  • 命令:指定 Docker@2 命令。可能的命令是:
    • “buildAndPush”|“构建”|“推送”|“登录”|“注销”|
  • Dockerfile:指定 Dockerfile 的位置。
  • buildContext:指定 docker 镜像的构建上下文。
  • tags:指定 docker 镜像的标签。多个可以指定为列表。
 - task: PublishPipelineArtifact@1
            inputs:
              targetPath: '$(Pipeline.Workspace)/s/k8s'
              artifact: 'manifests'
              publishLocation: 'pipeline'

PublishPipelineArtifact@1 是将指定的工件(文件等)上传到特定文件夹的任务。上传的工件可以通过DownloadPipelineArtifact@2 任务下载到另一个stage 并使用。

  • 输入:
    • targetPath:指定工件的位置。
    • artifact:指定任意名称以引用该工件。
    • publishLocation:指定要上传到的任何文件夹的名称。
- task: DownloadPipelineArtifact@2
          inputs:
            buildType: 'current'
            artifactName: 'manifests'
            targetPath: '$(Pipeline.Workspace)/manifests'

用于下载PublishPipelineArtifact@1 上传的工件的任务。

  • 输入:
    • buildType:指定工件源的类型。可能的类型有:
      • “当前”|“特定”
    • artifactName: PublishPipelineArtifact@1 指定指定工件的名称。
    • targetPath:指定上传工件的位置。
- task: KubernetesManifest@0
          inputs:
            action: 'deploy'
            kubernetesServiceConnection: $(AKSServiceConnection)
            namespace: 'default'
            containers: |
              $(dockerRegistryURL)/$(imageRepo):$(tag)
            manifests: |
              $(Pipeline.Workspace)/manifests/deployaks-app-depl.yml

将 k8s 清单文件部署到 k8s 集群的任务。

  • 输入:
    • action:共有 8 种可能的操作。根据指定的操作,之后可以指定的输入类型将发生变化。这一次,指定“部署”操作。可能的行动是:
      • 'deploy' | 'promote' | 'reject' | 'createSecret' | 'bake | scale' |
    • 命名空间:指定 k8s 命名空间。
    • 容器:**在 k8s 清单文件中spec.template.spec.containers.image指定一个 URL 以替换该部分中的 docker 图像 URL。
    • manifest:指定k8s清单文件的位置。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。
Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

Azure 管道检测到 Github 存储库中的新提交并自动执行管道。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

当所有阶段和作业都变为绿色复选标记时,管道已成功运行。从现在开始,每当新代码推送到主分支时,都会执行管道并部署应用程序。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

可以在 AKS 资源的“服务和入口”下找到实际部署的应用程序的 IP 地址。

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

检查您的服务以查看您的负载平衡器的 EXTERNAL-IP。这次的公网IP是20.18.213.108,所以http://20.18.213.108/hello-world您可以使用以下命令访问您的 Spring Boot 应用程序

Azure Kubernates ServiceへのdockerコンテイナーのデプロイメントをAzure DevOps Pipelineで自動化してみる。

结尾

我们成功地使用 Azure Pipeline 自动部署 Docker 容器。在 Pipeline YAML 中配置 CI/CD 后,后续部署是无缝的,可实现快速的功能发布。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308629606.html

相关文章:

  • 2021-09-17
  • 2021-07-12
  • 2021-07-05
  • 2021-09-25
  • 2021-11-11
  • 2021-12-04
  • 2021-04-20
猜你喜欢
  • 2020-10-22
  • 2022-12-23
  • 2021-06-18
  • 2022-12-23
  • 2021-11-29
  • 2021-08-13
  • 2021-05-10
相关资源
相似解决方案