Ortam - Kubernetes kaynağı

Azure Pipelines

Kubernetes kaynak görünümü, ad alanı içinde kaynağa eşlenen nesnelerin durumuna bir bakış sağlar. Bu görünüm ayrıca bir Kubernetes nesnesinden işlem hattına ve sonra işlemeye geri dönebilirsiniz.

Dağıtım için bir ortamdaki Kubernetes kümelerini hedeflemek için Kubernetes kaynaklarını kullanın. İşlem hatlarını kullanarak diğer Azure Kubernetes Service (AKS) ve kümelere dağıtın.

Kaynakların çalışma hakkında daha fazla bilgi edinmek için YAML'de kaynaklara ve kaynaklarlagüvenlike bakın.

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 Kubernetesbildirim görevi, kaynak görünümlerde işlem hattı izlenebilirliğini göstermek için daha fazla ek açıklama ekler. İşlem hattı izlenebilirliği, ad alanı içindeki bir Azure DevOps güncelleştirmelerden sorumlu olan kuruluş, proje ve işlem hattının kaynağını belirlemeye yardımcı olur.

    İşlem hattı izlenebilirliği

  • Kaynak durumunu tanılama - İş yükü durumu, yeni bir dağıtım tarafından ortaya çıkmış olan hatalarda veya regresyonlarda hızla hata ayıklamak için yararlı olabilir. Örneğin, ImagePullBackOff hatalarına neden olan yapılandırılmamış imagePullSecrets için pod durum bilgileri sorunun kök nedenini tanımlamanıza yardımcı olabilir.

    ImagePullBackOff

  • Uygulamayı Gözden Geçirme - Uygulamayı Gözden Geçirme, Git depodan gelen her çekme isteğini ortam altındaki dinamik kubernetes kaynağına dağıtarak çalışır. Gözden geçirenler, hedef dalla birleştirilen ve üretime dağıtılana kadar bu değişikliklerin diğer bağımlı hizmetlerle nasıl birleşişini görebilir.

Use Azure Kubernetes Service

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

AKS Kubernetes kaynağı ekleme

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

  2. Sağlayıcı Azure Kubernetes Service Açılan Listesinden Seç'i seçin.

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

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

  5. Ortamınız için bir küme gördüğünüzden emin olun. Kümenize henüz kod dağıtamadıysanız "Hiçbir zaman dağıtlanmadı" metninin yer alan metniyle karşınıza çıktı.

    Kubernetes kümesi ekleyin.

Mevcut bir hizmet hesabını kullanma

Yeni Azure Kubernetes Service ServiceAccount oluşturur, ancak genel sağlayıcı seçeneği var olan bir ServiceAccount'i kullanmanızı sağlar. Mevcut ServiceAccount, ortamınız içindeki bir Kubernetes kaynağıyla bir ad alanına eşlenmiş olabilir.

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

İpucu

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 bir Kubernetes kaynağı ekleme

  1. Ortam ayrıntıları sayfasında Kaynak ekle'yi ve ardındanKubernetes'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 edinebilirsiniz:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Gizli nesnenizi almak için hizmet hesabı gizli adını bulun.

    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
  6. Önceki adımın çıkışını kullanarak gizli nesneyi elde edin.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. JSON formunda getiriken Secret nesnesini kopyalayıp Gizli'ye yapıştırın.

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

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

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

Şablonlar, YAML kodunu sıfırdan yazmak veya açık rol bağlamalarını el ile oluşturmak zorunda kalmadan Gözden Geçirme Uygulamasını ayarlamanızı sağlar.

Kubernetes şablon seçenekleri.

Gözden Geçirme Uygulamasını Ayarlama

Aşağıdaki örnekte, ilk dağıtım işi PR olmayan dallar için çalışır ve ortamlar altındaki normal bir Kubernetes kaynağına yönelik dağıtımlar yapar. İkinci iş yalnızca PR 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ı) için dağıtır. Kaynaklar, ortamın kaynak listesi görünümünde "Gözden Geçir" ile etiketlenmiş olur. İşlem hattında kullanmak üzere 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: Deploy
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Deploy
    condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
    displayName: Deploy
    pool:
      vmImage: $(vmImageName)
    environment: $(envName).$(resourceName)
    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: $(envName).$(resourceName)
    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 posing 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 desteklene 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şturulacaktır.

Sonraki adımlar