Я хочу развернуть собственный образ SQL Server, для которого необходимо передать 4 переменные среды в AKS, используя следующее определение конвейера:
jobs:
- deployment: Deploy
condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
displayName: Deploy
pool:
vmImage: $(vmImageName)
environment: 'xxxx.default'
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@0
displayName: Create imagePullSecret
inputs:
action: createSecret
namespace: $(k8sNamespace)
secretName: $(imagePullSecret)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
namespace: $(k8sNamespace)
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
imagePullSecrets: |
$(imagePullSecret)
containers: |
$(containerRegistry)/$(imageRepository):$(tag)
Файлы манифеста создаются Azure DevOps в этом экземпляре, поэтому как мне поступить, если я хочу внедрить SA_Password/начальную пользовательскую конфигурацию для этого контейнера?
Это хороший вопрос. Я тоже хотел бы это знать. Azure DevOps создает манифесты. Обычно вы указываете эти переменные. Однако я не вижу способа вводить их здесь.
В действии развертывания kubernetes-manifest нет возможности добавлять дополнительные переменные среды. Не стесняйтесь открывать запрос функции на https://github.com/microsoft/azure-pipelines-tasks/issues
Можно сделать два варианта, написать скрипт с yq (https://github.com/mikefarah/yq) для обновления файлов манифеста перед развертыванием
Или используйте вариант исправления KubernetesManifest (https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/kubernetes-manifest?view=azure-devops#patch-action), для пример
steps:
- task: KubernetesManifest@0
displayName: Patch
inputs:
action: patch
kind: pod
name: demo-5fbc4d6cd9-pgxn4
mergeStrategy: strategic
patch: '{"spec":{"template":{"spec":{"containers":[{"env":[{"name":"SA_Password","value":"1234"}]}]}}}}'
kubernetesServiceConnection: someK8sSC
namespace: default
Мой вклад в комментарий Tummala заключается в том, что если у вас есть контроль над тем, как создается образ докера, я предлагаю вместо этого добавить переменные env оттуда. Поэтому, если у вас есть сборка докера, которая запускается при фиксации ветки разработки, вы можете просто передать эту среду в этот образ докера.
У меня есть специальный пост, посвященный CI/CD в Azure DevOps, на случай, если вам интересно: Построение конвейеров CI/CD для Kubernetes с помощью Azure DevOps и GitFlow.
если вы встроите переменные в докер, вы не сможете развернуть один и тот же образ в другой среде.
Лучший вариант для установки переменной во время выполнения, а не во время сборки для принципала приложения с 12 факторами.
Не уверен, куда вы хотите передать эти переменные. Можете ли вы уточнить это?