Udostępnij przez


Wdrażanie na platformie Kubernetes

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Usługa Azure Pipelines umożliwia wdrażanie w klastrach Azure Kubernetes Service i Kubernetes oferowanych przez innych dostawców chmury. Usługa Azure Pipelines ma dwa zadania do pracy z platformą Kubernetes:

  • Zadanie KubernetesManifest: generowanie i wdrażanie manifestów do klastrów Kubernetes za pomocą Helm, Kompose lub Kustomize
  • Zadanie Kubectl: wdrażanie, konfigurowanie i aktualizowanie klastra Kubernetes w usłudze Azure Container Service przez uruchomienie poleceń kubectl

Jeśli używasz usługi Azure Kubernetes Service z jednym z zadań, typ połączenia usługi Azure Resource Manager jest najlepszym sposobem nawiązywania połączenia z klastrem prywatnym lub klastrem z wyłączonymi kontami lokalnymi.

Aby uzyskać dodatkową możliwość śledzenia wdrożenia, użyj zasobu Kubernetes w środowiskach wraz z zadaniem Kubernetes.

Aby rozpocząć pracę z usługą Azure Pipelines i usługą Azure Kubernetes Service, zobacz Tworzenie i wdrażanie w usłudze Azure Kubernetes Service za pomocą usługi Azure Pipelines. Aby rozpocząć korzystanie z Azure Pipelines, Kubernetes i strategii wdrażania kanaryjnego, zobacz Użyj strategii wdrażania kanaryjnego dla wdrożeń Kubernetes z Azure Pipelines.

zadanie KubernetesManifest

Zadanie KubernetesManifest sprawdza stabilność obiektu przed oznaczeniem zadania jako zakończonego powodzeniem lub niepowodzeniem. Zadanie może również wykonywać podstawianie artefaktów, dodawać adnotacje związane ze śledzeniem potoku, upraszczać tworzenie i odwoływanie się do ImagePullSecrets, przygotowywać manifesty i pomagać w realizacji strategii wdrażania.

Uwaga

Obsługa potoków opartych na YAML uruchamia się w pojedynczym repozytorium Git. Jeśli potrzebujesz wyzwalacza dla pliku manifestu przechowywanego w innym repozytorium Git lub jeśli wyzwalacze są wymagane dla usługi Azure Container Registry lub Docker Hub, użyj potoku klasycznego zamiast potoku opartego na języku YAML.

Możesz użyć akcji bake w zadaniu manifestu Kubernetes do pieczenia szablonów w plikach manifestu Kubernetes. Akcja umożliwia korzystanie z narzędzi, takich jak Helm, Kustomize i Kompose. Akcja kompilowania zadania manifestu Kubernetes pokazuje transformację między szablonami wejściowymi a końcowymi plikami manifestu używanymi we wdrożeniach. Skompletowane pliki manifestu można wykorzystywać w zadaniach jako dane wejściowe do akcji wdrażania zadania manifestu Kubernetes.

Docelowe zasoby platformy Kubernetes , które są częścią środowisk z zadaniamiwdrażania. Korzystanie ze środowisk i wdrożeń zasobów zwiększa możliwość śledzenia ciągów przetwarzania, pomagając w diagnozowaniu problemów z wdrażaniem. Można również wdrażać w klastrach Kubernetes z regularnymi zadania bez takich samych funkcji kontroli kondycji.

Poniższy kod YAML pokazuje, jak wygenerować pliki manifestu z chartów Helm.

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

Zadanie Kubectl

Alternatywą dla zadania KubernetesManifest KubernetesManifest jest użycie zadania Kubectl w celu wdrożenia, skonfigurowania i zaktualizowania klastra Kubernetes w usłudze Azure Container Service, uruchamiając polecenia kubectl.

W tym przykładzie pokazano, jak połączenie usługi odnosi się do klastra Kubernetes.

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

Zadanie skryptu

Użyj kubectl z zadaniem skryptu.

W tym przykładzie użyto skryptu do uruchomienia kubectl.

- script: |
    kubectl apply -f manifest.yml

Strategie wdrażania na platformie Kubernetes

Zadanie manifestu Kubernetes obsługuje strategię wdrożenia kanarkowego. Użyj strategii canary, aby częściowo wdrożyć nowe zmiany, dzięki czemu mogą one współistnieć z bieżącymi wdrożeniami przed pełnym wprowadzeniem.

Aby uzyskać więcej informacji na temat wdrożeń kanarowych z potokami, zobacz Use a canary deployment strategy for Kubernetes deployments with Azure Pipelines (Używanie strategii wdrażania kanarowego dla wdrożeń platformy Kubernetes za pomocą usługi Azure Pipelines).

Wdrożenia platformy Kubernetes z wieloma chmurami

Platforma Kubernetes działa tak samo w przypadku wszystkich dostawców usług w chmurze. Usługa Azure Pipelines umożliwia wdrażanie w usłudze Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) lub klastrach innych dostawców chmury.

Aby skonfigurować wdrożenie wielochmurowe, utwórz środowisko i dodaj zasoby kubernetes skojarzone z przestrzeniami nazw klastrów Kubernetes.

Ogólne podejście dostawcy oparte na istniejącym koncie usługi współpracuje z klastrami od dowolnego dostawcy chmury, w tym z platformą Azure. Użycie opcji Azure Kubernetes Service powoduje utworzenie nowych obiektów ServiceAccount i RoleBinding . Gwarantuje to, że obiekt RoleBinding ogranicza operacje usługi ServiceAccount do wybranej przestrzeni nazw.

W przypadku korzystania z podejścia ogólnego dostawcy upewnij się, że istnieje powiązanie ról , które przyznaje uprawnienia do editClusterRole żądanego konta usługi. Udziel uprawnień dla właściwego konta usługi, aby usługa Azure Pipelines mogła używać go do tworzenia obiektów w wybranej przestrzeni nazw.

Wdrożenia równoległe w wielu chmurach

W poniższym przykładzie pokazano, jak wykonywać wdrożenia równoległe w klastrach w wielu chmurach. W tym przykładzie istnieją wdrożenia w klastrach AKS, GKE, EKS i OpenShift. Te cztery przestrzenie nazw są skojarzone z zasobami Kubernetes w środowisku contoso.

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