Ortam - Kubernetes kaynağı

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

Kubernetes kaynak görünümü, ad alanı içinde kaynağa eşlenen nesnelerin durumunu gösterir. Kaynak görünümü ayrıca bir Kubernetes nesnesinden işlem hattına ve sonra işlemeye geri dönebilmeniz için işlem hattı izlenebilirliğini de yer paylaşımlı olarak gösterir.

Dağıtım için bir ortamdaki Kubernetes kümelerini hedeflemek için Kubernetes kaynaklarını kullanın. Azure Kubernetes Service'e (AKS) ve diğer bulut sağlayıcılarından kümelere dağıtmak için işlem hatlarını kullanın.

Kubernetes kaynaklarını genel veya özel kümelerle kullanabilirsiniz. Kaynakların nasıl çalıştığı hakkında daha fazla bilgi edinmek için bkz . YAML'deki kaynaklar ve kaynaklarla güvenlik.

Genel Bakış

Ortamlar içinde Kubernetes kaynak görünümlerini kullanmanın aşağıdaki avantajlarına bakın:

  • İşlem hattı izlenebilirliği - Dağıtımlar için kullanılan Kubernetes bildirim görevi, kaynak görünümlerinde işlem hattı izlenebilirliğini göstermek için daha fazla ek açıklama ekler. İşlem hattı izlenebilirliği, ad alanı içindeki bir nesnede yapılan güncelleştirmelerin sorumlu olduğu kaynak Azure DevOps kuruluşunu, projesini ve işlem hattını belirlemeye yardımcı olur.

    Pipeline traceability

  • Kaynak durumunu tanılama - İş yükü durumu, yeni bir dağıtım tarafından ortaya çıkan hataları veya regresyonları hızla ayıklamak için yararlı olabilir. Örneğin, ImagePullBackOff hatalarıyla sonuçlanan yapılandırılmamış imagePullSecrets için pod durum bilgileri sorunun kök nedenini belirlemenize yardımcı olabilir.

    ImagePullBackOff

  • Uygulamayı gözden geçirme - Git deponuzdaki her çekme isteğini ortamın altındaki dinamik bir Kubernetes kaynağına dağıtarak Uygulamanın çalıştığını gözden geçirin. Gözden geçirenler, hedef dalda birleştirilip üretime dağıtılmadan önce bu değişikliklerin nasıl göründüğünü görebilir ve diğer bağımlı hizmetlerle çalışabilir.

Azure Kubernetes Service'i kullanma

Azure Kubernetes Service (AKS) kullandığınızda seçtiğiniz kümede ve ad alanında bir ServiceAccount oluşturulur. Kubernetes RBAC özellikli bir küme için, oluşturulan hizmet hesabının kapsamını seçilen ad alanıyla sınırlamak için RoleBinding de oluşturulur. Kubernetes RBAC tarafından devre dışı bırakılmış bir küme için, oluşturulan ServiceAccount'ın küme genelinde ayrıcalıkları vardır (ad alanları arasında).

AKS Kubernetes kaynağı ekleme

  1. Ortam ayrıntıları sayfasında Kaynak ekle'yi ve ardından Kubernetes'i seçin.

  2. Sağlayıcı açılan listesinde Azure Kubernetes Service'i seçin.

  3. Azure aboneliğini, kümesini ve ad alanını (yeni/var olan) seçin.

  4. Kubernetes kaynağını oluşturmak için Doğrula ve oluştur'u seçin.

  5. Ortamınız için bir küme gördüğünüzden emin olun. Kümenize henüz kod dağıtmadıysanız "Hiç dağıtılmadı" metnini görürsünüz.

    Add a Kubernetes cluster.

Mevcut bir hizmet hesabını kullanma

Azure Kubernetes Service, ortamınızdaki bir Kubernetes kaynağını bir ad alanına eşler.

Ortamın dışında Kubernetes hizmet bağlantısı kurma hakkında daha fazla bilgi için Hizmet bağlantıları'nın Kubernetes hizmet bağlantısı bölümüne bakın.

Bahşiş

Kubernetes kaynağını AKS olmayan bir kümeden bir ad alanına eşlemek için genel sağlayıcıyı (mevcut hizmet hesabı) kullanın.

AKS olmayan kubernetes kaynağı ekleme

  1. Ortam ayrıntıları sayfasında Kaynak ekle'yi ve ardından Kubernetes'i seçin.

  2. Sağlayıcınız için Genel sağlayıcı (mevcut hizmet hesabı) öğesini seçin.

  3. Küme adını ve ad alanı değerlerini ekleyin.

  4. Sunucu URL'sini ekleyin. URL'yi aşağıdaki komutla alabilirsiniz:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Gizli nesneyi almak için.

    Kubernetes 1.22+

    değerini hesap adınız ile değiştirin service-account-name .

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

    Hiçbir şey alamazsanız bkz . ServiceAccount için el ile uzun ömürlü API belirteci oluşturma.

    Kubernetes 1.22 ve altı:

    1. Hizmet hesabı gizli dizi adını bulma
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. değerini, bu komuttaki önceki komuttaki değerle değiştirin <service-account-secret-name>
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Önceki adımın çıkışını kullanarak gizli dizi nesnesini alın.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. JSON biçiminde getirilen Gizli dizi nesnesini kopyalayıp Gizli Dizi alanına yapıştırın.

  8. Kubernetes kaynağını oluşturmak için Doğrula ve oluştur'u seçin.

İşlem hattında Kubernetes kaynaklarınıza başvurma

Azure Kubernetes Service kullanıyor ve bir YAML işlem hattı oluşturuyorsanız işlem hattınızı yapılandırmanın en kolay yolu şablon kullanmaktır. Deponuza Bağlan ve aşağıdaki iki Kubernetes Service seçeneğinden birini seçin:

Şablonlar, YAML kodunu sıfırdan yazmanıza veya el ile açık rol bağlamaları oluşturmanıza gerek kalmadan Gözden Geçirme Uygulamasını ayarlamanıza olanak sağlar.

Kubernetes template options.

Gözden Geçirme Uygulamasını Ayarlama

Aşağıdaki örnekte, ilk dağıtım işi PR olmayan dallar için çalıştırılır ve ortamlar altında normal bir Kubernetes kaynağına yönelik dağıtımlar yapar. İkinci iş yalnızca ÇEKME isteği dalları için çalışır ve isteğe bağlı olarak oluşturulan Uygulama kaynaklarını gözden geçirme (Kubernetes kümesi içindeki ad alanları) ile dağıtılır. Kaynaklar, ortamın kaynak listeleme görünümünde "Gözden Geçir" ile etiketlenmiştir. İşlem hattında kullanılacak değişkenleri tanımlayın. Azure Kubernetes Services'e Dağıt şablonunu kullanırsanız, bu değişkenler sizin için tanımlanır.

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

Bu işi mevcut bir işlem hattında kullanmak için normal Kubernetes ortam kaynağının yedeklendiği hizmet bağlantısı "Küme yöneticisi kimlik bilgilerini kullan" olarak değiştirilmelidir. Aksi takdirde, temel alınan hizmet hesabı için Uygulamayı Gözden Geçir ad alanına rol bağlamaları oluşturulmalıdır.

Sonraki adımlar