이 문서에서는 서비스 기반 네트워킹을 사용하여 Cloud Deploy로 GKE 또는 GKE Enterprise에 애플리케이션을 배포하기 위해 카나리아 배포를 구성하고 사용하는 방법을 설명합니다.
카나리아 배포는 애플리케이션의 새 버전을 점진적으로 출시하는 배포 방식입니다. 애플리케이션의 성능을 모니터링하면서 새 버전으로 전송되는 트래픽의 비율을 점진적으로 늘립니다. 이렇게 하면 잠재적인 문제를 조기에 파악하고 사용자에게 미치는 영향을 최소화할 수 있습니다.
서비스 기반 네트워킹을 사용하는 GKE 및 GKE Enterprise에서 카나리아 배포가 작동하는 방식
배포 리소스 및 서비스 리소스 이름을 제공합니다.
Cloud Deploy가 현재 배포 이름과
-canary
를 사용해서 추가적인 배포 리소스를 만듭니다.
보안 비밀 및 ConfigMap도 -canary
를 사용하여 복사되고 이름이 변경됩니다.
Cloud Deploy가 서비스를 수정하여 현재 배포 및 카나리아 포드의 포드를 선택하도록 선택기를 조정합니다.
Cloud Deploy는 포드 프로비저닝 섹션에 설명된 계산을 기반으로 카나리아에 사용할 포드 수를 계산합니다. 이 계산은 포드 오버프로비저닝 사용 설정 또는 중지 여부에 따라 달라집니다.
stable
단계로 건너뛰는 경우 Cloud Deploy가 후속 카나리아 실행에 사용할 수 있도록 포드 일치에 사용할 라벨을 추가합니다.Cloud Deploy가 단계별 포드의 백분율이 포함된 배포를 만들어서 각 단계에 대해 업데이트합니다. 이렇게 하려면 포드 수를 원래 포드 수의 백분율로 계산합니다. 이로 인해 부정확한 트래픽 분할이 발생할 수 있습니다. 정확한 트래픽 분할이 필요하면 Gateway API를 사용하여 이를 수행하면 됩니다.
stable
단계 중에는-canary
배포가 0으로 축소되고 원래 배포가 새 배포로 바뀝니다.오버프로비저닝을 사용 중지하지 않는 한 Cloud Deploy는
stable
단계까지 원래 배포를 수정하지 않습니다.
Cloud Deploy는 요청된 카나리아 백분율을 최대한 달성하기 위해 포드를 프로비저닝합니다. 이는 포드에 대한 트래픽이 아닌 포드 수를 기반으로 합니다. 트래픽을 기반으로 카나리아를 사용하려면 Gateway API를 사용해야 합니다.
GKE 네트워크 기반 카나리아의 경우 포드 오버프로비저닝을 사용 설정하거나 중지할 수 있습니다. 다음 섹션에서는 Cloud Deploy가 각 카나리아 단계에서 카나리아 배포에 프로비저닝할 포드 수를 계산하는 방법을 설명합니다.
오버프로비저닝이 사용 설정된 포드 프로비저닝
오버프로비저닝(disablePodOverprovisioning: false
)을 사용 설정하면 Cloud Deploy에서 기존 배포를 실행하는 포드 수를 기준으로 사용자가 원하는 카나리아 백분율을 실행하기에 충분한 추가 포드를 만들 수 있습니다. 다음 수식은 포드 오버프로비저닝이 사용 설정된 경우 Cloud Deploy가 각 카나리아 단계에서 카나리아 배포에 프로비저닝할 포드 수를 계산하는 방법을 보여줍니다.
math.Ceil( percentage * ReplicaCountOfDeploymentOnCluster / (100-percentage))
이 수식에서는 현재 복제본 수(카나리아 전에 이미 보유하고 있던 포드 수)에 해당 단계의 카나리아 백분율을 곱하고 그 결과를 (100에서 해당 백분율을 뺀 값)으로 나눕니다.
예를 들어 4개의 포드가 이미 있고 카나리아 단계가 50%인 경우 카나리아 포드 수는 4개입니다. (100-percentage
의 결과가 백분율: 100-50=50
으로 사용되고 .50
으로 처리됩니다.)
포드 오버프로비저닝은 기본 동작입니다.
오버프로비저닝이 사용 중지된 포드 프로비저닝
Cloud Deploy가 복제본 수를 늘리지 않도록 오버프로비저닝(disablePodOverprovisioning: true
)을 중지할 수 있습니다.
다음 수식은 포드 오버프로비저닝이 중지된 경우 Cloud Deploy가 각 카나리아 단계에서 카나리아 배포의 포드 프로비저닝을 계산하는 방법을 보여줍니다.
math.Ceil( (ReplicaCountOfDeploymentOnCluster + ReplicaCountOfCanaryDeploymentOnCluster) * percentage)
이 수식에서 ReplicaCountOfCanaryDeploymentOnCluster
는 이미 카나리아 단계가 있는 경우에만 존재합니다. 첫 번째 카나리아 단계인 경우에는 ReplicaCountOfCanaryDeploymentOnCluster
가 없습니다.
포드 4개로 시작하는 경우 이 숫자에 카나리아 백분율(예: 50% 또는 .5
)을 곱하여 2
를 구합니다. 따라서 원래 배포가 이제 2개로 축소되고 카나리아 배포에는 2개의 새 포드가 생성됩니다. 카나리아 단계가 75%이면 2
(원본 배포) +2
(첫 번째 카나리아 단계) *.75
를 통해 카나리아 포드 3
개와 원래 배포를 실행하는 포드 1
개를 얻게 됩니다.
Cloud Deploy를 사용하면 단일 스테이지 또는 여러 스테이지에서 GKE 및 GKE Enterprise에 카나리아 배포를 구성할 수 있습니다.
이 안내에는 카나리아 구성과 관련된 내용만 포함됩니다. Google Kubernetes Engine 클러스터에 배포 문서에는 배포 파이프라인 구성 및 실행에 대한 일반 안내가 포함되어 있습니다.
필수 권한 필요
Cloud Deploy를 사용하는 데 필요한 다른 Identity and Access Management 권한 외에도 카나리아 배포에 필요할 수 있는 추가 작업을 수행하기 위해 다음 권한이 필요합니다.
clouddeploy.rollouts.advance
clouddeploy.rollouts.ignoreJob
clouddeploy.rollouts.cancel
clouddeploy.rollouts.retryJob
clouddeploy.jobRuns.get
clouddeploy.jobRuns.list
clouddeploy.jobRuns.terminate
이러한 권한이 포함된 사용 가능한 역할에 대한 자세한 내용은 IAM 역할 및 권한을 참조하세요.
skaffold.yaml
준비
skaffold.yaml
파일은 Kubernetes 매니페스트가 렌더링되고 배포되는 방식을 정의합니다. GKE/GKE Enterprise에 대한 카나리아 배포의 경우 매니페스트를 올바르게 가리키고 필요한 빌드 아티팩트를 정의해야 합니다. skaffold.yaml
자체에는 표준 배포에 필요한 항목 이외의 특별한 카나리아 관련 구성이 필요하지 않습니다. Skaffold 프로필을 사용하여 맞춤 카나리아 단계의 다양한 매니페스트 변형을 관리할 수 있습니다.
Kubernetes 매니페스트 준비
Kubernetes 매니페스트에는 Deployment
리소스와 Service
리소스가 모두 포함되어야 합니다.
Service
는 Deployment
에서 관리하는 포드의 라벨과 일치하는 selector
를 정의해야 합니다.
Cloud Deploy가 찾는 기본 라벨은 app
이지만 파이프라인에서 구성할 수 있습니다.
자동화된 카나리아 구성
표준 Kubernetes 서비스 네트워킹을 사용하여 특정 GKE 또는 GKE Enterprise 스테이지의 배포 파이프라인 정의 내에서 직접 자동화된 카나리아를 구성합니다.
파이프라인 단계에서 다음과 같이 strategy
속성을 포함합니다.
serialPipeline:
stages:
- targetId: prod
profiles: []
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: "SERVICE_NAME"
deployment: "DEPLOYMENT_NAME"
podSelectorLabel: "LABEL"
canaryDeployment:
percentages: [PERCENTAGES]
verify: true|false
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
이 구성에서
SERVICE_NAME은 매니페스트에 정의된 Kubernetes 서비스의 이름입니다.
DEPLOYMENT_NAME은 매니페스트에 정의된 Kubernetes 배포의 이름입니다.
LABEL은 포드 선택기 라벨입니다. 이 값은 매니페스트에 정의된 Kubernetes 서비스의 라벨 선택기와 일치해야 합니다. 이는 선택사항입니다. 기본값은
app
입니다.PERCENTAGES는 카나리아 증분을 나타내는 쉼표로 구분된 백분율 값 목록입니다(예:
[5, 25, 50]
).또한 카나리아에서 100% 배포가 간주되고
stable
단계에서 처리되므로 여기에는100
이 포함되지 않습니다.배포 확인(
verify: true
)을 사용 설정할 수 있습니다. 이렇게 하면 각 단계에서verify
작업이 사용 설정됩니다.PREDEPLOY_ACTION
skaffold.yaml
에서 배포 전에 실행할 맞춤 액션을 정의하는 데 사용한 ACTION_NAME과 동일합니다.POSTDEPLOY_ACTION
skaffold.yaml
에서 배포 후에 실행할 맞춤 액션을 정의하는 데 사용한 ACTION_NAME과 동일합니다.
커스텀 카나리아 구성
Cloud Deploy에서 제공하는 자동화에 완전히 의존하는 대신 카나리아를 수동으로 구성할 수 있습니다. 커스텀 카나리아 구성을 사용하면 배포 파이프라인 정의에 다음을 지정합니다.
출시 단계 이름
완전 자동화된 카나리아에서 Cloud Deploy는 단계 이름을 지정합니다(예:
canary-25
,canary-75
,stable
). 그러나 커스텀 카나리아를 사용하면 이 카나리아 단계의 모든 단계에서 고유하고 리소스 ID 제한을 준수하는 한 각 단계에 이름을 지정할 수 있습니다. 하지만 최종(100%) 단계 이름은stable
이어야 합니다.단계별 백분율 목표
단계별로 별도로 백분율을 지정합니다.
단계에 사용할 Skaffold 프로필
각 단계 또는 동일한 프로필 또는 모든 조합에 대해 별도의 Skaffold 프로필을 사용할 수 있습니다. 각 프로필은 서로 다른 Kubernetes 매니페스트를 사용할 수 있습니다. 지정된 단계에 대해 하나를 초과하는 프로필을 사용할 수도 있습니다. Cloud Deploy는 이를 결합합니다.
단계에 확인 작업이 있는지 여부
확인을 사용 설정하는 경우 확인에 사용할
skaffold.yaml
도 구성해야 합니다.단계에 배포 전 또는 배포 후 작업이 있는지 여부
배포 전 또는 배포 후 작업을 사용 설정할 경우 이러한 작업의
skaffold.yaml
을 구성해야 합니다.
커스텀 카나리아에서는 모든 대상 유형이 지원됩니다.
커스텀 카나리아 구성 요소
다음 YAML에서는 완전 커스텀 카나리아 배포 단계 구성을 보여줍니다.
strategy:
canary:
# Custom configuration for each canary phase
customCanaryDeployment:
phaseConfigs:
- phaseId: "PHASE1_NAME"
percentage: PERCENTAGE1
profiles: [ "PROFILE_NAME" ]
verify: true | false
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
- …
- phaseId: "stable"
percentage: 100
profiles: [ "LAST_PROFILE_NAME" ]
verify: true|false
predeploy:
actions: "PREDEPLOY_ACTION"
postdeploy:
actions: "POSTDEPLOY_ACTION"
이 YAML에서
PHASE1_NAME
단계 이름입니다. 각 단계 이름은 고유해야 합니다.
[ "PROFILE_NAME" ]
단계에 사용할 프로필의 이름입니다. 각 단계에 동일한 프로필을 사용하거나 단계마다 다른 프로필을 사용하거나 이를 조합하여 사용할 수 있습니다. 또한 프로필을 하나 넘게 지정할 수 있습니다. Cloud Deploy는 지정된 모든 프로필과 함께 전체 단계에서 사용되는 프로필 또는 매니페스트를 사용합니다.
stable
마지막 단계의 이름은
stable
이어야 합니다.PERCENTAGE1
첫 번째 단계에 배포할 백분율입니다. 각 단계에는 고유한 백분율 값이 있어야 하며 해당 값은 전체 백분율(예:
10.5
아님)이어야 하며 단계는 오름차순이어야 합니다.verify: true|false
단계에 대해 확인 작업을 포함할지 여부를 Cloud Deploy에 알려줍니다. 확인을 사용할 각 단계에 대해 Scaffold는 해당 단계에 대해 렌더링 및 배포에 지정된 동일한 프로파일을 확인에 사용합니다.
PREDEPLOY_ACTION
skaffold.yaml
에서 배포 전에 실행할 맞춤 액션을 정의하는 데 사용한 ACTION_NAME과 동일합니다.POSTDEPLOY_ACTION
skaffold.yaml
에서 배포 후 실행할 맞춤 액션을 정의하는 데 사용한 ACTION_NAME과 동일합니다.
마지막 단계의 백분율은 100
이어야 합니다. 이 customCanaryDeployment
스탠자에서 구성한 순서에 따라 단계가 실행되지만 백분율 값이 오름차순이 아닌 경우 배포 파이프라인을 등록하는 명령어가 실패하고 오류가 발생합니다.
커스텀 카나리아 구성에는 runtimeConfig
스탠자가 포함되지 않습니다. runtimeConfig
를 포함하면 커스텀 서비스 기반 카나리아로 간주됩니다.
커스텀 자동 카나리아 구성
이렇게 하면 맞춤 단계 정의 (이름, 비율, 프로필, 확인, 후크)가 GKE 또는 GKE Enterprise용 Cloud Deploy의 자동 트래픽 관리와 결합됩니다. 단계를 정의하면 Cloud Deploy에서 백분율과 선택한 runtimeConfig
에 따라 기본 리소스 조작을 처리합니다.
이를 구성하려면 strategy.canary 블록 내에 serviceNetworking
이 포함된 runtimeConfig
섹션과 customCanaryDeployment
섹션 (phaseConfigs 정의)을 모두 포함하세요. Cloud Deploy는 지정된 Skaffold 프로필을 렌더링에 사용하지만 runtimeConfig
및 단계 비율에 따라 트래픽을 자동으로 조정합니다.
serialPipeline:
stages:
- targetId: gke-prod
profiles: []
strategy:
canary:
# Include runtimeConfig for automatic traffic management
runtimeConfig:
kubernetes:
serviceNetworking:
service: "my-app"
deployment: "my-deployment"
# Include customCanaryDeployment for phase customization
customCanaryDeployment:
phaseConfigs:
- phaseId: "warmup"
percentage: 10
profiles: ["profile-a"] # Profile used for rendering this phase
verify: true
- phaseId: "scaling"
percentage: 50
profiles: ["profile-b"] # Different profile for this phase
verify: true
- phaseId: "stable"
percentage: 100
profiles: ["profile-b"] # Can reuse profiles
verify: true
GKE 또는 GKE Enterprise 카나리아 실행
파이프라인 및 타겟 등록: 배포 파이프라인과 GKE 또는 GKE Enterprise 타겟 구성 파일을 적용합니다.
gcloud deploy apply --file=delivery-pipeline.yaml --region=REGION gcloud deploy apply --file=gke-targets.yaml --region=REGION
배포 파이프라인에는 선택한 런타임에 자동 또는 커스텀 카나리아 구성이 포함됩니다.
버전 만들기: 이미지 이름을 제공하여 배포를 시작합니다.
gcloud deploy releases create RELEASE_NAME \ --delivery-pipeline=PIPELINE_NAME \ --region=REGION # e.g., --images=my-cloudrun-service=gcr.io/my-project/my-app:v1.1 # Add --skaffold-file or --source if not using default Skaffold config discovery
PIPELINE_NAME
으로 식별된 배포 파이프라인에는 이 문서에 설명된 자동 또는 커스텀 카나리아 구성이 포함되어 있습니다.카나리아를 진행합니다.
gcloud CLI
gcloud deploy rollouts advance ROLLOUT_NAME \ --release=RELEASE_NAME \ --delivery-pipeline=PIPELINE_NAME \ --region=REGION
각 항목의 의미는 다음과 같습니다.
ROLLOUT_NAME
은 다음 단계로 진행하려는 현재 출시의 이름입니다.RELEASE_NAME
은 이 출시가 속한 출시 버전의 이름입니다.PIPELINE_NAME
은 이 출시 버전의 배포를 관리하는 데 사용하는 배포 파이프라인의 이름입니다.REGION
은 출시 버전이 생성된 리전의 이름입니다(예:us-central1
). 필수 항목입니다.gcloud deploy rollouts advance
명령어에 대한 자세한 내용은 Google Cloud SDK 참조를 확인하세요.Google Cloud 콘솔
배포 파이프라인 목록에 표시된 파이프라인을 클릭합니다.
배포 파이프라인 세부정보 페이지에는 배포 파이프라인의 진행 상태가 그래픽으로 표시됩니다.
출시 탭의 배포 파이프라인 세부정보에서 출시 이름을 클릭합니다.
해당 출시의 출시 세부정보 페이지가 표시됩니다.
이 예시에서는 출시에
canary-50
단계와stable
단계가 있습니다. 출시에 더 많은 단계나 다른 단계가 있을 수 있습니다.출시 진행을 클릭합니다.
출시가 다음 단계로 진행됩니다.
건너뛴 단계
카나리아를 배포할 때 애플리케이션이 이 런타임에 아직 배포되지 않았으면 Cloud Deploy가 카나리아 단계를 건너뛰고 안정 단계를 실행합니다. 왜 이렇게 되는지 확인하려면 처음으로 단계 건너뛰기를 참조하세요.
다음 단계
카나리아 배포 빠른 시작 사용해 보기
카나리아 출시 수명 주기 관리 방법 알아보기
동시 배포 자세히 알아보기
Cloud Deploy 배포 전략에 대해 자세히 알아보세요.