ADR-007 — AKS Standard tier + Multi-AZ migration plan
| 항목 | 값 |
|---|---|
| Status | Proposed (2026-05-25 — #828 design step) |
| Date | 2026-05-25 |
| Decider | GenD 코어팀 + 인프라 운영 |
| Related Epic | #828 (AKS Standard tier + Multi-AZ migration) |
| Related Issue | #894 / #897 (cluster CPU 포화 → HA Phase 0 베이스라인 임시 축소 — 본 마이그레이션 prerequisite) |
본 ADR 의 한 줄 결정: AKS prod 클러스터를 Standard tier + 3-AZ 노드풀 구성으로 마이그레이션해 금융권 RFP 의 99.95% uptime SLA + AZ 단위 장애 허용을 만족한다. 마이그레이션은 무중단 4-Phase (신규 노드풀 생성 → 워크로드 cordon/drain → 구 노드풀 제거 → topologySpread 정합) 로 진행한다.
컨텍스트
AKS prod 현황 (2026-05-19, #828 본문에서 인용):
{
"sku": { "name": "Base", "tier": "Free" }, // SLA 없음
"agentPoolProfiles": [
{ "name": "nodepool1", "availabilityZones": null }, // single-AZ
{ "name": "gendpool", "availabilityZones": null } // single-AZ
]
}
$ kubectl get nodes -o jsonpath='{.items[*].metadata.labels.topology\.kubernetes\.io/zone}'
0 0 0 0 0 0 // 6 노드 모두 zone=0
| 항목 | 현재 | 금융권 요구 |
|---|---|---|
| AKS SKU | Free (SLA 없음) | Standard (uptime SLA 99.95%) |
availabilityZones | null (단일 AZ) | [1,2,3] 3 AZ 분산 |
| etcd HA | best-effort | 3-node quorum SLA |
| 노드 분산 | hostname only | hostname + zone |
→ AZ 단위 장애 시 클러스터 전체 다운. 금융권 검수 통과 불가.
결정
1) AKS Standard tier 전환
az aks update -g rg-genos-prod -n aks-genos-prod --tier standard
- 비용: +$73/month per cluster (uptime SLA 99.95%)
- 다운타임: 없음 (control-plane SLA 만 영향)
- 사전 승인 게이트: 재무 + 보안 owner 승인 필요 — 본 ADR 머지가 곧 승인을 의미하지 않음.
2) Multi-AZ 노드풀 신규 생성
기존 노드풀은 availabilityZones=null 로 생성되어 in-place 수정 불가 (AKS 제약). 새 노드풀을 multi-AZ 로 만들고 워크로드를 옮기는 방식만 유일한 해법.
az aks nodepool add -g rg-genos-prod --cluster-name aks-genos-prod \
--name gendpoolaz --mode User --zones 1 2 3 --node-count 6 \
--node-vm-size Standard_D4ds_v5 # 기존과 동급
az aks nodepool add -g rg-genos-prod --cluster-name aks-genos-prod \
--name nodepool1az --mode System --zones 1 2 3 --node-count 3 \
--node-vm-size Standard_D2ds_v5
System mode 노드풀은 클러스터당 1개만 활성 가능. 신규 nodepool1az 를 System mode 로 승격하기 전 구 nodepool1 을 User mode 로 강등 → 신규 활성화 → 구 제거 순서.
3) 워크로드 마이그레이션 (무중단)
prerequisite: HA Phase 0 (#827) 의 HPA + PDB + antiAffinity 가 이미 적용되어 있어야 cordon/drain 시 무중단 보장.
# Phase 0 already merged — see ADR none-yet / commit a3383a2 history
kubectl cordon <old-node>
kubectl drain <old-node> --ignore-daemonsets --delete-emptydir-data --force=false
--force=false 가 핵심 — emptyDir 의존 + PDB violation 시 drain 이 멈춰야 한다. 멈추면 해당 워크로드의 PDB 또는 antiAffinity 가 부정확 — fix 후 재시도.
#897 (cluster CPU 포화) 해소가 본 마이그레이션의 prerequisite. cluster headroom 부족 시 drain 으로 옮긴 pod 가 신규 노드에 schedulable 하지 않을 수 있다. #828 의 cluster autoscaler 동작 검증과 함께 진행.
4) Storage Class multi-zone 검증
Azure Disk RWO 는 zone-bound. zone=0 에 묶인 기존 PVC 는 zone 1/2/3 신규 노드에서 mount 실패.
해법: PVC 별로 다음 중 하나 선택.
| PVC 유형 | 해법 |
|---|---|
| 재생성 가능 (캐시·임시) | 새 zone-aware StorageClass 로 재생성. 기존 데이터 삭제 허용. |
| 데이터 보존 필요 (PG·SeaweedFS) | volume snapshot 생성 → 신규 multi-AZ PVC 로 restore. 마이그레이션 중 read-only 윈도우 필요 (운영 합의). |
| Zone-redundant | ZRS (zone-redundant storage) 옵션 활성화 — 운영에서 추가 비용 발생, 별도 승인. |
5) topologySpreadConstraints 정합
모든 stateless Deployment 의 topologySpreadConstraints 에 topology.kubernetes.io/zone 추가. hostname-spread 만으로는 AZ 분산이 강제되지 않는다.
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule # ScheduleAnyway 는 안전망 부족
labelSelector: { matchLabels: { app: gend-api } }
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: ScheduleAnyway # 기존 hostname 분산 유지
labelSelector: { matchLabels: { app: gend-api } }
DoNotSchedule 채택은 AZ 분산 우선. cluster 가 한 AZ 만 healthy 한 상황에서는 pending pod 가 나오지만, 이건 의도된 동작 (AZ 장애 인식 + 운영 알림).
영향
- 영향 자식 이슈: #828 (본 ADR 의 구현), #894 (#1063 으로 마무리됨 — 본 마이그레이션 완료 후 재상향), #897 (cluster CPU 정리 — 본 마이그레이션의 명시 prereq).
- 운영: GenD 인프라 팀 책임. ArgoCD Application source path 변경 없음 (manifest 만 갱신).
- 회귀 가드: 신규 lint script (
scripts/lint_topology_spread_zone.py— 별도 후속 PR) 가 stateless deployment 의 zone topologySpread 누락을 차단. - 롤백 plan: 구 노드풀을 마이그레이션 완료 후 7일 까지 유지 (재가입 가능). 7일 후 제거.
비목표
- 본 ADR 은 마이그레이션 plan 의 단일 진실의 원천. 실제
az aks명령 실행과 운영 확인은 운영 팀 책임으로 #828 에서 트래킹. - AKS 비용 분석, 가용 zone 선택 (1/2/3 vs 1/2), 다중 region (DR) 은 본 ADR 범위 밖. Phase 2+ 로 미루기.
- KAI Scheduler / HAMi (ADR-005) 와의 호환성은 zone-aware 스케줄링 검증이 필요 — 별도 follow-up.
재검토 트리거
- Azure 가 single-AZ 노드풀의 in-place AZ 추가를 허용 → 본 ADR 의 신규 노드풀 생성 단계 우회 가능.
- 비용 정책 변경으로 Standard tier 가 의무화되거나 Free tier 가 deprecated → 우선순위 상향.
- 금융권 SLA 요건 변경 (
99.99%요구) → DR (다중 region) plan 추가 검토.