В экземпляре с использованием 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»