Dela via


Miljö – Kubernetes-resurs

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

Kubernetes-resursvyn visar status för objekt i namnområdet som mappas till resursen. Resursvyn överlagrar även pipelinespårningsbarheten så att du kan spåra tillbaka från ett Kubernetes-objekt till pipelinen och sedan tillbaka till incheckningen.

Använd Kubernetes-resurser för att rikta in sig på Kubernetes-kluster i en miljö för distribution. Använd pipelines för att distribuera till Azure Kubernetes Service (AKS) och kluster från andra molnleverantörer.

Du kan använda Kubernetes-resurser med offentliga eller privata kluster. Mer information om hur resurser fungerar finns i resurser i YAML och säkerhet med resurser.

Kommentar

Om du använder ett privat AKS-kluster kontrollerar du att du är ansluten till klustrets virtuella nätverk eftersom API-serverslutpunkten inte exponeras via en offentlig IP-adress.

Azure Pipelines rekommenderar att du konfigurerar en lokalt installerad agent i ett virtuellt nätverk som har åtkomst till klustrets virtuella nätverk. Mer information finns i Alternativ för att ansluta till det privata klustret .

Översikt

Se följande fördelar med att använda Kubernetes-resursvyer i miljöer:

  • Pipelinespårning – Kubernetes-manifestaktiviteten, som används för distributioner, lägger till fler anteckningar för att visa pipelinespårning i resursvyer. Pipelinespårning hjälper till att identifiera den ursprungliga Azure DevOps-organisationen, projektet och pipelinen som ansvarar för uppdateringar av ett objekt i namnområdet.

    Pipelinespårning

  • Diagnostisera resurshälsa – Arbetsbelastningsstatus kan vara användbar för att snabbt felsöka misstag eller regressioner som introducerades av en ny distribution. För okonfigurerade imagePullSecrets som resulterar i ImagePullBackOff-fel kan information om poddstatus till exempel hjälpa dig att identifiera rotorsaken till problemet.

    ImagePullBackOff

  • Granska app – Granska appen fungerar genom att distribuera varje pull-begäran från din Git-lagringsplats till en dynamisk Kubernetes-resurs under miljön. Granskare kan se hur dessa ändringar ser ut och fungerar med andra beroende tjänster innan de sammanfogas till målgrenen och distribueras till produktion.

Använda Azure Kubernetes Service

Ett ServiceAccount skapas i det valda klustret och namnområdet när du använder Azure Kubernetes Service (AKS). För ett Kubernetes RBAC-aktiverat kluster skapas Även RoleBinding för att begränsa omfattningen för det skapade tjänstkontot till det valda namnområdet. För ett Kubernetes RBAC-inaktiverat kluster har servicekontot som skapats klusteromfattande behörigheter (över namnområden).

Lägga till en AKS Kubernetes-resurs

  1. På sidan miljöinformation väljer du Lägg till resurs och väljer Kubernetes.

  2. Välj Azure Kubernetes Service i listrutan Provider.

  3. Välj Azure-prenumerationen, klustret och namnområdet (ny/befintlig).

  4. Välj Verifiera och skapa för att skapa Kubernetes-resursen.

  5. Kontrollera att du ser ett kluster för din miljö. Du ser texten "Aldrig distribuerad" om du ännu inte har distribuerat kod till klustret.

    Lägg till ett Kubernetes-kluster.

Använda ett befintligt tjänstkonto

Azure Kubernetes Service mappar en Kubernetes-resurs i din miljö till ett namnområde.

Mer information om hur du konfigurerar en Kubernetes-tjänstanslutning utanför en miljö finns i avsnittet Kubernetes-tjänstanslutning i Tjänstanslutningar.

Dricks

Använd den allmänna providern (befintligt tjänstkonto) för att mappa en Kubernetes-resurs till ett namnområde från ett icke-AKS-kluster.

Lägga till en Kubernetes-resurs som inte är AKS

  1. På sidan miljöinformation väljer du Lägg till resurs och väljer Kubernetes.

  2. Välj Allmän provider (befintligt tjänstkonto) för din leverantör.

  3. Lägg till klusternamn och namnområdesvärden.

  4. Lägg till server-URL:en. Du kan hämta URL:en med följande kommando:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. För att hämta det hemliga objektet.

    Kubernetes 1.22+

    Ersätt service-account-name med ditt kontonamn.

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

    Om du inte får något kan du läsa Skapa en API-token manuellt för ett ServiceAccount.

    Kubernetes 1.22 och lägre:

    1. Hitta namnet på tjänstkontots hemlighet
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. ersätt <service-account-secret-name> med värdet i föregående kommando i det här kommandot
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Hämta det hemliga objektet med hjälp av utdata från föregående steg.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Kopiera och klistra in det hemlighetsobjekt som hämtats i JSON-formulär i fältet Hemlighet.

  8. Välj Verifiera och skapa för att skapa Kubernetes-resursen.

Referera till dina Kubernetes-resurser i en pipeline

Om du använder Azure Kubernetes Service och skapar en YAML-pipeline är det enklaste sättet att konfigurera din pipeline att använda en mall. Anslut till lagringsplatsen och välj något av följande två Kubernetes Service-alternativ:

Med mallarna kan du konfigurera Granska app utan att behöva skriva YAML-kod från grunden eller manuellt skapa explicita rollbindningar.

Alternativ för Kubernetes-mallar.

Konfigurera granskningsapp

I följande exempel körs det första distributionsjobbet för icke-PR-grenar och distributioner mot en vanlig Kubernetes-resurs under miljöer. Det andra jobbet körs endast för PR-grenar och distribueras mot Granska appresurser (namnområden i Kubernetes-klustret) som genereras på begäran. Resurser får etiketten "Granska" i resurslistningsvyn för miljön. Definiera variabler som ska användas i pipelinen. Om du använder mallen Distribuera till Azure Kubernetes Services definieras dessa variabler åt dig.

# 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"

Om du vill använda det här jobbet i en befintlig pipeline måste tjänstanslutningen som stöder den vanliga Kubernetes-miljöresursen ändras till "Använd autentiseringsuppgifter för klusteradministratör". Annars måste rollbindningar skapas för det underliggande tjänstkontot till granskningsappens namnområde.

Nästa steg