Distribuera till Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Du kan använda Azure Pipelines för att distribuera till Azure Kubernetes Service - och Kubernetes-kluster som erbjuds av andra molnleverantörer. Azure Pipelines har två uppgifter för att arbeta med Kubernetes:

  • KubernetesManifest-uppgift: baka och distribuera manifest till Kubernetes-kluster med Helm, Kompose eller Kustomize
  • Kubectl-uppgift: distribuera, konfigurera och uppdatera ett Kubernetes-kluster i Azure Container Service genom att köra kubectl-kommandon

Om du använder Azure Kubernetes Service med någon av aktiviteterna är Anslutningstypen för Azure Resource Manager-tjänsten det bästa sättet att ansluta till ett privat kluster eller ett kluster som har lokala konton inaktiverade.

Om du vill lägga till distributionsspårning kan du använda en Kubernetes-resurs i miljöer med en Kubernetes-uppgift.

Information om hur du kommer igång med Azure Pipelines och Azure Kubernetes-tjänsten finns i Skapa och distribuera till Azure Kubernetes Service med Azure Pipelines. Information om hur du kommer igång med Azure Pipelines, Kubernetes och distributionsstrategin för kanariefågel finns i Använda en kanariedistributionsstrategi för Kubernetes-distributioner med Azure Pipelines.

KubernetesManifest-uppgift

KubernetesManifest-aktiviteten söker efter objektstabilitet innan en uppgift markeras som lyckad/misslyckad. Uppgiften kan också utföra artefaktersättning, lägga till pipelinespårningsrelaterade anteckningar, förenkla skapandet och referera till imagePullSecrets, baka manifest och hjälp med distributionsstrategidistributioner.

Kommentar

Medan YAML-baserade pipelinestödutlösare på en enda Git-lagringsplats, om du behöver en utlösare för en manifestfil som lagras på en annan Git-lagringsplats eller om utlösare behövs för Azure Container Registry eller Docker Hub, bör du använda en klassisk pipeline i stället för en YAML-baserad pipeline.

Du kan använda åtgärden bake i Kubernetes-manifestuppgiften för att baka mallar till Kubernetes-manifestfiler. Med åtgärden kan du använda verktyg som Helm, Kustomize och Kompose. Åtgärden bake för Kubernetes-manifestaktiviteten ger insyn i omvandlingen mellan indatamallar och slutmanifestfilerna som används i distributioner. Du kan använda bakade manifestfiler nedströms (i uppgifter) som indata för distributionsåtgärden för Kubernetes-manifestaktiviteten.

Du kan rikta in dig på Kubernetes-resurser som ingår i miljöer med distributionsjobb. Med hjälp av miljöer och resursdistribution får du tillgång till bättre pipelinespårning så att du kan diagnostisera distributionsproblem. Du kan också distribuera till Kubernetes-kluster med vanliga jobb utan samma hälsofunktioner.

Följande YAML-kod är ett exempel på att baka manifestfiler från Helm-diagram

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-uppgift

Som ett alternativ till KubernetesManifest KubernetesManifest-uppgiften kan du använda Kubectl-uppgiften för att distribuera, konfigurera och uppdatera ett Kubernetes-kluster i Azure Container Service genom att köra kubectl-kommandon.

I följande exempel visas hur en tjänstanslutning används för att referera till Kubernetes-klustret.

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

Skriptaktivitet

Du kan också använda kubectl med en skriptuppgift.

I följande exempel används ett skript för att köra kubectl.

- script: |
    kubectl apply -f manifest.yml

Strategier för Kubernetes-distribution

Kubernetes-manifestuppgiften stöder för närvarande en strategi för kanariedistribution. Använd en strategi för kanariedistribution för att delvis distribuera nya ändringar så att de nya ändringarna samexisterar med de aktuella distributionerna före en fullständig distribution.

Mer information om kanariedistributioner med pipelines finns i Använda en kanariedistributionsstrategi för Kubernetes-distributioner med Azure Pipelines.

Kubernetes-distributioner med flera moln

Kubernetes körs på samma sätt på alla molnleverantörer. Azure Pipelines kan användas för distribution till Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) eller kluster från andra molnleverantörer.

Om du vill konfigurera distribution med flera moln skapar du en miljö och lägger sedan till dina Kubernetes-resurser som är associerade med namnrymder för Kubernetes-kluster.

Den allmänna providermetoden som baseras på ett befintligt tjänstkonto fungerar med kluster från alla molnleverantörer, inklusive Azure. Fördelen med att använda alternativet Azure Kubernetes Service i stället är att det skapar nya ServiceAccount - och RoleBinding-objekt (i stället för att återanvända ett befintligt ServiceAccount) så att det nyligen skapade RoleBinding-objektet endast kan begränsa driften av ServiceAccount till det valda namnområdet.

När du använder den allmänna providermetoden kontrollerar du att det finns ett RoleBinding som ger behörighet till editClusterRole det önskade tjänstkontot. Du måste bevilja behörigheter till rätt tjänstkonto så att tjänstkontot kan användas av Azure Pipelines för att skapa objekt i det valda namnområdet.

Parallella distributioner till flera moln

I följande exempel visas hur du utför parallella distributioner till kluster i flera moln. I det här exemplet finns det distributioner till AKS-, GKE-, EKS- och OpenShift-kluster. Dessa fyra namnområden är associerade med Kubernetes-resurser under contoso miljön.

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/*