Рубрики
Uncategorized

Azure Container Consicer Группа Непрерывное развертывание

В экземпляре Container с использованием Azure с несколькими контейнерами я представил использование YAML или JSON B … Теги с Azure, Docker, DEVOPS, CICD.

В экземпляре с использованием Azure Container с несколькими контейнерами я ввел использование файла AND на основе YAML или JSON для развертывания нескольких контейнеров в группе экземпляров Azure Container. Давайте посмотрим, как мы можем автоматизировать это развертывание в непрерывной цепочке развертывания.

В этом примере я буду использовать приложение на основе веб-интерфейса и API Backend. Чтобы развернуть этот вид услуг, вам придется создать DockerFile как для интерфейса, так и для Backend, нажимайте два изображения в реестре, создайте файл yaml или ARM JSON и развернуть группу экземпляров Azure Container.

Но как вы можете обновить изображения контейнеров и/или настройки контейнеров после начального развертывания? К счастью, два метода развертывания, создания контейнера AZ и New-AzresourceGrupDeploblement, будут обновлять только ресурсы, если существует разница между YAML или файлом json и то, что развернуто на Azure.

Чтобы автоматизировать процесс, я буду использовать Azure DevOps с трубопроводом YAML. Есть две важные задачи:

  • Первый — создать изображения Docker и подтолкнуть их к реестру
  • Второй — развернуть контейнерную группу в Azure.

Перед записью вашего Azure-Pipeline.yml необходимо создать подключение служб. Службы Соединения в Azure DEVOPS позволяют подключаться к услуге, такому как реестр Docker, ресурс Azure, используя идентификатор, управляемую по трубопроводу. Использование сервисного соединения предотвращает хранение конфиденциальной информации, такую как сервисные клавиши и пароли в вашем репозитории.

Для Mazure Resource Manager вам нужно будет создать принцип услуги, личность для доступа к вашему ресурсу в Azure. Принципал службы будет использоваться для предоставления доступа к группе ресурсов, где вы планируете развернуть объект группы экземпляров контейнера.

$ResourceGroupName = "omc-lab-aci"

$ServicePrincipal = New-AzADServicePrincipal -DisplayName "ACI-demo-sp" -SkipAssignment 

New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $ServicePrincipal.ApplicationId -ResourceGroup $ResourceGroupName

Теперь вам необходимо извлечь принцип приложения сервиса, секрет и идентификатор арендатора

$SecureStringBinary = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($servicePrincipal.Secret)
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($SecureStringBinary)

Чтобы создать сервисное соединение в вашем проекте Azure DevOps. Откройте настройки проекта, перейдите на трубопроводы и нажмите на сервисные соединения. Нам нужны два сервисных подключения, один реестр Docker и один менеджер ресурсов Azure.

Для менеджера ресурсов Azure, выберите Директор Сервиса

Выберите подписку на уровень объема, введите идентификатор подписки и имени, идентификатор приложения в поле «Основным идентификатором службы», «Основной ключ услуг» и «TENANTID». Нажмите на проверку и сохраните

Для реестра Azure Container повторите процесс, но вам нужно будет выбрать реестр Docker вместо менеджера ресурсов Azure.

Выберите реестр Azure Container, вашу подписку и ваш реестр

Мастер создает руководитель обслуживания и присваивает роль участника в вашем реестре.

Теперь, когда у вас есть два сервисных подключения, вы можете начать создавать свой трубопровод. В корне вашего репозитория создайте лазурный трубопровод .Мам.

Трубопровод должен начать каждый раз, когда мы обновляем основную ветку, используя репозиторий Azure DEVOPS.

trigger:
- master

resources:
- repo: self

Чтобы облегчить вашу работу, вы можете создать некоторые переменные.

variables:

  dockerRegistryServiceConnection: 'omcdockerreg01'
  azureARMServiceConnection: 'ACR-Connection'
  imageRepository: 'demoaci'
  containerRegistry: 'myacr.azurecr.io'
  aciManifestTemplateFile: '$(Build.SourcesDirectory)/deploy-aci.yaml'
  aciManifestFile: '$(Build.SourcesDirectory)/deploy.yaml'
  resourceGroupName: 'myresourcegroup'
  tag: '$(Build.BuildId)'

Два сервисных соединения, root root root rocer rocker, uri, группа ресурсов для развертывания. Файл манифеста шаблона, который будет использоваться во время развертывания, создайте файл deploy.yaml (acimanifestfile) с использованием значения тега. Вам может понадобиться пароль для реестра контейнеров Azure. Это будет действительно плохое представление о сохранении его манифеста шаблона файла. Вместо этого вы можете использовать секретную переменную для вашего трубопровода. Вам нужно открыть Azure DEVOPS, перейдите в трубопроводы, а затем выберите трубопроводы. Если нет трубопровода, вам нужно будет сохранить ваши Azure-Pipelines.yml файл, совершить вашу работу и нажмите на Azure DEVOPS. Вы увидите ваш трубопровод после этого. Выберите свой конвейер, а затем нажмите кнопку «Редактировать» на верхней правой стороне. Нажмите на переменные и добавьте новую секретную переменную с именем AcrSecret.

