【问题标题】:DevOps Pipeline Automation - Infrastructure and Application deploymentDevOps 管道自动化 - 基础设施和应用程序部署
【发布时间】:2020-06-28 09:05:31
【问题描述】:

我在使用 Azure DevOps 管道

的以下场景中遇到了实施问题
  1. 使用 ARM 模板在 Azure 订阅中提供两个资源
    • Azure 容器注册表
    • Azure Kubernetes 服务
  2. 将容器化的应用程序代码部署到 Kubernetes 集群

我能够在单个管道中执行这两个步骤。在将两条管道合并/集成为一个时需要一些帮助。

如何在流程中不进行任何人工干预的情况下自动执行上述两个步骤。该过程必须足够健壮,才能在上一步中创建的同一 ACR 和 AKS 中处理应用程序部署?

基础架构和应用程序代码都驻留在同一个 GIT/Azure 存储库中。

【问题讨论】:

    标签: azure azure-devops azure-aks azure-container-registry azure-yaml-pipelines


    【解决方案1】:

    首先。我建议您不要将两条管道捆绑在一起。

    虽然基础设施即代码很重要并且应该被使用。出于许多充分的原因,将基础架构供应与应用供应分离很重要。

    根据您的要求,您应该有一个创建 ACR/AKS 的任务,一个任务获取要在另一个任务中使用的凭据,该任务将部署到创建的 AKS 和 ACR 的矿石

    流程可以。

    ACR —AKS(如果您想通过 ACR 集成配置 AKS,则需要将它们按顺序排列)- docker build/push to ACR — 使用带有 KubeCTL 的 shell 脚本部署容器,利用第二步的凭据。

    【讨论】:

      【解决方案2】:

      您可以在一个 yaml 管道中使用multiple stages。看下面的简单例子:

      yaml 管道下面有两个阶段。第一阶段执行配置基础架构的任务。第二阶段是dependsOn第一阶段,在变量中定义了ACR和AKS,然后做任务部署到Kubernetes集群。

      trigger: 
      - master
      
      stages:
      - stage: Infrastructure Deployment
        pool:
          vmImage: windows-latest 
        jobs:
        - job: Infrastructure
          steps:
      
          - task: AzureResourceManagerTemplateDeployment@3
            inputs:
            .....
      
      - stage: Application Deployment
        dependsOn: Infrastructure Deployment
        pool: 
          vmImage: windows-latest
        variables: 
          ACRName: "ACRName"
          AKSName: "ACRName"
          azureSubscriptionEndpoint: ..
          azureContainerRegistry: ..
          azureResourceGroup: ..
        jobs:
        - job: Application
          steps:
      
          # - task: Docker@2
          #   inputs:  
          #     containerRegistry: $(ACRName)
          #     ...
      
          - powershell: |
              # Log in to Docker with service principal credentials
              docker login $(ACRName).azurecr.io --username $SP_APP_ID --password $SP_PASSWD
              docker build
              docker push
      
          - task: Kubernetes@1
            displayName: kubectl apply
            inputs:
              connectionType: Azure Resource Manager
              azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
              azureResourceGroup: $(azureResourceGroup)
              kubernetesCluster: $(AKSName)
              ....
      

      更新:动态捕获 ACR 和 AKS 名称以及 ACR 登录凭据

      您可以使用azure powershell task 获取以上数据。要使用 azure powershell 任务,您需要创建一个azure resource manager service connection

      然后您可以在任务中编写自定义内联脚本。见下例:

          - task: AzurePowerShell@5
            name: AzurePowershell
            inputs:
              azureSubscription: 'Microsoft Azure Internal Consumption (daaeef3e-d7fe-49e8-baaa-b3df9d072825)'
              ScriptType: InlineScript
              Inline: |
                $json = (Get-Content "$(system.defaultworkingdirectory)\template.json" -Raw) | ConvertFrom-Json
                
                $AKS = $json.resources | where {$_.type -eq "Microsoft.ContainerService/managedClusters"} | select name
                $ACR = $json.resources | where {$_.type -eq "Microsoft.ContainerRegistry/registries"} | select name
                
                echo "##vso[task.setvariable variable=ACRName;isOutput=true]$($ACR.name)"
                echo "##vso[task.setvariable variable=AKSName;isOutput=true]$($AKS.name)"
                
                $ACRCred = Get-AzContainerRegistryCredential -ResourceGroupName "MyResourceGroup" -Name $($ACR.name)
                
                echo "##vso[task.setvariable variable=UserName;isOutput=true]$($ACRCred.Username)"
                echo "##vso[task.setvariable variable=Password;isOutput=true]$($ACRCred.Password)"
               
              azurePowerShellVersion: LatestVersion
      

      接下来就可以参考stageDependencies.stageName.jobName.outputs['stepName.variableName']获取这些变量了

      请参阅here 了解更多 azure powershell cli。

      【讨论】:

      • 有没有办法动态捕获 ACR 和 AKS 名称以及 ACR 登录凭据,可以将其传递到管道的应用程序部署阶段?
      • 嗨 @programmerP 您可以使用 azure powershell 任务在 template.json 中获取资源的名称。并使用 logging 命令将值设置为输出变量。请查看以上更新:
      猜你喜欢
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2022-11-14
      • 2016-11-11
      • 2017-11-21
      • 1970-01-01
      相关资源
      最近更新 更多