Udostępnij przez


Zasoby kubernetes w środowiskach

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

W tym artykule opisano używanie zasobów platformy Kubernetes w środowiskach usługi Azure Pipelines, które można kierować za pomocą wdrożeń. Możesz połączyć się z publicznymi lub prywatnymi klastrami Kubernetes w usłudze Azure Kubernetes Service (AKS) lub u innych dostawców usług w chmurze.

Widoki zasobów środowiska pokazują stan zasobu platformy Kubernetes i zapewniają możliwość śledzenia potoku i z powrotem do zatwierdzenia wyzwalającego. Możesz również utworzyć dynamiczne zasoby środowiska Kubernetes, aby ocenić pull requesty przed ich scaleniem. Aby uzyskać więcej informacji na temat zasobów środowiska, zobacz Zasoby w potokach YAML i Zabezpieczenia zasobów.

Uwaga

Prywatny klaster usługi AKS nie uwidacznia punktu końcowego serwera interfejsu API za pośrednictwem publicznego adresu IP, dlatego należy nawiązać połączenie z siecią wirtualną klastra. Można skonfigurować agenta we własnej sieci wirtualnej, który uzyskuje dostęp do sieci klastra, lub użyć Zarządzanych Pul DevOps. Aby uzyskać więcej informacji, zobacz Opcje nawiązywania połączenia z klastrem prywatnym.

Zalety zasobów środowiska Kubernetes

Zasoby środowiska i widoki zasobów platformy Kubernetes w środowiskach zapewniają następujące korzyści:

  • Możliwość śledzenia potoku. Zadanie wdrażania manifestu Kubernetes dodaje adnotacje, które obsługują śledzenie potoku. Możesz zobaczyć organizację, projekt oraz pipeline Azure DevOps odpowiedzialny za aktualizację obiektów w przestrzeni nazwowej.

    Zrzut ekranu przedstawiający śledzenie pipeline dla klastra Kubernetes.

  • Diagnostyka kondycji zasobów. Widok stanu obciążenia to szybki sposób debugowania błędów lub regresji wprowadzonych przez nowe wdrożenia. Na przykład informacje o statusie podu mogą pomóc w zidentyfikowaniu przyczyny problemów, takich jak nieskonfigurowane imagePullSecrets, które powodują błędy ImagePullBackOff.

    Zrzut ekranu przedstawiający widok stanu obciążenia dla wdrożenia platformy Kubernetes.

  • Przejrzyj aplikację. Aplikacja do przeglądu wdraża każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku i publikuje komentarz GitHub łączący się z aplikacją do przeglądu. Recenzenci mogą zobaczyć, jak zmiany pull requestu wyglądają i współpracują z innymi usługami zależnymi przed ich scaleniem do gałęzi docelowej i wdrożeniem do środowiska produkcyjnego.

    Zrzut ekranu przedstawiający komentarz do przeglądu aplikacji w usłudze GitHub.

Zasoby AKS

Usługa AKS tworzy konto usługi w wybranym klastrze i przestrzeni nazw oraz mapuje zasoby Kubernetes w danym środowisku na określoną przestrzeń nazw. Aby uzyskać informacje na temat konfigurowania połączenia usługi Kubernetes poza środowiskiem, zobacz Połączenie usługi Kubernetes.

W przypadku klastra z włączoną kontrolą dostępu opartą na rolach (RBAC) platformy Kubernetes tworzona jest również funkcja RoleBinding , aby ograniczyć zakres konta usługi do wybranej przestrzeni nazw. W przypadku klastra z wyłączoną obsługą RBAC utworzone konto usługi ma uprawnienia dla całego klastra we wszystkich przestrzeniach nazw.

Aby dodać zasób usługi AKS do środowiska usługi Azure Pipelines:

  1. Na stronie środowiska w obszarze Środowiska potoków> wybierz pozycję Dodaj zasób, a następnie wybierz pozycję Kubernetes.

  2. Na następnym ekranie wybierz pozycję Azure Kubernetes Service dla dostawcy, a następnie wybierz subskrypcję platformy Azure, klaster usługi AKS i nową lub istniejącą przestrzeń nazw. W przypadku nowej przestrzeni nazw wprowadź nazwę przestrzeni nazw.

  3. Wybierz pozycję Zweryfikuj i utwórz. Nowy zasób zostanie wyświetlony na karcie Zasoby środowiska z tekstem Nigdy nie wdrożono.

    Zrzut ekranu przedstawiający dodany zasób Kubernetes.

Zasoby Kubernetes spoza AKS

Aby zamapować zasób Kubernetes z klastra innego niż AKS na przestrzeń nazw, musisz mieć istniejące konto usługi dla dostawcy innego niż AKS.

