Dela via


Distribuera till Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Använd 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 med lokala konton inaktiverade.

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

Information om hur du kommer igång med Azure Pipelines och Azure Kubernetes Service 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 aktivitet markeras som lyckad eller misslyckad. Uppgiften kan också utföra artefaktersättning, lägga till pipelinespårningsrelaterade anteckningar, förenkla skapandet och referensen av imagePullSecrets, bygga manifester och hjälpa till med utrullningar av distributionsstrategi.

Kommentar

Stöd för YAML-baserade pipelines utlöses från ett enda Git-repository. 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, använder du 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-manifestuppgiften visar omvandlingen mellan indatamallar och de slutliga manifestfilerna som används i distributioner. Du kan använda bakade manifestfiler som indata i efterföljande steg (i uppgifter) för distributionsåtgärden i Kubernetes-manifestuppgiften.

Rikta in dig på Kubernetes-resurser som ingår i miljöer med distributionsjobb. Genom att använda miljöer och resurstilldelningar förbättras spårbarheten i pipeline, vilket hjälper dig att diagnostisera problem med distributionen. Du kan också distribuera till Kubernetes-kluster med vanliga jobb utan samma hälsoövervakningsfunktioner.

Följande YAML-kod visar hur du bakar manifestfiler från Helm-diagram

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

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

Det här exemplet visar hur en tjänstanslutning refererar till Kubernetes-klustret.

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

Skriptaktivitet

Använd kubectl med en skriptuppgift.

I det här exemplet 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 distributionsstrategin för kanariefågel. Använd strategin för kanariedistribution för att delvis distribuera nya ändringar så att de nya ändringarna samexisterar med aktuella distributioner 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 fungerar på samma sätt på alla molnleverantörer. Använd Azure Pipelines för att distribuera 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 till Kubernetes-resurser som är associerade med namnrymder i Kubernetes-kluster.

Den allmänna providermetoden, som baseras på ett befintligt tjänstkonto, fungerar med kluster från alla molnleverantörer, inklusive Azure. Med alternativet Azure Kubernetes Service skapas nya ServiceAccount - och RoleBinding-objekt . Detta säkerställer att RoleBinding-objektet begränsar ServiceAccounts åtgärder till det valda namnområdet.

När du använder den allmänna providermetoden kontrollerar du att det finns ett RoleBinding som ger behörigheter till editClusterRole önskat tjänstkonto. Bevilja behörigheter till rätt tjänstkonto så att Azure Pipelines kan använda det 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@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/*