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


Развертывание в 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 Service, см. в статье "Сборка и развертывание в службу Azure Kubernetes Service с помощью 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@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

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

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

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

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

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

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

Вы также можете использовать kubectl с задачей скрипта.

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

- script: |
    kubectl apply -f manifest.yml

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

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

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

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

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

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

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

При использовании универсального подхода поставщика убедитесь, что RoleBinding существует и предоставляет разрешения в edit нужной учетной записи службы. Необходимо предоставить разрешения нужной учетной записи службы, чтобы она могла использоваться 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@0
          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@0
          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@0
          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@0
          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@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*