Aby dodać zasób platformy Kubernetes spoza usługi AKS do środowiska usługi Azure Pipelines:

  1. Na stronie środowiska w obszarze Środowiska potoków> wybierz pozycję Dodaj zasób, a następnie wybierz pozycję Kubernetes.

  2. Na następnym ekranie wybierz Ogólnego dostawcę (istniejące konto serwisowe) dla dostawcy.

  3. W obszarze Poświadczenia klastra wprowadź nazwę klastra, przestrzeń nazw, adres URL serwera i wpis tajny.

    • Aby uzyskać adres URL serwera, uruchom polecenie kubectl config view --minify -o jsonpath={.clusters[0].cluster.server} w powłoce lokalnej.

    • Aby uzyskać sekretny kod:

      1. Pobierz tajne nazwy konta usługi, uruchamiając polecenie kubectl get serviceAccounts <service-account-name> -n <namespace> -o=jsonpath={.secrets[*].name}.
      2. Uruchom polecenie kubectl get secret <service-account-secret-name> -n <namespace> -o json przy użyciu danych wyjściowych poprzedniego polecenia.

      Uwaga

      Jeśli nie otrzymasz żadnych wyników z polecenia get ServiceAccounts, zobacz Ręczne tworzenie długotrwałego tokenu API dla konta usługi.

  4. Wybierz pozycję Zweryfikuj i utwórz.

Zasoby Kubernetes w pipelinach

Najprostszym sposobem na utworzenie potoku YAML do wdrożenia w usłudze AKS jest zaczęcie od użycia szablonu Deploy to Azure Kubernetes Services (Wdrażanie w usłudze Azure Kubernetes Services). Nie musisz pisać kodu YAML ani ręcznie tworzyć jawnych powiązań ról. Wygenerowana konfiguracja potoków ustawia i wykorzystuje zmienne oraz inne wartości na podstawie Twoich ustawień konfiguracji.

Użyj aplikacji do przeglądu

Zadanie DeployPullRequest wdraża każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku. Aby dodać to zadanie do przepływu, zaznacz pole wyboru Włącz przepływ aplikacji do przeglądu dla żądań ściągnięcia w formularzu konfiguracji Wdrażania w usłudze Azure Kubernetes Services.

Uwaga

Aby dodać to zadanie do istniejącego potoku, upewnij się, że połączenie usługi wspierające standardowy zasób środowiska Kubernetes jest ustawione na opcję Użyj poświadczeń administratora klastra. W przeciwnym razie należy utworzyć powiązania ról dla podstawowego konta usługi w namespace aplikacji testowej.

Zasoby aplikacji Review są oznaczone etykietą Review na liście Resource środowiska.

Zrzut ekranu przedstawiający środowisko przeglądu na liście środowiska potoku.

Przykładowy potok

Poniższy przykładowy potok jest oparty na szablonie Deploy to Azure Kubernetes Services. Potok najpierw kompiluje i wypycha obraz do usługi Azure Container Registry.

Następnie pierwsze zadanie wdrożeniowe jest uruchamiane dla dowolnego zatwierdzenia w gałęzi main, i wdraża na regularnym zasobie Kubernetes w środowisku.

Drugie zadanie uruchamia się, gdy zostanie utworzone lub zaktualizowane żądanie ściągnięcia do gałęzi main, i wdraża się na dynamiczny zasób aplikacji przeglądowej tworzony w klastrze na żądanie.

# Deploy to Azure Kubernetes Service
# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker

trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '12345' # Docker service connection identifier
  imageRepository: 'name-of-image-repository' # name of image repository
  containerRegistry: 'mycontainer.azurecr.io' # path to container registry
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'my-app-secret' # image pull secret

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Name of the new namespace being created to deploy the PR changes.
  k8sNamespaceForPR: 'review-app-$(System.PullRequest.PullRequestId)'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - upload: manifests
      artifact: manifests

- stage: Production
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Production
    condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
    displayName: Production
    pool:
      vmImage: $(vmImageName)
    environment: 'myenvironmentname.myresourcename'
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@1
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@1
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

  - deployment: DeployPullRequest
    displayName: Deploy Pull request
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/pull/'))
    pool:
      vmImage: $(vmImageName)

    environment: 'myenvironmentname.$(k8sNamespaceForPR)'
    strategy:
      runOnce:
        deploy:
          steps:
          - reviewApp: default

          - task: Kubernetes@1
            displayName: 'Create a new namespace for the pull request'
            inputs:
              command: apply
              useConfigurationFile: true
              inline: '{ "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "$(k8sNamespaceForPR)" }}'

          - task: KubernetesManifest@1
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespaceForPR)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@1
            displayName: Deploy to the new namespace in the Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespaceForPR)
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

          - task: Kubernetes@1
            name: get
            displayName: 'Get services in the new namespace'
            continueOnError: true
            inputs:
              command: get
              namespace: $(k8sNamespaceForPR)
              arguments: svc
              outputFormat: jsonpath='http://{.items[0].status.loadBalancer.ingress[0].ip}:{.items[0].spec.ports[0].port}'

          # Get the IP of the deployed service and writing it to a variable for posting comment
          - script: |
              url="$(get.KubectlOutput)"
              message="Your review app has been deployed"
              if [ ! -z "$url" -a "$url" != "http://:" ]
              then
                message="${message} and is available at $url."
              fi
              echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"