Środowisko — Zasób platformy Kubernetes

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

Widok zasobów Platformy Kubernetes przedstawia stan obiektów w przestrzeni nazw, które są mapowane na zasób. Widok zasobów nakłada również możliwość śledzenia potoku, dzięki czemu można śledzić z powrotem z obiektu Kubernetes do potoku, a następnie z powrotem do zatwierdzenia.

Użyj zasobów Kubernetes, aby kierować klastry Kubernetes do wdrożenia w środowisku . Użyj potoków do wdrożenia w usłudze Azure Kubernetes Service (AKS) i klastrach z dowolnego innego dostawcy usług w chmurze.

Zasoby platformy Kubernetes można używać z klastrami publicznymi lub prywatnymi. Aby dowiedzieć się więcej o sposobie działania zasobów, zobacz zasoby w języku YAML i zabezpieczeniach z zasobami.

Omówienie

Zapoznaj się z następującymi zaletami korzystania z widoków zasobów platformy Kubernetes w środowiskach:

  • Śledzenie potoku — zadanie manifestu Kubernetes używane do wdrożeń dodaje więcej adnotacji w celu pokazania możliwości śledzenia potoku w widokach zasobów. Możliwość śledzenia potoku pomaga zidentyfikować źródłową organizację, projekt i potok usługi Azure DevOps odpowiedzialny za aktualizacje wprowadzone do obiektu w przestrzeni nazw.

    Pipeline traceability

  • Diagnozowanie kondycji zasobów — stan obciążenia może być przydatny w przypadku szybkiego debugowania błędów lub regresji, które zostały wprowadzone przez nowe wdrożenie. Na przykład w przypadku nieskonfigurowanych obrazówPullSecrets powodujących błędy ImagePullBackOff informacje o stanie zasobnika mogą pomóc w zidentyfikowaniu głównej przyczyny problemu.

    ImagePullBackOff

  • Przejrzyj aplikację — przejrzyj działanie aplikacji , wdrażając każde żądanie ściągnięcia z repozytorium Git do dynamicznego zasobu Kubernetes w środowisku. Recenzenci mogą zobaczyć, jak te zmiany wyglądają i współpracują z innymi usługami zależnymi przed scaleniem ich z gałęzią docelową i wdrożoną w środowisku produkcyjnym.

Korzystanie z usługi Azure Kubernetes Service

Konto usługi jest tworzone w wybranym klastrze i przestrzeni nazw podczas korzystania z usługi Azure Kubernetes Service (AKS). W przypadku klastra z obsługą kontroli dostępu opartej na rolach platformy Kubernetes tworzona jest również funkcja RoleBinding, aby ograniczyć zakres utworzonego konta usługi do wybranej przestrzeni nazw. W przypadku klastra z wyłączoną kontrolą dostępu opartą na rolach platformy Kubernetes utworzona usługa ServiceAccount ma uprawnienia dla całego klastra (między przestrzeniami nazw).

Dodawanie zasobu AKS Kubernetes

  1. Na stronie szczegółów środowiska wybierz pozycję Dodaj zasób i wybierz pozycję Kubernetes.

  2. Wybierz pozycję Azure Kubernetes Service z listy rozwijanej Dostawca.

  3. Wybierz subskrypcję platformy Azure, klaster i przestrzeń nazw (nowa/istniejąca).

  4. Wybierz pozycję Weryfikuj i utwórz , aby utworzyć zasób Kubernetes.

  5. Sprawdź, czy widzisz klaster dla danego środowiska. Jeśli kod nie został jeszcze wdrożony w klastrze, zobaczysz tekst "Nigdy nie wdrożono".

    Add a Kubernetes cluster.

Użyj istniejącego konta usługi

Usługa Azure Kubernetes Service mapuje zasób Kubernetes w danym środowisku na przestrzeń nazw.

Aby uzyskać więcej informacji na temat konfigurowania połączenia usługi Kubernetes poza środowiskiem, zobacz sekcję Połączenie usługi Kubernetes w temacie Połączenia z usługą.

Napiwek

Użyj dostawcy ogólnego (istniejącego konta usługi), aby zamapować zasób Kubernetes na przestrzeń nazw z klastra innego niż AKS.

Dodawanie zasobu platformy Kubernetes innej niż AKS

  1. Na stronie szczegółów środowiska wybierz pozycję Dodaj zasób i wybierz pozycję Kubernetes.

  2. Wybierz dostawcę ogólnego (istniejące konto usługi) dla dostawcy.

  3. Dodaj wartości nazwy klastra i przestrzeni nazw.

  4. Dodaj adres URL serwera. Adres URL można uzyskać za pomocą następującego polecenia:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Aby uzyskać obiekt wpisu tajnego.

    Kubernetes 1.22+

    Zastąp service-account-name ciąg nazwą swojego konta.

    kubectl get secret -n <namespace>  -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
    

    Jeśli nic nie uzyskasz, zobacz Ręczne tworzenie długotrwałego tokenu interfejsu API dla konta usługi.

    Kubernetes 1.22 i poniżej:

    1. Znajdowanie nazwy wpisu tajnego konta usługi
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. zastąp <service-account-secret-name> ciąg wartością w poprzednim poleceniu w tym poleceniu
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Pobierz obiekt wpisu tajnego przy użyciu danych wyjściowych poprzedniego kroku.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Skopiuj i wklej obiekt Secret pobrany w formularzu JSON do pola Wpis tajny.

  8. Wybierz pozycję Weryfikuj i utwórz , aby utworzyć zasób Kubernetes.

Odwołuj się do zasobów platformy Kubernetes w potoku

Jeśli używasz usługi Azure Kubernetes Service i tworzysz potok YAML, najprostszym sposobem skonfigurowania potoku jest użycie szablonu. Połączenie do repozytorium i wybierz jedną z następujących dwóch opcji usługi Kubernetes Service:

Szablony umożliwiają skonfigurowanie funkcji Przeglądanie aplikacji bez konieczności pisania kodu YAML od podstaw lub ręcznego tworzenia jawnych powiązań ról.

Kubernetes template options.

Konfigurowanie aplikacji do przeglądania

W poniższym przykładzie pierwsze zadanie wdrożenia jest uruchamiane dla gałęzi innych niż żądanie ściągnięcia i wykonuje wdrożenia względem zwykłego zasobu Kubernetes w środowiskach. Drugie zadanie jest uruchamiane tylko dla gałęzi żądania ściągnięcia i jest wdrażane względem zasobów aplikacji (przestrzeni nazw w klastrze Kubernetes) wygenerowanych na żądanie. Zasoby są oznaczone etykietą "Przegląd" w widoku listy zasobów środowiska. Zdefiniuj zmienne do użycia w potoku. Jeśli używasz szablonu Deploy to Azure Kubernetes Services (Wdrażanie w usłudze Azure Kubernetes Services), te zmienne zostaną zdefiniowane dla Ciebie.

# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '12345' # Docker service connection identifier
  envName: 'myEnv' # name of your environment
  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: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes 
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            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: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes
    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@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespaceForPR)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            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}'

          # Getting 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.<br><br>[Learn More](https://aka.ms/testwithreviewapps) about how to test and provide feedback for the app."
              fi
              echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"

Aby można było używać tego zadania w istniejącym potoku, należy zmodyfikować połączenie usługi, które wspiera zwykły zasób środowiska Kubernetes, w celu ustawienia "Użyj poświadczeń administratora klastra". W przeciwnym razie należy utworzyć powiązania ról dla bazowego konta usługi w przestrzeni nazw Przeglądanie aplikacji.

Następne kroki