애플리케이션 배포(Deployment) 전략은 여러 가지가 있는데, Kubernetes(K8s)가 기본적으로 지원하는 전략과, 직접 구현하거나 서드파티 도구(Argo Rollouts, Flagger 등)가 필요한 전략이 구분됩니다.
방식
- 예전 버전을 죽이고 1개씩 새 버전을 올림
구현 방법
- Kubectl set image deployment hello-deployment hello-deployment=gcr.io/gicipi/deployment:v2


이름 유래
- 광산에서 독가스 배출 유무 판단을, 가스에 민감한 '카나리아' 새를 이용
컨셉
- 예를 들어 전체 리소스의 1~10% 정도만 새 버전으로 올리고 일부 트래픽을 그 쪽에도 흘려보내 봐서 문제가 없으면 나머지도 다 올림
Deployment에서 Workaround
1) 2개의 Deployment 생성 (Rreplica set 값을 다르게!!)
2) 문제가 없으면, 구 버전의 Replica set을 줄이고, 신 버전의 Replica set을 늘림
.
<Kubernetes 배포 전략별 지원 여부 & 다운타임 비교>
| 배포 전략 | 개념 | Kubernetes 기본 지원 | 추가 도구 필요 | Service Downtime |
|---|---|---|---|---|
| Rolling Update | 점진적으로 새 버전 Pod로 교체 (기본 전략) | ✅ | ❌ | ❌ |
| Blue-Green | 기존 버전(Blue)과 새 버전(Green)을 동시에 두고 트래픽 전환 | ❌ | ✅(Argo Rollouts with Argo CD) | ❌(Service 전환 시 순간적 지연) |
| Canary | 일부 트래픽만 새 버전에 전달하여 점진 검증 | ❌ | ✅(Argo Rollouts with Argo CD) | ❌ |
.
<Kubernetes에서 Canary 배포 Workaround 방법>
# Stable 버전
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-stable
spec:
replicas: 9
selector:
matchLabels:
app: myapp
version: stable
template:
metadata:
labels:
app: myapp
version: stable
spec:
containers:
- name: myapp
image: myapp:v1
# Canary 버전
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-canary
spec:
replicas: 1
selector:
matchLabels:
app: myapp
version: canary
template:
metadata:
labels:
app: myapp
version: canary
spec:
containers:
- name: myapp
image: myapp:v2
# Service
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080