Environment - Kubernetes resource

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

A Kubernetes-erőforrásnézet az erőforráshoz hozzárendelt névtérben lévő objektumok állapotát jeleníti meg. Az erőforrásnézet a folyamat nyomon követhetőségét is átfedi, így visszakövethető egy Kubernetes-objektumból a folyamatba, majd vissza a véglegesítéshez.

Kubernetes-erőforrások használata a Kubernetes-fürtök üzembe helyezéshez való megcélzásához. Folyamatok használatával üzembe helyezheti az Azure Kubernetes Service-ben (AKS) és fürtökben bármely más felhőszolgáltatótól.

A Kubernetes-erőforrásokat nyilvános vagy privát fürtökkel is használhatja. Az erőforrások működésével kapcsolatos további információkért tekintse meg a YAML erőforrásait és az erőforrásokkal való biztonságot.

Áttekintés

Tekintse meg a Kubernetes-erőforrásnézetek környezeteken belüli használatának alábbi előnyeit:

  • Folyamatkövethetőség – Az üzembe helyezésekhez használt Kubernetes-jegyzékfeladat további széljegyzeteket ad hozzá a folyamat nyomon követhetőségének az erőforrásnézetekben való megjelenítéséhez. A folyamat nyomon követhetősége segít azonosítani a névtérben lévő objektumon végrehajtott frissítésekért felelős, eredeti Azure DevOps-szervezetet, projektet és folyamatot.

    Pipeline traceability

  • Erőforrás állapotának diagnosztizálása – A számítási feladatok állapota hasznos lehet az új üzembe helyezés által bevezetett hibák vagy regressziók gyors hibakereséséhez. Az ImagePullBackOff-hibákat eredményező nem konfigurált imagePullSecret-fájlok esetében például a pod állapotadatai segíthetnek azonosítani a probléma kiváltó okát.

    ImagePullBackOff

  • Alkalmazás áttekintése – Az alkalmazás áttekintése úgy működik, hogy a Git-adattár minden lekéréses kérését üzembe helyezi egy dinamikus Kubernetes-erőforráson a környezet alatt. A véleményezők láthatják, hogy ezek a módosítások hogyan néznek ki és működnek más függő szolgáltatásokkal, mielőtt egyesítenék őket a célágba, és üzembe helyezték őket az éles környezetben.

Az Azure Kubernetes Service használata

Az Azure Kubernetes Service (AKS) használatakor létrejön egy ServiceAccount a kiválasztott fürtben és névtérben. Kubernetes RBAC-kompatibilis fürt esetén a RoleBinding is létrejön, hogy a létrehozott szolgáltatásfiók hatókörét a kiválasztott névtérre korlátozza. A Kubernetes RBAC által letiltott fürtök esetében a létrehozott ServiceAccount fürtszintű jogosultságokkal rendelkezik (a névterek között).

AKS Kubernetes-erőforrás hozzáadása

  1. A környezet részletei lapon válassza az Erőforrás hozzáadása, majd a Kubernetes lehetőséget.

  2. Válassza az Azure Kubernetes Service lehetőséget a Szolgáltató legördülő listában.

  3. Válassza ki az Azure-előfizetést, a fürtöt és a névteret (új/meglévő).

  4. Válassza az Ellenőrzés és létrehozás lehetőséget a Kubernetes-erőforrás létrehozásához.

  5. Ellenőrizze, hogy lát-e egy fürtöt a környezetében. Ha még nem telepített kódot a fürtön, a "Soha ne legyen üzembe helyezve" szöveg jelenik meg.

    Add a Kubernetes cluster.

Meglévő szolgáltatásfiók használata

Az Azure Kubernetes Service egy Kubernetes-erőforrást képez le a környezetében egy névtérbe.

A Kubernetes szolgáltatás kapcsolatának környezeten kívüli beállításáról a Kubernetes szolgáltatás kapcsolati szakaszában talál további információt.

Tipp.

Az általános szolgáltató (meglévő szolgáltatásfiók) használatával leképezhet egy Kubernetes-erőforrást egy névtérre egy nem AKS-fürtből.

Nem AKS Kubernetes-erőforrás hozzáadása

  1. A környezet részletei lapon válassza az Erőforrás hozzáadása, majd a Kubernetes lehetőséget.

  2. Válassza az Általános szolgáltató (meglévő szolgáltatásfiók) lehetőséget a szolgáltatóhoz.

  3. Adja hozzá a fürt nevét és névterét.

  4. Adja hozzá a kiszolgáló URL-címét. Az URL-címet a következő paranccsal szerezheti be:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. A titkos objektum lekérése.

    Kubernetes 1.22+

    Cserélje le service-account-name a fiók nevére.

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

    Ha semmit sem kap, tekintse meg a ServiceAccount hosszú élettartamú API-jogkivonatának manuális létrehozását.

    Kubernetes 1.22 és újabb:

    1. A szolgáltatásfiók titkos kódjának nevének megkeresése
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. cserélje le <service-account-secret-name> az előző parancs értékét ebben a parancsban
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Kérje le a titkos objektumot az előző lépés kimenetével.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Másolja és illessze be a JSON-űrlapon beolvasott Titkos objektumot a Titkos mezőbe.

  8. Válassza az Ellenőrzés és létrehozás lehetőséget a Kubernetes-erőforrás létrehozásához.

Kubernetes-erőforrások hivatkozása folyamatban

Ha az Azure Kubernetes Service-t használja, és YAML-folyamatot hoz létre, a folyamat konfigurálásának legegyszerűbb módja egy sablon használata. Csatlakozás az adattárba, és válasszon az alábbi két Kubernetes-szolgáltatás közül:

A sablonok lehetővé teszik a Felülvizsgálati alkalmazás beállítását anélkül, hogy yaML-kódot kellene írnia az alapoktól, vagy manuálisan kell létrehoznia explicit szerepkör-kötéseket.

Kubernetes template options.

A Felülvizsgálati alkalmazás beállítása

Az alábbi példában az első üzembehelyezési feladat nem pr-alapú ágakon fut, és a környezetek alatti normál Kubernetes-erőforráson végzi az üzembe helyezéseket. A második feladat csak pr-ágakhoz fut, és igény szerint létrehozott felülvizsgálati alkalmazáserőforrásokon (a Kubernetes-fürtön belüli névtereken) fut. Az erőforrások a környezet erőforrás-listanézetében "Véleményezés" címkével jelennek meg. Definiálja a folyamatban használandó változókat. Ha az Üzembe helyezés az Azure Kubernetes Servicesben sablont használja, ezek a változók definiálva lesznek Önnek.

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

Ha ezt a feladatot egy meglévő folyamatban szeretné használni, a normál Kubernetes-környezeti erőforrást tartalmazó szolgáltatáskapcsolatot módosítani kell a "Fürt rendszergazdai hitelesítő adatainak használata" értékre. Ellenkező esetben a mögöttes szolgáltatásfiókhoz szerepkör-kötéseket kell létrehozni az Alkalmazás áttekintése névtérhez.

További lépések