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


Развертывание в 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, которые являются частью сред с заданиями развертывания. Использование сред и ресурсов позволяет получить доступ к более эффективной трассировки конвейера, чтобы диагностировать проблемы с развертыванием. Кроме того, вы можете развернуть в кластерах 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 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 в настоящее время поддерживает стратегию развертывания канарной версии. Используйте стратегию развертывания canary для частичного развертывания новых изменений, чтобы новые изменения сосуществовали с текущими развертываниями до полного развертывания.

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

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

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

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

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

При использовании универсального подхода поставщика убедитесь, что roleBinding существует, который предоставляет разрешения в edit ClusterRole нужной учетной записи службы. Необходимо предоставить разрешения для правильной учетной записи служб, чтобы учетная запись службы использовалась 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/*