Sdílet prostřednictvím


Nasazení do Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Azure Pipelines můžete použít k nasazení do clusterů Azure Kubernetes Service a Kubernetes nabízených jinými poskytovateli cloudu. Azure Pipelines má dvě úlohy pro práci s Kubernetes:

  • Úloha KubernetesManifest: připravení a nasazení manifestů do clusterů Kubernetes pomocí Helmu, Kompose nebo Kustomize
  • Úloha Kubectl: Nasazení, konfigurace a aktualizace clusteru Kubernetes ve službě Azure Container Service spuštěním příkazů kubectl

Pokud používáte službu Azure Kubernetes Service s některou z těchto dvou úloh, je nejlepším způsobem připojení k privátnímu clusteru nebo clusteru s vypnutými místními účty využití typu připojení služby Azure Resource Manager.

Pokud chcete zlepšit sledování nasazení, použijte zdroj Kubernetes v prostředích s úkolem Kubernetes.

Pokud chcete začít pracovat se službou Azure Pipelines a Azure Kubernetes, přečtěte si téma Sestavení a nasazení do služby Azure Kubernetes Service pomocí Azure Pipelines. Pokud chcete začít se službou Azure Pipelines, Kubernetes a konkrétně s kanárskou strategií nasazení, viz Použití kanárské strategie pro nasazení Kubernetes se službou Azure Pipelines.

Úloha KubernetesManifest

Úloha KubernetesManifest kontroluje stabilitu objektů před označením úkolu jako úspěch nebo selhání. Úloha může také provádět nahrazení artefaktů, přidat poznámky související s sledovatelností potrubí, zjednodušit vytváření a odkazování na imagePullSecrets, vytvářet manifesty a pomáhat při zavádění strategií nasazení.

Poznámka:

I když kanál založený na YAML podporuje triggery v jednom úložišti Git, pokud potřebujete trigger pro soubor manifestu uložený v jiném úložišti Git nebo pokud jsou triggery potřeba pro Azure Container Registry nebo Docker Hub, měli byste místo kanálu založeného na YAML použít klasický kanál.

Akci bake v úloze manifestu Kubernetes můžete použít k pečení šablon do souborů manifestu Kubernetes. Akce umožňuje používat nástroje, jako Helm, Kustomize a Kompose. Proces bake úlohy manifestu Kubernetes poskytuje přehled o transformaci mezi vstupními šablonami a výslednými soubory manifestu, které se používají při nasazeních. Vytvořené soubory manifestu můžete ve svých úkolech použít jako vstupy pro akci nasazení úkolu s manifestem Kubernetes.

Můžete cílit na prostředky Kubernetes, které jsou součástí prostředí s úlohami nasazení. Používání nasazování prostředí a zdrojů vám poskytuje přístup k lepší sledovatelnosti procesů, takže můžete diagnostikovat problémy s nasazením. Můžete také nasadit do clusterů Kubernetes se standardními úlohami aniž by měly stejné funkce pro kontrolu stavu.

Následující kód YAML je příkladem sestavení souborů manifestu z Helm chartů.

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 – úloha

Jako alternativu k úloze KubernetesManifest KubernetesManifest můžete pomocí úlohy Kubectl nasadit, nakonfigurovat a aktualizovat cluster Kubernetes ve službě Azure Container Service spuštěním příkazů kubectl.

Následující příklad ukazuje, jak se připojení služby používá pro určení clusteru Kubernetes.

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

Úloha skriptu

Můžete také použít kubectl s úlohou skriptu.

Následující příklad používá skript ke spuštění kubectl.

- script: |
    kubectl apply -f manifest.yml

Strategie nasazení Kubernetes

Úloha manifestu Kubernetes v současné době podporuje strategii nasazení kanárů. Použijte kanárkovou strategii nasazení k částečnému nasazení nových změn, aby nové změny spolu s aktuálními nasazeními spoluexistovaly před úplným uvedením.

Další informace o kanárských nasazeních s Azure Pipelines najdete v tématu Použití kanárské strategie nasazení pro nasazení Kubernetes se službou Azure Pipelines.

Nasazení Kubernetes ve vícecloudovém prostředí

Kubernetes běží na všech poskytovatelích cloudu stejným způsobem. Azure Pipelines je možné použít k nasazení do služby Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) nebo clusterů od jiných poskytovatelů cloudu.

Pokud chcete nastavit vícecloudové nasazení, vytvořte prostředí a přidejte prostředky Kubernetes přidružené k oborům názvů clusterů Kubernetes.

Obecný přístup poskytovatele založený na existujícím účtu služby funguje s clustery od libovolného poskytovatele cloudu, včetně Azure. Výhodou použití možnosti Azure Kubernetes Service místo toho je, že vytváří nové objekty ServiceAccount a RoleBinding (místo opětovného použití existujícího účtu ServiceAccount), aby nově vytvořený objekt RoleBinding mohl omezit operace ServiceAccount pouze na zvolený obor názvů.

Při použití obecného přístupu zprostředkovatele se ujistěte, že existuje vazba role, která uděluje oprávnění k editClusterRole požadovanému účtu služby. Musíte udělit oprávnění správnému účtu služeb, aby účet služby mohl azure Pipelines použít k vytváření objektů ve zvoleném oboru názvů.

Paralelní nasazení do několika cloudů

Následující příklad ukazuje, jak provádět paralelní nasazení do clusterů v několika cloudech. V tomto příkladu existují nasazení do clusterů AKS, GKE, EKS a OpenShift. Tyto čtyři namespace jsou přidružené k prostředkům Kubernetes v rámci prostředí 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/*