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