Kubernetes 매니페스트 파일을 사용하여 클러스터에 배포하거나 Helm 차트를 사용하여 배포에 사용할 매니페스트 파일을 굽습니다.
문법
# Deploy to Kubernetes v1
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@1
inputs:
#action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
#connectionType: 'kubernetesServiceConnection' # 'azureResourceManager' | 'kubernetesServiceConnection'. Required when action != bake. Service connection type. Default: kubernetesServiceConnection.
#kubernetesServiceConnection: # string. Alias: kubernetesServiceEndpoint. Required when action != bake && connectionType = kubernetesServiceConnection. Kubernetes service connection.
#azureSubscriptionConnection: # string. Alias: azureSubscriptionEndpoint. Required when action != bake && connectionType = azureResourceManager. Azure subscription.
#azureResourceGroup: # string. Required when action != bake && connectionType = azureResourceManager. Resource group.
#kubernetesCluster: # string. Required when action != bake && connectionType = azureResourceManager. Kubernetes cluster.
#useClusterAdmin: false # boolean. Optional. Use when connectionType = azureResourceManager. Use cluster admin credentials. Default: false.
#namespace: # string. Namespace.
#strategy: 'none' # 'canary' | 'none'. Optional. Use when action = deploy || action = promote || action = reject. Strategy. Default: none.
#trafficSplitMethod: 'pod' # 'pod' | 'smi'. Optional. Use when strategy = canary. Traffic split method. Default: pod.
#percentage: '0' # string. Required when strategy = Canary && action = deploy. Percentage. Default: 0.
#baselineAndCanaryReplicas: '1' # string. Required when strategy = Canary && action = deploy && trafficSplitMethod = SMI. Baseline and canary replicas. Default: 1.
#manifests: # string. Required when action = deploy || action = promote || action = reject. Manifests.
#containers: # string. Optional. Use when action = deploy || action = promote || action = bake. Containers.
#imagePullSecrets: # string. Optional. Use when action = deploy || action = promote. ImagePullSecrets.
#renderType: 'helm' # 'helm' | 'kompose' | 'kustomize'. Optional. Use when action = bake. Render Engine. Default: helm.
#dockerComposeFile: # string. Required when action = bake && renderType = kompose. Path to docker compose file.
#helmChart: # string. Required when action = bake && renderType = helm. Helm Chart.
#releaseName: # string. Optional. Use when action = bake && renderType = helm. Helm Release Name.
#overrideFiles: # string. Optional. Use when action = bake && renderType = helm. Override Files.
#overrides: # string. Optional. Use when action = bake && renderType = helm. Overrides.
#kustomizationPath: # string. Optional. Use when action = bake && renderType = kustomize. Kustomization Path.
#resourceToPatch: 'file' # 'file' | 'name'. Required when action = patch. Resource to patch. Default: file.
#resourceFileToPatch: # string. Required when action = patch && resourceToPatch = file. File path.
#kind: # 'deployment' | 'replicaset' | 'statefulset'. Required when action = scale || resourceToPatch = name. Kind.
#name: # string. Required when action = scale || resourceToPatch = name. Name.
#replicas: # string. Required when action = scale. Replica count.
#mergeStrategy: 'strategic' # 'json' | 'merge' | 'strategic'. Required when action = patch. Merge Strategy. Default: strategic.
#arguments: # string. Optional. Use when action = delete. Arguments.
#patch: # string. Required when action = patch. Patch.
#secretType: 'dockerRegistry' # 'dockerRegistry' | 'generic'. Required when action = createSecret. Type of secret. Default: dockerRegistry.
#secretName: # string. Optional. Use when action = createSecret. Secret name.
#secretArguments: # string. Optional. Use when action = createSecret && secretType = generic. Arguments.
#dockerRegistryEndpoint: # string. Optional. Use when action = createSecret && secretType = dockerRegistry. Docker registry service connection.
#rolloutStatusTimeout: '0' # string. Optional. Use when action = deploy || action = patch || action = scale || action = promote. Timeout for rollout status. Default: 0.
#resourceType: 'Microsoft.ContainerService/managedClusters' # string. Optional. Use when action = deploy. Resource type. Default: Microsoft.ContainerService/managedClusters.
# Deploy to Kubernetes v1
# Use Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts.
- task: KubernetesManifest@1
inputs:
#action: 'deploy' # 'bake' | 'createSecret' | 'delete' | 'deploy' | 'patch' | 'promote' | 'scale' | 'reject'. Action. Default: deploy.
#connectionType: 'kubernetesServiceConnection' # 'azureResourceManager' | 'kubernetesServiceConnection'. Required when action != bake. Service connection type. Default: kubernetesServiceConnection.
#kubernetesServiceConnection: # string. Alias: kubernetesServiceEndpoint. Required when action != bake && connectionType = kubernetesServiceConnection. Kubernetes service connection.
#azureSubscriptionConnection: # string. Alias: azureSubscriptionEndpoint. Required when action != bake && connectionType = azureResourceManager. Azure subscription.
#azureResourceGroup: # string. Required when action != bake && connectionType = azureResourceManager. Resource group.
#kubernetesCluster: # string. Required when action != bake && connectionType = azureResourceManager. Kubernetes cluster.
#useClusterAdmin: false # boolean. Optional. Use when connectionType = azureResourceManager. Use cluster admin credentials. Default: false.
#namespace: # string. Namespace.
#strategy: 'none' # 'canary' | 'none'. Optional. Use when action = deploy || action = promote || action = reject. Strategy. Default: none.
#trafficSplitMethod: 'pod' # 'pod' | 'smi'. Optional. Use when strategy = canary. Traffic split method. Default: pod.
#percentage: '0' # string. Required when strategy = Canary && action = deploy. Percentage. Default: 0.
#baselineAndCanaryReplicas: '1' # string. Required when strategy = Canary && action = deploy && trafficSplitMethod = SMI. Baseline and canary replicas. Default: 1.
#manifests: # string. Required when action = deploy || action = promote || action = reject. Manifests.
#containers: # string. Optional. Use when action = deploy || action = promote || action = bake. Containers.
#imagePullSecrets: # string. Optional. Use when action = deploy || action = promote. ImagePullSecrets.
#renderType: 'helm' # 'helm' | 'kompose' | 'kustomize'. Optional. Use when action = bake. Render Engine. Default: helm.
#dockerComposeFile: # string. Required when action = bake && renderType = kompose. Path to docker compose file.
#helmChart: # string. Required when action = bake && renderType = helm. Helm Chart.
#releaseName: # string. Optional. Use when action = bake && renderType = helm. Helm Release Name.
#overrideFiles: # string. Optional. Use when action = bake && renderType = helm. Override Files.
#overrides: # string. Optional. Use when action = bake && renderType = helm. Overrides.
#kustomizationPath: # string. Optional. Use when action = bake && renderType = kustomize. Kustomization Path.
#resourceToPatch: 'file' # 'file' | 'name'. Required when action = patch. Resource to patch. Default: file.
#resourceFileToPatch: # string. Required when action = patch && resourceToPatch = file. File path.
#kind: # 'deployment' | 'replicaset' | 'statefulset'. Required when action = scale || resourceToPatch = name. Kind.
#name: # string. Required when action = scale || resourceToPatch = name. Name.
#replicas: # string. Required when action = scale. Replica count.
#mergeStrategy: 'strategic' # 'json' | 'merge' | 'strategic'. Required when action = patch. Merge Strategy. Default: strategic.
#arguments: # string. Optional. Use when action = delete. Arguments.
#patch: # string. Required when action = patch. Patch.
#secretType: 'dockerRegistry' # 'dockerRegistry' | 'generic'. Required when action = createSecret. Type of secret. Default: dockerRegistry.
#secretName: # string. Optional. Use when action = createSecret. Secret name.
#secretArguments: # string. Optional. Use when action = createSecret && secretType = generic. Arguments.
#dockerRegistryEndpoint: # string. Optional. Use when action = createSecret && secretType = dockerRegistry. Docker registry service connection.
#rolloutStatusTimeout: '0' # string. Optional. Use when action = deploy || action = patch || action = scale || action = promote. Timeout for rollout status. Default: 0.
입력
action
-
작업
string
; 허용되는 값: bake
, createSecret
(비밀 만들기), delete
, deploy
, patch
, promote
, scale
, reject
. 기본값은 deploy
입니다.
수행할 작업을 지정합니다.
connectionType
-
서비스 연결 유형
string
;
action != bake
때 필요합니다. 허용되는 값: azureResourceManager
(Azure Resource Manager), kubernetesServiceConnection
(Kubernetes Service Connection). 기본값은 kubernetesServiceConnection
입니다.
Kubernetes 서비스 연결 유형을 선택합니다.
-
kubernetesServiceConnection
(Kubernetes 서비스 연결) - KubeConfig 파일을 제공하거나, 서비스 계정을 지정하거나, Azure 구독 옵션을 사용하여 AKS 인스턴스를 가져올 수 있습니다. Azure 구독 옵션을 사용하여 AKS 인스턴스를 가져오려면 서비스 연결 구성 시 Kubernetes 클러스터 액세스가 필요합니다. -
azureResourceManager
(Azure Resource Manager) - AKS 인스턴스를 선택할 수 있습니다. 서비스 연결 구성 시 Kubernetes 클러스터에 액세스하지 않습니다.
자세한 내용은 설명참조하세요.
Kubernetes 서비스 연결kubernetesServiceConnection
-
입력 별칭: kubernetesServiceEndpoint
.
string
;
action != bake && connectionType = kubernetesServiceConnection
때 필요합니다.
Kubernetes 서비스 연결지정합니다.
Azure 구독
입력 별칭: azureSubscriptionEndpoint
.
string
;
action != bake && connectionType = azureResourceManager
때 필요합니다.
Azure Container Registry가 포함된 Azure Resource Manager 구독을 선택합니다.참고: 새 서비스 연결을 구성하려면 목록에서 Azure 구독을 선택하고 '권한 부여'를 클릭합니다. 구독이 나열되지 않거나 기존 서비스 주체를 사용하려는 경우 '추가' 또는 '관리' 단추를 사용하여 Azure 서비스 연결을 설정할 수 있습니다.
azureResourceGroup
-
리소스 그룹
string
;
action != bake && connectionType = azureResourceManager
때 필요합니다.
Azure 리소스 그룹을 선택합니다.
Kubernetes 클러스터
string
;
action != bake && connectionType = azureResourceManager
때 필요합니다.
Azure 관리형 클러스터를 선택합니다.
useClusterAdmin
-
클러스터 관리자 자격 증명 사용
boolean
; 선택 사항입니다.
connectionType = azureResourceManager
때 사용합니다. 기본값은 false
입니다.
기본 클러스터 사용자 자격 증명 대신 클러스터 관리자 자격 증명을 사용합니다.
namespace
-
네임스페이스
string
;
–namespace
플래그를 사용하여 명령의 네임스페이스를 지정합니다. 네임스페이스가 제공되지 않으면 명령이 기본 네임스페이스에서 실행됩니다.
strategy
-
전략
string
; 선택 사항입니다.
action = deploy || action = promote || action = reject
때 사용합니다. 허용되는 값: canary
, none
. 기본값은 none
입니다.
deploy
작업 또는 promote
작업 전에 reject
작업에 사용되는 배포 전략을 지정합니다. 현재 canary
유일한 허용 가능한 배포 전략입니다.
trafficSplitMethod
-
트래픽 분할 방법
string
; 선택 사항입니다.
strategy = canary
때 사용합니다. 허용되는 값: pod
, smi
. 기본값은 pod
입니다.
smi
값의 경우 트래픽 분할 비율은 서비스 메시를 사용하여 요청 수준에서 수행됩니다. 클러스터 관리자가 서비스 메시를 설정해야 합니다. 이 작업은 SMI TrafficSplit 개체의 오케스트레이션을 처리합니다.
pod
값의 경우 서비스 메시가 없는 경우 요청 수준에서 백분율 분할을 사용할 수 없습니다. 대신 백분율 입력을 사용하여 기준 및 카나리아의 복제본을 계산합니다. 계산은 안정적인 변형에 대한 입력 매니페스트에 지정된 복제본의 백분율입니다.
percentage
-
백분율
string
;
strategy = Canary && action = deploy
때 필요합니다. 기본값은 0
입니다.
매니페스트 파일에 포함된 워크로드의 기준 변형 및 카나리아 변형 복제본 수를 계산하는 데 사용되는 백분율입니다.
지정된 백분율 입력의 경우 다음을 계산합니다.
(백분율 × 복제본 수) / 100
결과가 정수가 아니면 기준 및 카나리아 변형을 만들 때 결과의 수학 바닥이 사용됩니다.
예를 들어 배포 hello-world
입력 매니페스트 파일에 있고 다음 줄이 작업 입력에 있다고 가정합니다.
replicas: 4
strategy: canary
percentage: 25
이 경우 배포 hello-world-baseline
및 hello-world-canary
각각 하나의 복제본으로 만들어집니다. 기준 변형은 배포 전의 4개 복제본 변형인 안정적인 버전과 동일한 이미지 및 태그를 사용하여 생성됩니다. 카나리아 변형은 새로 배포된 변경 내용에 해당하는 이미지 및 태그를 사용하여 만들어집니다.
baselineAndCanaryReplicas
-
기준 및 카나리아 복제본
string
;
strategy = Canary && action = deploy && trafficSplitMethod = SMI
때 필요합니다. 기본값은 1
입니다.
trafficSplitMethod
smi
설정하면 서비스 메시 평면에서 트래픽 분할 비율이 제어됩니다. 트래픽 분할과 독립적으로 카나리아 및 기준 변형에 대한 실제 복제본 수를 제어할 수 있습니다.
예를 들어 입력 배포 매니페스트가 안정적인 변형에 대해 30개의 복제본을 지정한다고 가정합니다. 또한 작업에 대해 다음 입력을 지정한다고 가정합니다.
strategy: canary
trafficSplitMethod: smi
percentage: 20
baselineAndCanaryReplicas: 1
이 경우 안정적인 변형은 트래픽의 80% 수신하는 반면 기준 및 카나리아 변형은 각각 지정된 20%절반을 받습니다. 기준 및 카나리아 변형은 각각 3개의 복제본을 수신하지 않습니다. 대신 지정된 수의 복제본을 받습니다. 즉, 각각 하나의 복제본을 받습니다.
매니페스트manifests
-
string
;
action = deploy || action = promote || action = reject
때 필요합니다.
배포에 사용할 매니페스트 파일의 경로를 지정합니다. 각 줄은 단일 경로를 나타냅니다. 파일 일치 패턴 각 줄에 허용되는 값입니다.
containers
-
컨테이너
string
; 선택 사항입니다.
action = deploy || action = promote || action = bake
때 사용합니다.
매니페스트 파일의 대체에 사용할 이미지의 정규화된 리소스 URL을 지정합니다. URL contosodemo.azurecr.io/helloworld:test
예입니다.
ImagePullSecretsimagePullSecrets
-
string
; 선택 사항입니다.
action = deploy || action = promote
때 사용합니다.
각 줄에 클러스터 내에서 이미 설정된 Docker 레지스트리 비밀의 이름이 포함된 여러 줄 입력을 지정합니다. 각 비밀 이름은 입력 매니페스트 파일에 있는 워크로드에 대한 imagePullSecrets
아래에 추가됩니다.
렌더링 엔진renderType
-
string
; 선택 사항입니다.
action = bake
때 사용합니다. 허용되는 값: helm
, kompose
, kustomize
. 기본값은 helm
입니다.
매니페스트 파일을 생성하는 데 사용되는 렌더링 형식을 지정합니다.
docker 작성 파일대한 dockerComposeFile
- 경로
string
;
action = bake && renderType = kompose
때 필요합니다.
docker-compose 파일 경로를 지정합니다.
helmChart
-
Helm 차트
string
;
action = bake && renderType = helm
때 필요합니다.
구울 Helm 차트 경로를 지정합니다.
releaseName
-
Helm 릴리스 이름
string
; 선택 사항입니다.
action = bake && renderType = helm
때 사용합니다.
사용할 Helm 릴리스 이름을 지정합니다.
파일재정의 overrideFiles
-
string
; 선택 사항입니다.
action = bake && renderType = helm
때 사용합니다.
재정의 파일의 경로를 허용하는 여러 줄 입력을 지정합니다. 이 파일은 Helm 차트의 매니페스트 파일을 구울 때 사용됩니다.
overrides
-
재정의
string
; 선택 사항입니다.
action = bake && renderType = helm
때 사용합니다.
설정할 재정의 값을 지정합니다.
kustomizationPath
-
Kustomization 경로
string
; 선택 사항입니다.
action = bake && renderType = kustomize
때 사용합니다.
파일을 포함하는 디렉터리의 경로여야 하는 인수 또는 리포지토리 루트와 관련하여 same
지정하는 경로 접미사가 있는 git 리포지토리 URL을 지정합니다.
패치할 리소스 resourceToPatch
-
string
;
action = patch
때 필요합니다. 허용되는 값: file
, name
. 기본값은 file
입니다.
다음 패치 방법 중 하나를 나타냅니다.
- 매니페스트 파일은 패치할 개체를 식별합니다.
- 개별 개체는 종류 및 이름으로 패치 대상으로 식별됩니다.
허용되는 값은 파일 및 이름.
resourceFileToPatch
-
파일 경로
string
;
action = patch && resourceToPatch = file
때 필요합니다.
패치에 사용되는 파일의 경로를 지정합니다.
kind
-
종류
string
;
action = scale || resourceToPatch = name
때 필요합니다. 허용되는 값: deployment
, replicaset
, statefulset
.
deployment
, replicaSet
등과 같은 K8s 개체의 종류를 지정합니다.
name
-
이름
string
;
action = scale || resourceToPatch = name
때 필요합니다.
K8s 개체의 이름을 지정합니다.
replicas
-
복제본 수
string
;
action = scale
때 필요합니다.
크기를 조정할 복제본 수를 지정합니다.
replicas
-
복제본 수
string
;
action = scale
때 필요합니다.
K8s 개체의 이름을 지정합니다.
mergeStrategy
-
병합 전략
string
;
action = patch
때 필요합니다. 허용되는 값: json
, merge
, strategic
. 기본값은 strategic
입니다.
제공되는 패치의 유형을 지정합니다.
arguments
-
인수
string
; 선택 사항입니다.
action = delete
때 사용합니다.
kubectl delete
명령에 대한 인수를 지정합니다. 예: arguments: deployment hello-world foo-bar
patch
-
패치
string
;
action = patch
때 필요합니다.
패치의 내용을 지정합니다.
secretType
-
비밀 유형
string
;
action = createSecret
때 필요합니다. 허용되는 값: dockerRegistry
, generic
. 기본값은 dockerRegistry
입니다.
제네릭 또는 docker imagepullsecret
만들거나 업데이트합니다. 선택한 레지스트리의 dockerRegistry
만들거나 업데이트할 imagepullsecret
지정합니다.
imagePullSecret
컨테이너 레지스트리 암호가 포함된 비밀을 Kubelet에 전달하는 방법이므로 Pod를 대신하여 프라이빗 이미지를 끌어올 수 있습니다.
secretName
-
비밀 이름
string
; 선택 사항입니다.
action = createSecret
때 사용합니다.
비밀의 이름을 지정합니다. Kubernetes YAML 구성 파일에서 이 비밀 이름을 사용할 수 있습니다.
secretArguments
-
인수
string
; 선택 사항입니다.
action = createSecret && secretType = generic
때 사용합니다.
비밀로 삽입할 키와 리터럴 값을 지정합니다. 예를 들어 --from-literal=key1=value1
--from-literal=key2="top secret"
.
Docker 레지스트리 서비스 연결dockerRegistryEndpoint
-
string
; 선택 사항입니다.
action = createSecret && secretType = dockerRegistry
때 사용합니다.
클러스터 내에서 Docker 레지스트리 비밀을 만드는 데 사용되는 지정된 서비스 연결의 자격 증명을 지정합니다.
imagePullSecrets
필드 아래의 매니페스트 파일은 이 비밀의 이름을 참조할 수 있습니다.
롤아웃 상태대한 rolloutStatusTimeout
- 제한 시간
string
; 선택 사항입니다.
action = deploy || action = patch || action = scale || action = promote
때 사용합니다. 기본값은 0
입니다.
watch on rollout
상태가 종료되기 전에 대기할 시간(초)을 지정합니다.
resourceType
-
리소스 종류
string
; 선택 사항입니다.
action = deploy
때 사용합니다. 기본값은 Microsoft.ContainerService/managedClusters
입니다.
리소스의 유형(플릿, 관리형 클러스터)입니다.
작업 제어 옵션
모든 작업에는 작업 입력 외에도 제어 옵션이 있습니다. 자세한 내용은 컨트롤 옵션 및 일반적인 작업 속성참조하세요.
출력 변수
이 작업은 다운스트림 단계, 작업 및 단계에서 사용할 수 있는 다음 출력 변수정의합니다.
manifestsBundle
bake action에 의해 생성된 매니페스트 번들의 위치
비고
AKS에 액세스할 때 Kubernetes Service 연결 고려 사항
다음 옵션 중 원하는 옵션을 사용하여 Kubernetes 서비스 연결을 만들 수 있습니다.
- 쿠버구성
- 서비스 계정
- Azure 구독
Azure 구독 옵션을 선택할 때 서비스 연결 구성 시 Azure DevOps에서 Kubernetes에 액세스할 수 있어야 합니다. 서비스 연결을 만들 수 없는 여러 가지 이유가 있을 수 있습니다. 예를 들어 프라이빗 클러스터 만들거나 클러스터에 로컬 계정이 비활성화된 있습니다. 이러한 경우 Azure DevOps는 서비스 연결 구성 시 클러스터에 연결할 수 없으며 네임스페이스 로드 중단된 것을 볼 수 있습니다.
Kubernetes 1.24부터 수명이 긴 토큰은 더 이상 기본 생성되지. Kubernetes는 수명이 긴 토큰을 사용하지 않는 것이 좋습니다. 따라서 Azure 구독 옵션으로 만든 Kubernetes 서비스 연결을 사용하는 작업은 인증에 필요한 영구 토큰에 액세스할 수 없으며 Kubernetes 클러스터에 액세스할 수 없습니다. 이로 인해 고정된 네임스페이스 대화 상자가 로드됩니다.
Azure Resource Manager 서비스 연결을 사용하여 AKS에 액세스
AKS 고객의 경우 Azure Resource Manager 서비스 연결 유형은 프라이빗 클러스터 또는 로컬 계정이 비활성화된 클러스터에 연결하는 가장 좋은 방법을 제공합니다. 이 메서드는 서비스 연결을 만들 때 클러스터 연결에 종속되지 않습니다. AKS에 대한 액세스는 파이프라인 런타임으로 지연되며 다음과 같은 이점이 있습니다.
- (프라이빗) AKS 클러스터에 대한 액세스는 클러스터에 대한 가시선이 있는 자체 호스팅 또는 확장 집합 에이전트에서 수행할 수 있습니다.
- Azure Resource Manager 서비스 연결을 사용하는 모든 작업에 대해 토큰이 만들어집니다. 이렇게 하면 Kubernetes 권장 수명이 짧은 토큰을 사용하여 Kubernetes에 연결할 수 있습니다.
- 로컬 계정을 사용하지 않도록 설정한 경우에도 AKS에 액세스할 수 있습니다.
서비스 연결 FAQ
다음 오류 메시지가 표시됩니다. 서비스 계정과 연결된 비밀을 찾을 수 없습니다. 무슨 일이죠?
Azure 구독 옵션을 사용하여 Kubernetes 서비스 연결을 사용하고 있습니다. 이 메서드를 업데이트하여 수명이 긴 토큰을 만듭니다. 5월 중순에 출시될 예정입니다. 그러나 Kubernetes 지침따라 수명이 긴 토큰을 사용하지 않고 Azure 서비스 연결 형식 사용을 시작하는 것이 좋습니다.
AKS를 사용하고 있으며 아무것도 변경하지 않으려는 경우 Kubernetes 서비스 연결에서 작업을 계속 사용할 수 있나요?
이 메서드를 업데이트하여 수명이 긴 토큰을 만듭니다. 5월 중순에 출시될 예정입니다. 그러나 이 방법은 Kubernetes 지침반대된다는 점에 유의하세요.
Kubernetes 작업 및 Kubernetes 서비스 연결을 사용하지만 AKS는 사용하지 않습니다. 걱정해야 하나요?
작업은 이전과 같이 계속 작동합니다.
Kubernetes 서비스 연결 형식이 제거되나요?
Kubernetes 작업은 실행 중인 위치에 관계없이 모든 Kubernetes 클러스터에서 작동합니다. Kubernetes 서비스 연결은 계속 존재합니다.
나는 AKS 고객이고 모든 것이 잘 실행되고 있습니다, 내가 행동해야합니까?
아무것도 변경할 필요가 없습니다. Kubernetes 서비스 연결을 사용하고 만드는 동안 Azure 구독을 선택한 경우 수명이 긴 토큰 사용하는Kubernetes 지침을 알고 있어야 합니다.
Kubernetes 환경을 만들고 있으며 서비스 연결을 사용할 수 있는 옵션이 없습니다.
환경을 만드는 동안 AKS에 액세스할 수 없는 경우 빈 환경을 사용하고 connectionType
입력을 Azure Resource Manager 서비스 연결로 설정할 수 있습니다.
AZURE Active Directory RBAC를 사용하여 AKS를 구성했는데 파이프라인이 작동하지 않습니다. 이러한 업데이트가 해결될까요?
AAD RBAC를 사용할 때 Kubernetes에 액세스하는 것은 토큰 생성과 관련이 없습니다. 대화형 프롬프트를 방지하기 위해 향후 업데이트에서 kubelogin 지원합니다.
빌드 또는 릴리스 파이프라인에서 Kubernetes 매니페스트 작업을 사용하여 매니페스트를 구우고 Kubernetes 클러스터에 배포합니다.
이 작업은 다음을 지원합니다.
아티팩트 대체: 배포 작업은 태그 및 다이제스트와 함께 지정할 수 있는 컨테이너 이미지 목록을 입력으로 사용합니다. 클러스터에 애플리케이션하기 전에 동일한 입력이 비템플래티드 매니페스트 파일로 대체됩니다. 이렇게 대체하면 클러스터 노드가 올바른 버전의 이미지를 끌어올 수 있습니다.
매니페스트 안정성: 배포된 Kubernetes 개체의 롤아웃 상태를 확인합니다. 안정성 검사는 태스크 상태가 성공인지 실패인지를 확인하기 위해 통합됩니다.
추적 가능성 주석: 주석이 배포된 Kubernetes 개체에 추가되어 추적 가능성 정보를 중첩합니다. 지원되는 주석은 다음과 같습니다.
- azure-pipelines/org
- azure-pipelines/프로젝트
- azure-pipelines/파이프라인
- azure-pipelines/pipelineId
- azure-pipelines/실행
- azure-pipelines/executionURI
- azure-pipelines/jobName
비밀 처리:
createSecret
작업을 사용하면 Docker 레지스트리 서비스 연결을 사용하여 Docker 레지스트리 비밀을 만들 수 있습니다. 또한 일반 텍스트 변수 또는 비밀 변수를 사용하여 일반 비밀을 만들 수 있습니다. 클러스터에 배포하기 전에secrets
작업과 함께deploy
입력을 사용하여 입력 매니페스트 파일을 적절한imagePullSecrets
값으로 보강할 수 있습니다.Bake 매니페스트: 작업의
bake
작업을 통해 템플릿을 Kubernetes 매니페스트 파일로 베이킹할 수 있습니다. 이 작업은 Helm, Compose 및 Kustomize와 같은 도구를 사용합니다. 베이킹을 사용하면 이러한 Kubernetes 매니페스트 파일을 클러스터에 배포하는 데 사용할 수 있습니다.배포 전략:
canary
작업을 사용하여deploy
전략을 선택하면-baseline
및-canary
접미사가 있는 워크로드 이름을 만듭니다. 태스크는 트래픽 분할의 두 가지 방법을 지원합니다.서비스 메시 인터페이스: SMI(서비스 메시 인터페이스) 추상화는
Linkerd
및Istio
같은 서비스 메시 공급자를 사용하여 구성할 수 있습니다. Kubernetes 매니페스트 작업은 배포 전략의 수명 주기 동안 SMITrafficSplit
개체를 안정, 기준 및 카나리아 서비스에 매핑합니다.서비스 메시를 기반으로 하고 이 작업을 사용하는 카나리아 배포가 더 정확합니다. 이 정확도는 서비스 메시 공급자가 트래픽의 세분화된 백분율 기반 분할을 사용하도록 설정하는 방법 때문입니다. 서비스 메시는 Pod에 삽입되는 서비스 레지스트리 및 사이드카 컨테이너를 사용합니다. 이 주입은 세분화된 트래픽 분할을 달성하기 위해 애플리케이션 컨테이너와 함께 발생합니다.
서비스 메시 없는 Kubernetes: 서비스 메시가 없는 경우 요청 수준에서 원하는 정확한 비율 분할을 얻지 못할 수 있습니다. 그러나 안정적인 변형 옆에 기준 및 카나리아 변형을 사용하여 카나리아 배포를 수행할 수 있습니다.
이 서비스는 선택기 레이블 제약 조건이 충족됨에 따라 세 가지 워크로드 변형의 Pod에 요청을 보냅니다. Kubernetes 매니페스트는 기준 및 카나리아 변형을 만들 때 이러한 요청을 적용합니다. 이 라우팅 동작은 카나리아에 대한 총 요청의 일부만 라우팅하는 의도된 효과를 달성합니다.
릴리스 파이프라인에서 수동 개입 태스크 또는 YAML 파이프라인의 지연 작업 사용하여 기준 및 카나리아 워크로드를 비교합니다. 작업의 승격 또는 거부 작업을 사용하기 전에 비교를 수행합니다.
배포 작업
다음 YAML 코드는 매니페스트 파일을 사용하여 Kubernetes 네임스페이스에 배포하는 예제입니다.
steps:
- task: KubernetesManifest@0
displayName: Deploy
inputs:
kubernetesServiceConnection: someK8sSC1
namespace: default
manifests: |
manifests/deployment.yml
manifests/service.yml
containers: |
foo/demo:$(tagVariable1)
bar/demo:$(tagVariable2)
imagePullSecrets: |
some-secret
some-other-secret
위의 예제에서 태스크는 매니페스트 파일의 이미지 필드에서 foo/demo
이미지와 bar/demo
일치 항목을 찾으려고 시도합니다. 검색된 각 일치 항목에 대해 tagVariable1
또는 tagVariable2
값이 이미지 이름에 태그로 추가됩니다. 아티팩트 대체를 위해 컨테이너 입력에서 다이제스트를 지정할 수도 있습니다.
비고
배포 전략과 관련된 YAML 입력을 사용하여 deploy
, promote
및 reject
작업을 작성할 수 있지만 현재 빌드 파이프라인에는 수동 개입 태스크에 대한 지원을 사용할 수 없습니다.
릴리스 파이프라인의 경우 다음 순서로 배포 전략과 관련된 작업 및 입력을 사용하는 것이 좋습니다.
-
strategy: canary
및percentage: $(someValue)
사용하여 지정된 배포 작업입니다. - 파이프라인을 일시 중지하고 기준 변형을 카나리아 변형과 비교할 수 있도록 하는 수동 개입 작업입니다.
- 수동 개입 태스크가 다시 시작되고 수동 개입 태스크가 거부되면 실행되는 거부 작업인 경우 실행되는 승격 작업입니다.
비밀 작업 만들기
다음 YAML 코드는 Docker 레지스트리 서비스 연결사용하여 Docker 레지스트리 비밀을 만드는 예제를 보여줍니다.
steps:
- task: KubernetesManifest@0
displayName: Create secret
inputs:
action: createSecret
secretType: dockerRegistry
secretName: foobar
dockerRegistryEndpoint: demoACR
kubernetesServiceConnection: someK8sSC
namespace: default
이 YAML 코드는 일반 비밀의 샘플 생성을 보여줍니다.
steps:
- task: KubernetesManifest@0
displayName: Create secret
inputs:
action: createSecret
secretType: generic
secretName: some-secret
secretArguments: --from-literal=key1=value1
kubernetesServiceConnection: someK8sSC
namespace: default
베이킹 작업
다음 YAML 코드는 Helm 차트에서 매니페스트 파일을 굽는 예제입니다. 첫 번째 작업에서 이름 입력의 사용량을 확인합니다. 이 이름은 나중에 배포 단계에서 참조되어 베이킹 단계에서 생성된 매니페스트의 경로를 지정합니다.
steps:
- task: KubernetesManifest@0
name: bake
displayName: Bake K8s manifests from Helm chart
inputs:
action: bake
helmChart: charts/sample
overrides: 'image.repository:nginx'
- task: KubernetesManifest@0
displayName: Deploy K8s manifests
inputs:
kubernetesServiceConnection: someK8sSC
namespace: default
manifests: $(bake.manifestsBundle)
containers: |
nginx: 1.7.9
비고
릴리스 및 롤백 관리에 Helm을 직접 사용하려면 패키지를 참조하고 Helm 차트 배포 태스크.
Kustomize 예제
다음 YAML 코드는 kustomization.yaml
파일을 포함하는 Kustomize로 생성된 베이킹 매니페스트 파일의 예입니다.
steps:
- task: KubernetesManifest@0
name: bake
displayName: Bake K8s manifests from kustomization path
inputs:
action: bake
renderType: kustomize
kustomizationPath: folderContainingKustomizationFile
- task: KubernetesManifest@0
displayName: Deploy K8s manifests
inputs:
kubernetesServiceConnection: k8sSC1
manifests: $(bake.manifestsBundle)
Kompose 예제
다음 YAML 코드는 Docker Compose의 변환 도구인 Kompose를 사용하여 생성된 베이킹 매니페스트 파일의 예입니다.
steps:
- task: KubernetesManifest@0
name: bake
displayName: Bake K8s manifests from Docker Compose
inputs:
action: bake
renderType: kompose
dockerComposeFile: docker-compose.yaml
- task: KubernetesManifest@0
displayName: Deploy K8s manifests
inputs:
kubernetesServiceConnection: k8sSC1
manifests: $(bake.manifestsBundle)
스케일링 작업
다음 YAML 코드는 개체 크기를 조정하는 예제를 보여줍니다.
steps:
- task: KubernetesManifest@0
displayName: Scale
inputs:
action: scale
kind: deployment
name: bootcamp-demo
replicas: 5
kubernetesServiceConnection: someK8sSC
namespace: default
패치 작업
다음 YAML 코드는 개체 패치의 예를 보여줍니다.
steps:
- task: KubernetesManifest@0
displayName: Patch
inputs:
action: patch
kind: pod
name: demo-5fbc4d6cd9-pgxn4
mergeStrategy: strategic
patch: '{"spec":{"containers":[{"name":"demo","image":"foobar/demo:2239"}]}}'
kubernetesServiceConnection: someK8sSC
namespace: default
삭제 작업
이 YAML 코드는 샘플 개체 삭제를 보여줍니다.
steps:
- task: KubernetesManifest@0
displayName: Delete
inputs:
action: delete
arguments: deployment expressapp
kubernetesServiceConnection: someK8sSC
namespace: default
문제 해결
내 Kubernetes 클러스터가 방화벽 뒤에 있으며 호스트된 에이전트를 사용하고 있습니다. 이 클러스터에 배포하려면 어떻게 해야 하나요?
호스트된 에이전트의 IP 주소를 허용하여 방화벽을 통해 호스트된 에이전트 액세스 권한을 부여할 수 있습니다. 자세한 내용은 에이전트 IP 범위를 참조하세요.
카나리아 배포를 통해 안정적이고 변형된 서비스 경로에 대한 요청은 어떻게 작동하나요?
Kubernetes의 Pod와 서비스 간의 레이블 선택기 관계를 통해 단일 서비스가 요청을 안정 및 카나리아 변형 모두로 라우팅하도록 배포를 설정할 수 있습니다. Kubernetes 매니페스트 작업은 카나리아 배포에 이 작업을 사용합니다.
태스크에 입력 매니페스트 파일에 정의된 각 워크로드(Deployment, ReplicaSet, Pod, ...)에 대해 action: deploy
및 strategy: canary
입력이 포함된 경우 배포의 -baseline
및 -canary
변형이 만들어집니다. 이 예제에서는 입력 매니페스트 파일에 배포 sampleapp
있으며 파이프라인의 실행 번호 22가 완료된 후 sampleapp
이라는 이 배포의 안정적인 변형이 클러스터에 배포됩니다. 후속 실행(이 경우 실행 번호 23)에서 action: deploy
및 strategy: canary
있는 Kubernetes 매니페스트 작업은 복제본 수가 입력 매니페스트 파일에 따라 percentage
최종 안정적인 변형에 대해 원하는 복제본 수의 값과 함께 sampleapp
작업 입력의 곱에 따라 결정되는 sampleapp-baseline 및 sampleapp-canary 배포를 만듭니다.
복제본 수를 제외하고 기준 버전은 안정적인 변형과 동일한 구성을 가지며 카나리아 버전에는 현재 실행에서 도입되는 새로운 변경 내용이 있습니다(이 경우 실행 번호 23). 위에서 언급한 단계 이후 파이프라인에서 수동 개입이 설정된 경우 파이프라인 관리자가 기준 및 카나리아 버전에 대한 주요 메트릭을 평가하고 카나리아 변경 내용이 전체 롤아웃에 대해 안전하고 좋은지 여부를 결정할 수 있도록 파이프라인을 일시 중지할 수 있습니다.
Kubernetes 매니페스트 작업의action: promote
및 strategy: canary
또는 action: reject
및 strategy: canary
입력을 사용하여 카나리아 변경 내용을 각각 승격하거나 거부할 수 있습니다. 두 경우 모두 이 단계가 끝나면 입력 매니페스트 파일에 선언된 워크로드의 안정적인 변형만 클러스터에 배포되는 반면 임시 기준 및 카나리아 버전은 정리됩니다.