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 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.
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.
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
Ortam ayrıntıları sayfasında Kaynak ekle'yi ve ardından Kubernetes'i seçin.
Sağlayıcı açılan listesinde Azure Kubernetes Service'i seçin.
Azure aboneliğini, kümesini ve ad alanını (yeni/var olan) seçin.
Kubernetes kaynağını oluşturmak için Doğrula ve oluştur'u seçin.
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.
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.
İ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 kubernetes kaynağı ekleme
Ortam ayrıntıları sayfasında Kaynak ekle'yi ve ardından Kubernetes'i seçin.
Sağlayıcınız için Genel sağlayıcı (mevcut hizmet hesabı) öğesini seçin.
Küme adını ve ad alanı değerlerini ekleyin.
Sunucu URL'sini ekleyin. URL'yi aşağıdaki komutla alabilirsiniz:
kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
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ı:
- Hizmet hesabı gizli dizi adını bulma
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- 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
Önceki adımın çıkışını kullanarak gizli dizi nesnesini alın.
kubectl get secret <service-account-secret-name> -n <namespace> -o json
JSON biçiminde getirilen Gizli dizi nesnesini kopyalayıp Gizli Dizi alanına yapıştırın.
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ın ve aşağıdaki iki Kubernetes Service seçeneğinden birini seçin:
- Azure Kubernetes Services şablonuna dağıtma
- Kubernetes'e dağıtma - Azure DevSpaces ile Uygulamayı Gözden Geçirme
Ş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.
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.