Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Azure Pipelines를 사용하여 다른 클라우드 공급자가 제공하는 Azure Kubernetes Service 및 Kubernetes 클러스터에 배포합니다. Azure Pipelines에는 Kubernetes 작업을 위한 두 가지 작업이 있습니다.
- KubernetesManifest 작업: Helm, Kompose 또는 Kustomize를 사용하여 Kubernetes 클러스터에 매니페스트를 굽고 배포합니다.
- Kubectl 작업: kubectl 명령을 실행하여 Azure Container Service에서 Kubernetes 클러스터 배포, 구성 및 업데이트
두 작업 중 하나에서 Azure Kubernetes Service를 사용하는 경우 Azure Resource Manager 서비스 연결 유형이 프라이빗 클러스터 또는 로컬 계정이 비활성화된 클러스터에 연결하는 가장 좋은 방법입니다.
배포 추적 기능을 추가하려면 Kubernetes 작업과 함께 환경에서 Kubernetes 리소스를 사용합니다.
Azure Pipelines 및 Azure Kubernetes Service를 시작하려면 Azure Pipelines를 사용하여 Azure Kubernetes Service 빌드 및 배포를 참조하세요. Azure Pipelines, Kubernetes 및 카나리아 배포 전략을 시작하려면 Azure Pipelines를 사용하여 Kubernetes 배포에 카나리아 배포 전략 사용을 참조하세요.
KubernetesManifest 작업
KubernetesManifest 태스크는 작업을 성공 또는 실패로 표시하기 전에 개체 안정성을 확인합니다. 이 작업은 아티팩트 대체를 수행하고, 파이프라인 추적성 관련 주석을 추가하며, imagePullSecrets의 생성 및 참조를 간소화하고, 매니페스트를 생성하여 배포 전략 펼침을 지원할 수 있습니다.
참고
YAML 기반 파이프라인은 단일 Git 리포지토리에서 트리거를 지원합니다. 다른 Git 리포지토리에 저장된 매니페스트 파일에 대한 트리거가 필요하거나 Azure Container Registry 또는 Docker Hub에 트리거가 필요한 경우 YAML 기반 파이프라인 대신 클래식 파이프라인을 사용합니다.
Kubernetes 매니페스트 작업에서 베이킹 작업을 사용하여 템플릿을 Kubernetes 매니페스트 파일로 베이킹할 수 있습니다. 이 작업을 통해 Helm, Kustomize 및 Kompose와 같은 도구를 사용할 수 있습니다. Kubernetes 매니페스트 작업의 베이킹 작업은 입력 템플릿과 배포에 사용되는 최종 매니페스트 파일 간의 변환을 보여 줍니다. Kubernetes 매니페스트 작업의 배포 작업 입력으로 준비된 매니페스트 파일을 후속 작업에서 사용할 수 있습니다.
배포 작업이 있는 환경의 일부인 Kubernetes 리소스를 대상으로 지정합니다. 환경 및 리소스 배포를 사용하면 파이프라인 추적 가능성이 향상되어 배포 문제를 진단할 수 있습니다. 동일한 상태 기능 없이 일반 작업을 사용하여 Kubernetes 클러스터에 배포할 수도 있습니다.
다음 YAML 코드는 Helm 차트에서 매니페스트 파일을 굽는 방법을 보여 줍니다.
steps:
- task: KubernetesManifest@1
name: bake
displayName: Bake K8s manifests from Helm chart
inputs:
action: bake
helmChart: charts/sample
overrides: 'image.repository:nginx'
- task: KubernetesManifest@1
displayName: Deploy K8s manifests
inputs:
kubernetesServiceConnection: someK8sSC
namespace: default
manifests: $(bake.manifestsBundle)
containers: |
nginx: 1.24.0
kubectl 작업
KubernetesManifest KubernetesManifest 태스크 대신 Kubectl 작업을 사용하여 kubectl 명령을 실행하여 Azure Container Service에서 Kubernetes 클러스터를 배포, 구성 및 업데이트합니다.
이 예제에서는 서비스 연결이 Kubernetes 클러스터를 참조하는 방법을 보여 줍니다.
- task: Kubernetes@1
displayName: kubectl apply
inputs:
connectionType: Kubernetes Service Connection
kubernetesServiceConnection: Contoso #alias: kubernetesServiceEndpoint
스크립트 태스크
이 예제에서는 kubectl을(를) 실행하기 위해 스크립트를 사용합니다.
- script: |
kubectl apply -f manifest.yml
Kubernetes 배포 전략
Kubernetes 매니페스트 작업은 카나리아 배포 전략을 지원합니다. 카나리아 배포 전략을 사용하여 새 변경 내용을 부분적으로 배포하여 새 변경 내용이 전체 롤아웃 전에 현재 배포와 공존하도록 합니다.
파이프라인을 사용한 카나리아 배포에 대한 자세한 내용은 Azure Pipelines를 사용하여 Kubernetes 배포에 카나리아 배포 전략 사용을 참조하세요.
멀티클라우드 Kubernetes 배포
Kubernetes는 모든 클라우드 공급자에서 동일한 방식으로 작동합니다. Azure Pipelines를 사용하여 AKS(Azure Kubernetes Service), GKE(Google Kubernetes Engine), Amazon Elastic Kubernetes Service(EKS) 또는 다른 클라우드 공급자의 클러스터에 배포합니다.
다중 클라우드 배포를 설정하려면 환경을 만들고 Kubernetes 클러스터의 네임스페이스와 연결된 Kubernetes 리소스를 추가합니다.
기존 서비스 계정을 기반으로 하는 제네릭 공급자 접근 방식은 Azure를 비롯한 모든 클라우드 공급자의 클러스터에서 작동합니다. Azure Kubernetes Service 옵션을 사용하면 새 ServiceAccount 및 RoleBinding 개체가 만들어집니다. 이렇게 하면 RoleBinding 개체가 ServiceAccount의 작업을 선택한 네임스페이스로 제한합니다.
제네릭 공급자 접근 방식을 사용하는 경우 원하는 서비스 계정에 권한을 edit 부여하는 ClusterRole합니다. Azure Pipelines에서 선택한 네임스페이스에서 개체를 만드는 데 사용할 수 있도록 올바른 서비스 계정에 권한을 부여합니다.
여러 클라우드에 병렬 배포
다음 예제에서는 여러 클라우드의 클러스터에 병렬 배포를 수행하는 방법을 보여 줍니다. 이 예제에는 AKS, GKE, EKS 및 OpenShift 클러스터에 대한 배포가 있습니다. 이 네 가지 네임스페이스는 contoso 환경의 Kubernetes 리소스와 연결됩니다.
trigger:
- main
jobs:
- deployment:
displayName: Deploy to AKS
pool:
vmImage: ubuntu-latest
environment: contoso.aksnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: aksnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to GKE
pool:
vmImage: ubuntu-latest
environment: contoso.gkenamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: gkenamespace
manifests: manifests/*
- deployment:
displayName: Deploy to EKS
pool:
vmImage: ubuntu-latest
environment: contoso.eksnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: eksnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to OpenShift
pool:
vmImage: ubuntu-latest
environment: contoso.openshiftnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: openshiftnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to DigitalOcean
pool:
vmImage: ubuntu-latest
environment: contoso.digitaloceannamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@1
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: digitaloceannamespace
manifests: manifests/*