Поделиться через


Развертывание в Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Используйте Azure Pipelines для развертывания в кластерах Службы Azure Kubernetes и Kubernetes , предлагаемых другими поставщиками облачных служб. Azure Pipelines имеет две задачи для работы с Kubernetes:

  • Задача KubernetesManifest: создание и развертывание манифестов в кластерах Kubernetes с помощью Helm, Kompose или Kustomize
  • Задача Kubectl: развертывание, настройка и обновление кластера Kubernetes в службе контейнеров Azure путем выполнения команд kubectl

Если вы используете службу Azure Kubernetes с любой задачей, тип подключения службы Azure Resource Manager является лучшим способом подключения к частному кластеру или кластеру с отключенными локальными учетными записями.

Для повышения трассируемости развертывания используйте ресурс Kubernetes в средах совместно с задачей Kubernetes.

Сведения о начале работы с Azure Pipelines и службой Azure Kubernetes см. в статье "Сборка и развертывание в службе Azure Kubernetes с помощью Azure Pipelines". Сведения о начале работы с Azure Pipelines, Kubernetes и канареечной стратегией развертывания см. в статье "Использование канареечной стратегии развертывания для развертываний Kubernetes с помощью Azure Pipelines".

Задача KubernetesManifest

Задача KubernetesManifest проверяет стабильность объектов перед маркировкой задачи как успешной или неудачной. Задача также может выполнять подстановку артефактов, добавлять аннотации, связанные с трассируемостью конвейера, упрощать создание и ссылку на imagePullSecrets, подготавливать манифесты и содействовать развёртыванию стратегий развертывания.

Примечание.

Поддержка триггеров для конвейеров на основе YAML осуществляется в одном репозитории Git. Если вам нужен триггер для файла манифеста, хранящегося в другом репозитории Git, или если триггеры необходимы для реестра контейнеров Azure или Docker Hub, используйте классический конвейер вместо конвейера на основе YAML.

Вы можете использовать действие компоновки в задаче манифеста Kubernetes для интеграции шаблонов в файлы манифеста Kubernetes. Это действие позволяет использовать такие инструменты, как Helm, Kustomize и Kompose. Действие по созданию манифестов в задаче Kubernetes отображает преобразование входных шаблонов в итоговые файлы манифестов, используемые при развертывании. В качестве входных данных для действия развертывания задачи манифеста Kubernetes можно использовать подготовленные файлы манифестов (в последующих задачах).

Целевые ресурсы Kubernetes , которые являются частью сред с заданиями развертывания. Использование сред и развертываний ресурсов улучшает трассируемость конвейера, помогая диагностировать проблемы с развертыванием. Кроме того, вы можете развернуть в кластерах Kubernetes с обычными заданиями без функций мониторинга состояния.

В следующем коде YAML показано, как создавать файлы манифеста из диаграмм Helm

steps:
- task: KubernetesManifest@1
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@1
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx:  1.24.0

Задача команды kubectl

В качестве альтернативы задаче KubernetesManifest KubernetesManifest используйте задачу Kubectl для развертывания, настройки и обновления кластера Kubernetes в службе контейнеров Azure, выполнив команды kubectl.

В этом примере показано, как подключение к службе относится к кластеру Kubernetes.

- task: Kubernetes@1
  displayName: kubectl apply
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceConnection: Contoso #alias: kubernetesServiceEndpoint

задача скрипта

Используйте kubectl с задачей скрипта.

В этом примере для выполнения kubectl используется скрипт.

- script: |
    kubectl apply -f manifest.yml

Стратегии развертывания Kubernetes

Задача манифеста Kubernetes поддерживает стратегию развертывания канарной версии. Используйте стратегию развертывания canary для частичного развертывания новых изменений, чтобы новые изменения сосуществовали с текущими развертываниями до полного развертывания.

Дополнительные сведения о канарных развертываниях с конвейерами см. в статье "Использование стратегии канаречного развертывания для развертываний Kubernetes с помощью Azure Pipelines".

Развертывания Kubernetes в мультиоблачной среде

Kubernetes работает одинаково для всех поставщиков облачных служб. Используйте Azure Pipelines для развертывания в Службе Azure Kubernetes (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) или кластерах других поставщиков облачных служб.

Чтобы настроить развертывание с несколькими облаками, создайте среду и добавьте ресурсы Kubernetes, связанные с пространствами имен кластеров Kubernetes.

Универсальный подход поставщика, основанный на существующей учетной записи службы, работает с кластерами от любого поставщика облачных служб, включая Azure. С помощью параметра службы Azure Kubernetes создаются новые объекты ServiceAccount и RoleBinding . Это гарантирует, что объект RoleBinding ограничивает операции ServiceAccount выбранным пространством имен.

Используя общий подход провайдера, убедитесь, что существует RoleBinding, который предоставляет нужной учетной записи службы разрешения в editClusterRole. Предоставьте разрешения правильной учетной записи службы, чтобы Azure Pipelines могли использовать ее для создания объектов в выбранном пространстве имен.

Параллельные развёртывания на нескольких облаках

В следующем примере показано, как выполнять параллельные развертывания в кластерах в нескольких облаках. В этом примере существуют развертывания в кластерах AKS, GKE, EKS и OpenShift. Эти четыре пространства имен связаны с ресурсами Kubernetes в contoso среде.

trigger:
- main

jobs:
- deployment:
  displayName: Deploy to AKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.aksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: aksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to GKE
  pool:
    vmImage: ubuntu-latest
  environment: contoso.gkenamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: gkenamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to EKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.eksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: eksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to OpenShift
  pool:
    vmImage: ubuntu-latest
  environment: contoso.openshiftnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: openshiftnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to DigitalOcean
  pool:
    vmImage: ubuntu-latest
  environment: contoso.digitaloceannamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@1
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*