Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Bu makalede, dağıtımlarla hedefleyebileceğiniz Azure Pipelines ortamlarında Kubernetes kaynaklarının kullanımı açıklanmaktadır. Azure Kubernetes Service(AKS) veya diğer bulut sağlayıcılarındaki genel veya özel Kubernetes kümelerine bağlanabilirsiniz.
Ortam kaynak görünümleri Kubernetes kaynak durumunu gösterir ve işlem hattına izlenebilirlik sağlar ve tetikleyen işlemeye geri döner. Birleştirmeden önce çekme isteklerini gözden geçirmek için dinamik Kubernetes ortam kaynakları da oluşturabilirsiniz. Ortam kaynakları hakkında daha fazla bilgi için bkz . YAML işlem hatlarındaki kaynaklar ve Kaynak güvenliği.
Not
Özel AKS kümesi api sunucusu uç noktasını genel IP adresi aracılığıyla kullanıma sunmaz, bu nedenle kümenin sanal ağına bağlanmanız gerekir. Kümenin sanal ağına erişebilen bir sanal ağ içinde kendi kendine barındırılan bir aracı kurabilir veya Yönetilen DevOps Havuzları kullanabilirsiniz. Daha fazla bilgi için bkz. Özel kümeye bağlanma seçenekleri.
Kubernetes ortamı kaynak avantajları
Kubernetes ortam kaynakları ve ortamlardaki kaynak görünümleri aşağıdaki avantajları sağlar:
İşlem hattı izlenebilirliği. Kubernetes bildirim dağıtım görevi, işlem hattı izlenebilirliğini destekleyen ek açıklamalar ekler. Ad alanı içindeki nesnelere yapılan güncelleştirmeden sorumlu Azure DevOps kuruluşunu, projesini ve işlem hattını görebilirsiniz.
Kaynak sağlık durumu tanılaması. İş yükü durumu görünümü, yeni dağıtımlar tarafından ortaya çıkan hataların veya regresyonların hatalarını ayıklamanın hızlı bir yoludur. Örneğin, pod durum bilgileri, yapılandırılmamış
imagePullSecrets'ünImagePullBackOffhatalarına yol açtığı sorunların nedenini belirlemenize yardımcı olabilir.
Uygulamayı gözden geçirin. Gözden geçirme uygulaması, Git deponuzdaki her çekme isteğini ortamdaki dinamik bir Kubernetes kaynağına dağıtır ve gözden geçirme uygulamasına bağlantı içeren bir GitHub açıklaması gönderir. Gözden geçirenler, PR (çekme isteği) değişikliklerinin nasıl göründüğünü ve diğer bağımlı hizmetlerle nasıl çalıştığını, bu değişiklikler hedef dalda birleştirilip üretime dağıtılmadan önce görebilir.
AKS kaynakları
AKS, seçtiğiniz kümede ve ad alanında bir ServiceAccount oluşturur ve ortamınızdaki Kubernetes kaynaklarını belirtilen ad alanına eşler. Ortamın dışında Kubernetes hizmet bağlantısı kurma hakkında bilgi için bkz. Kubernetes hizmet bağlantısı.
Kubernetes rol tabanlı erişim denetimi (RBAC) özellikli bir küme için, 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 hizmet hesabının ad alanları arasında küme genelinde ayrıcalıkları vardır.
Azure Pipelines ortamına AKS kaynağı eklemek için:
Ortamlar sayfasında İşlem Hatları'nın> altında "Kaynak ekle" seçeneğini ve ardından "Kubernetes" seçeneğini seçin.
Sonraki ekranda Sağlayıcı için Azure Kubernetes Service'i ve ardından Azure aboneliğinizi, AKS Kümenizi ve yeni veya mevcut Ad Alanı'nı seçin. Yeni bir ad alanı için ad alanı adını girin.
Doğrula ve oluştur'u seçin. Yeni kaynak, ortamın Kaynaklar sekmesinde Hiçbir zaman dağıtılmama metniyle görüntülenir.
AKS olmayan Kubernetes kaynakları
AKS olmayan bir kümeden bir Kubernetes kaynağını ad alanına eşlemek için AKS olmayan sağlayıcı için mevcut bir hizmet hesabınızın olması gerekir.
Azure Pipelines ortamına AKS olmayan bir Kubernetes kaynağı eklemek için:
Ortamlar sayfasında İşlem Hatları'nın> altında "Kaynak ekle" seçeneğini ve ardından "Kubernetes" seçeneğini seçin.
Sonraki ekranda Sağlayıcı için Genel sağlayıcı (mevcut hizmet hesabı)öğesini seçin.
Küme kimlik bilgileri'nin altında Küme adı, Ad Alanı, Sunucu URL'si ve Gizli Dizi girin.
Sunucu URL'sini almak için shell'inizde
kubectl config view --minify -o jsonpath={.clusters[0].cluster.server}komutunu çalıştırın.Gizli bilgiyi almak için:
-
kubectl get serviceAccounts <service-account-name> -n <namespace> -o=jsonpath={.secrets[*].name}çalıştırarak hizmet hesabının gizli anahtar isimlerini alın. - Önceki komutun çıktısını kullanarak
kubectl get secret <service-account-secret-name> -n <namespace> -o jsonçalıştırın.
Not
Komutundan
get ServiceAccountssonuç alamazsanız bkz. ServiceAccount için el ile uzun ömürlü API belirteci oluşturma.-
Doğrula ve oluştur'u seçin.
İşlem hatlarındaki Kubernetes kaynakları
AKS'ye dağıtmak için BIR YAML işlem hattı oluşturmanın en kolay yolu , Azure Kubernetes Services'e Dağıt şablonuyla başlamaktır. YAML kodu yazmanız veya el ile açık rol bağlamaları oluşturmanız gerekmez. Oluşturulan işlem hattı, yapılandırma ayarlarınıza göre değişkenleri ve diğer değerleri ayarlar ve kullanır.
Gözden geçirme uygulamasını kullanma
Görev, DeployPullRequest Git deponuzdaki her çekme isteğini ortamdaki dinamik bir Kubernetes kaynağına dağıtır. Bu işi işlem hattına eklemek için Çekme İstekleri için İnceleme Uygulama akışını etkinleştir onay kutusunu Azure Kubernetes Services'a dağıtım yapılandırma formunda seçin.
Not
Bu işi mevcut bir işlem hattına eklemek için, normal Kubernetes ortam kaynağının yedekleneceği hizmet bağlantısının Küme yöneticisi kimlik bilgilerini kullan olarak ayarlandığından emin olun. Aksi takdirde, ilgili hizmet hesabı için inceleme uygulaması ad alanına rol atamaları oluşturulmalıdır.
Gözden geçirme uygulaması kaynakları, ortamın Kaynak listesinde Gözden Geçir olarak etiketlenmiştir.
Örnek işlem hattı
Aşağıdaki örnek işlem hattı , Azure Kubernetes Services'e Dağıt şablonunu temel alır. İşlem hattı ilk olarak bir görüntü oluşturur ve Azure Container Registry'ye gönderir.
İlk dağıtım işi, main dalındaki tüm taahhütler için çalışır ve ortamdaki normal bir Kubernetes kaynağına karşı uygulanır.
İkinci iş, bir çekme isteği oluşturulduğunda veya dalda main güncelleştirildiğinde çalışır ve isteğe bağlı olarak kümede oluşturduğu dinamik bir gözden geçirme uygulaması kaynağına dağıtılır.
# Deploy to Azure Kubernetes Service
# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
# https://docs.microsoft.com/azure/devops/pipelines/languages/docker
trigger:
- main
resources:
- repo: self
variables:
# Container registry service connection established during pipeline creation
dockerRegistryServiceConnection: '12345' # Docker service connection identifier
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: 'myenvironmentname.myresourcename'
strategy:
runOnce:
deploy:
steps:
- task: KubernetesManifest@1
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@1
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: 'myenvironmentname.$(k8sNamespaceForPR)'
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@1
displayName: Create imagePullSecret
inputs:
action: createSecret
secretName: $(imagePullSecret)
namespace: $(k8sNamespaceForPR)
dockerRegistryEndpoint: $(dockerRegistryServiceConnection)
- task: KubernetesManifest@1
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}'
# Get 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."
fi
echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"