Вам нужно создать файл шаблона манифеста.

apiVersion: 2018-10-01
location: westeurope
name: azuredemoaci
type: Microsoft.ContainerInstance/containerGroups
properties:
  osType: Linux
  ipAddress:
    type: Public
    dnsNameLabel: azuredemoaci-omc01
    ports:
    - protocol: tcp
      port: '8000'
  imageRegistryCredentials:
  - server: myacr.azurecr.io
    username: Username
    password: %ACRPASS%
  restartPolicy: Always
  containers:
    - name: omcdemoaci-front
      properties:
        image: myacr.azurecr.io/demoaci/omcdemoaci-front:%TAG%
        command: ['pwsh', '/entrypoint.ps1']
        ports:
          - port: 8000
        resources:
          requests:
            cpu: 1.0
            memoryInGB: 1.0
    - name: omcdemoaci-api
      properties:
        image: myacr.azurecr.io/demoaci/omcdemoaci-api:%TAG%
        command: ['pwsh', '/entrypoint.ps1']
        resources:
          requests:
            cpu: 1.0
            memoryInGB: 1.0

Обратите внимание, что пароль реестра был заменен на% Acrpass%, а также тег для изображения с% TAG%

Чтобы создать свой последний файл развертывания, вам понадобится скрипт для замены этих значений. Я сделал простой скрипт PowerShell для выполнения этой задачи.

[cmdletbinding()]
param (
    [Parameter(Mandatory=$false)]
    [String]
    $TemplateManifestFilePath=[Environment]::GetEnvironmentVariable('ACIMANIFESTTEMPLATEFILE'),

    [Parameter(Mandatory=$false)]
    [String]
    $ManifestFilePath=[Environment]::GetEnvironmentVariable('ACIMANIFESTFILE'),

    [Parameter(Mandatory=$false)]
    [String]
    $BuildTag=[Environment]::GetEnvironmentVariable('TAG'),

    [Parameter(Mandatory=$false)]
    [String]
    $AcrSecret=[Environment]::GetEnvironmentVariable('ACRSECRET')
)
try {
    if (!(test-path -Path $TemplateManifestFilePath -ErrorAction SilentlyContinue)) {
        Throw "NO Manifest Template File, please add a Manifest Template"
        Exit
    }

    if (test-path -Path $ManifestFilePath -ErrorAction SilentlyContinue) {
        Remove-Item -Path $ManifestFilePath -force
    }

    $Yaml = (Get-Content -path $TemplateManifestFilePath -Raw) -replace "%TAG%",$BuildTag
    $Yaml = $Yaml -replace "%ACRPASS%",$AcrSecret
    new-item -Path $ManifestFilePath -ItemType File 
    $Yaml | Add-Content -Path $ManifestFilePath -Encoding utf8
}
catch {
    Write-Error -Message " Exception Type: $($_.Exception.GetType().FullName) $($_.Exception.Message)"
}

Переменные трубопровода могут быть извлечены в ваш сценарий PowerShell в качестве переменных среды (за исключением секретных переменных, вам нужен дополнительный шаг, чтобы иметь их в своих сценариях).

Вы не можете добавить два этапа вашего развертывания трубопровода, сборки и нажимайте документы Docker и разверните группу экземпляров контейнера.

Для первого этапа

  vmImageName: 'ubuntu-latest'

stages:
- stage: BuildDockerImage
  displayName: Build Docker Images and push stage
  jobs:  
  - job: BuildApi
    displayName: BuildApi
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)/omcdemoaci-api
        dockerfile: '$(Build.SourcesDirectory)/API/Dockerfile'
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
  - job: BuildFront
    displayName: BuildFront
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)/omcdemoaci-front
        dockerfile: '$(Build.SourcesDirectory)/FRONT/Dockerfile'
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

И для второго

- stage: BuildManifestAndDeploy
  displayName: Build Deploy Manifest with docker tag and deploy to Azure
  jobs:  
  - job: BuildAndDeploy
    displayName: BuildApi
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: PowerShell@2
      env:
        ACRSECRET: $(acrSecret)
      displayName: Create the deployment Manifest
      inputs:
        targetType: 'filePath'
        filePath: '$(System.DefaultWorkingDirectory)/buildmanifest.ps1'
    - task: AzureCLI@2
      displayName: 'Deploy to Azure'
      inputs:
        azureSubscription: $(azureARMServiceConnection)
        scriptType: 'bash'
        scriptLocation: 'inlineScript'
        inlineScript: az container create --resource-group $(resourceGroupName) --file $(aciManifestFile)

Примечание, для получения секретной переменной в задаче PowerShell вы должны явно добавить ее в качестве переменной среды.

    env:
        ACRSECRET: $(acrSecret)

Как только файл будет предан и нажать на Azure DEVOPS, трубопровод должен работать и начать строительство и создавать или обновить группу экземпляров контейнера Azure.

Каждый раз, когда прогон трубопровода, он будет обновлять тег документов Docker в экземпляре на основе номера сборки. Теперь вы можете концентрировать себя на то, что ценно, ваше приложение.

Оригинал: «https://dev.to/omiossec/azure-container-instance-group-continuous-deployment-jo8»