Delen via


Implementeren naar Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Gebruik Azure Pipelines om te implementeren in Azure Kubernetes Service - en Kubernetes-clusters die worden aangeboden door andere cloudproviders. Azure Pipelines heeft twee taken voor het werken met Kubernetes:

  • KubernetesManifest-taak: manifesten bakken en implementeren in Kubernetes-clusters met Helm, Kompose of Kustomize
  • Kubectl-taak: een Kubernetes-cluster implementeren, configureren en bijwerken in Azure Container Service door kubectl-opdrachten uit te voeren

Als u Azure Kubernetes Service gebruikt met een van beide taken, is het verbindingstype van de Azure Resource Manager-service de beste manier om verbinding te maken met een privécluster of een cluster met lokale accounts uitgeschakeld.

Gebruik een Kubernetes-resource in omgevingen en een Kubernetes-taak voor extra tracering van implementaties .

Zie Bouwen en implementeren in Azure Kubernetes Service met Azure Pipelines om aan de slag te gaan met Azure Pipelines en Azure Kubernetes Service. Om aan de slag te gaan met Azure Pipelines, Kubernetes en de canary-implementatiestrategie, zie Een canary-implementatiestrategie gebruiken voor Kubernetes-implementaties met Azure Pipelines.

KubernetesManifest-taak

De KubernetesManifest-taak controleert op objectstabiliteit voordat een taak als geslaagd of mislukt wordt gemarkeerd. De taak kan ook artefactvervanging uitvoeren, pijplijn-traceringsgerelateerde aantekeningen toevoegen, de creatie en verwijzing naar imagePullSecrets vereenvoudigen, manifests bouwen en helpen bij het uitrollen van implementatiestrategieën.

Notitie

Op YAML gebaseerde pijplijnondersteuningstriggers in één Git-opslagplaats. Als u een trigger nodig hebt voor een manifestbestand dat is opgeslagen in een andere Git-opslagplaats of als triggers nodig zijn voor Azure Container Registry of Docker Hub, gebruikt u een klassieke pijplijn in plaats van een OP YAML gebaseerde pijplijn.

U kunt de bake-actie in de Kubernetes-manifesttaak gebruiken om sjablonen in Kubernetes-manifestbestanden te bakenen. Met de actie kunt u hulpprogramma's zoals Helm, Kustomize en Kompose gebruiken. De bake-actie van de Kubernetes-manifesttaak toont de transformatie tussen invoersjablonen en de uiteindelijke manifestbestanden die in implementaties worden gebruikt. U kunt voorbewerkte manifestbestanden downstream, binnen taken, gebruiken als invoer voor de implementatieactie van de Kubernetes manifesttaak.

Doel-Kubernetes-resources die deel uitmaken van omgevingen met implementatietaken. Het gebruik van omgevingen en resource-implementaties verbetert de tracering van pijplijnen, waardoor u implementatieproblemen kunt vaststellen. U kunt ook implementeren in Kubernetes-clusters met reguliere taken zonder dezelfde statusfuncties.

De volgende YAML-code laat zien hoe u manifestbestanden uit Helm-grafieken kunt bakken

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

Als alternatief voor de KubernetesManifest KubernetesManifest-taak gebruikt u de Kubectl-taak om een Kubernetes-cluster in Azure Container Service te implementeren, configureren en bij te werken door kubectl-opdrachten uit te voeren.

In dit voorbeeld ziet u hoe een serviceverbinding verwijst naar het Kubernetes-cluster.

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

Scriptopdracht

Gebruik kubectl met een scripttaak.

In dit voorbeeld wordt een script gebruikt om uit te voeren kubectl.

- script: |
    kubectl apply -f manifest.yml

Implementatiestrategieën van Kubernetes

De Kubernetes-manifest-taak ondersteunt de canary-implementatiestrategie, een methode om nieuwe versies stapsgewijs te introduceren. Gebruik de canary-implementatiestrategie om gedeeltelijk nieuwe wijzigingen te implementeren, zodat de nieuwe wijzigingen naast de huidige implementaties bestaan vóór een volledige implementatie.

Zie Een canary-implementatiestrategie gebruiken voor Kubernetes-implementaties met Azure Pipelines voor meer informatie over canary-implementaties met pijplijnen.

Kubernetes-implementaties met meerdere clouds

Kubernetes werkt op dezelfde manier voor alle cloudproviders. Gebruik Azure Pipelines om te implementeren in Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) of clusters van andere cloudproviders.

Als u multicloudimplementatie wilt instellen, maakt u een omgeving en voegt u Kubernetes-resources toe die zijn gekoppeld aan naamruimten van Kubernetes-clusters.

De algemene providerbenadering werkt op basis van een bestaand serviceaccount met clusters van elke cloudprovider, waaronder Azure. Met de optie Azure Kubernetes Service maakt u nieuwe ServiceAccount - en RoleBinding-objecten . Dit zorgt ervoor dat het RoleBinding-object de bewerkingen van het ServiceAccount beperkt tot de gekozen naamruimte.

Wanneer u de algemene providerbenadering gebruikt, moet u ervoor zorgen dat er een RoleBinding bestaat die machtigingen in het editClusterRole gewenste serviceaccount verleent. Verken machtigingen aan het juiste serviceaccount, zodat Azure Pipelines dit kan gebruiken om objecten te maken in de gekozen naamruimte.

Parallelle implementaties naar meerdere clouds

In het volgende voorbeeld ziet u hoe u parallelle implementaties uitvoert voor clusters in meerdere clouds. In dit voorbeeld zijn er implementaties voor de AKS-, GKE-, EKS- en OpenShift-clusters. Deze vier naamruimten zijn gekoppeld aan Kubernetes-resources onder de contoso omgeving.

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