3.4 Kubernetes 업그레이드와 유지보수
Kubernetes 자체도 주기적으로 업그레이드하고 노드 하드웨어를 점검해야 합니다. 이때 노드에서 Pod를 비우는 drain이 일어나는데, PostgreSQL Pod가 무방비로 쫓겨나면 데이터 손실이나 순단으로 이어질 수 있습니다. CloudNativePG는 PodDisruptionBudget(PDB)과 maintenance window로 drain 과정에서 클러스터를 보호합니다.
노드 유지보수 3단계
노드 점검은 대체로 세 단계를 거칩니다.
- drain: 노드의 워크로드를 다른 노드로 옮깁니다.
- 작업 수행: Kubernetes 업그레이드나 하드웨어 교체를 진행합니다.
- uncordon: 작업이 끝난 노드를 다시 스케줄 대상에 넣습니다.
PodDisruptionBudget
CloudNativePG는 기본적으로 PDB로 클러스터를 보호합니다. drain 요청이 와도 PDB가 동시에 내려갈 수 있는 Pod 수를 제한합니다.
| 상황 | 동작 |
|---|---|
| primary 인스턴스 | drain 전에 자동 switchover |
| 단일 인스턴스 Cluster | 데이터 손실 방지를 위해 drain 차단 |
| 3개 이상 인스턴스 | 한 번에 replica 하나씩만 정지 |
운영 Cluster는 .spec.enablePDB: true(기본값)를 유지하기를 권합니다. drain이 primary를 건드리기 전에 Operator가 replica로 switchover를 마쳐, 노드 점검 중에도 쓰기 가용성을 지킵니다.
개발용 단일 인스턴스 Cluster는 drain이 막히면 오히려 노드 점검이 진행되지 않으므로, PDB를 꺼서 노드를 자유롭게 비울 수 있게 합니다.
apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
name: dev
spec:
instances: 1
enablePDB: false
storage:
size: 1Gi
단일 인스턴스 Cluster 처리
replica가 없는 단일 인스턴스 Cluster는 drain이 곧 순단입니다. reusePVC: false 상태로 노드를 비워야 한다면 두 가지 선택지가 있습니다.
- 순단 감수 —
reusePVC: true로 두면 같은 PVC를 재사용해 다른 노드에서 다시 뜹니다. 재기동 동안의 짧은 순단은 받아들입니다. - scale-up 절차 — 순단을 피하려면 일시적으로 인스턴스를 늘렸다 줄입니다.
노드 cordon
점검할 노드를 cordon해 새 Pod가 배치되지 않게 합니다.
인스턴스 2로 확장
Cluster를 2 인스턴스로 늘려 다른 노드에 replica를 만듭니다.
자동 switchover 대기
Operator가 새 인스턴스로 switchover를 수행합니다.
인스턴스 1로 축소
primary가 옮겨진 뒤 다시 1 인스턴스로 줄입니다.
원래 노드 drain
이제 비어 있는 원래 노드를 안전하게 drain합니다.
nodeMaintenanceWindow (레거시)
로컬 노드 스토리지를 쓰는 환경을 위해 nodeMaintenanceWindow 옵션이 남아 있습니다.
inProgress— 유지보수 모드를 켭니다.reusePVC— 기존 PersistentVolumeClaim을 재사용할지 정합니다.
nodeMaintenanceWindow는 이제 PDB 직접 제어에 밀린 보조 수단이며 하위 호환을 위해 유지됩니다. 유지보수 모드가 켜진 동안에는 self-healing과 rolling update가 제한되므로, 유지보수 기간은 가능한 한 짧게 유지합니다.
drain 실행 시 유의점
kubectl drain을 실행할 때 --delete-emptydir-data 플래그가 필요합니다. 이 플래그는 Operator가 쓰는 내부 emptyDir 볼륨에 영향을 줄 뿐, PostgreSQL 데이터(PVC)에는 영향을 주지 않습니다.
정리
노드 점검은 drain → 작업 → uncordon 순서로 진행되며, drain이 primary를 건드리기 전에 Operator가 replica로 switchover를 마칩니다. 운영 Cluster는 enablePDB: true를 켜 두어 한 번에 replica 하나씩만 정지되게 하고, replica가 없는 단일 인스턴스 Cluster는 순단을 감수(reusePVC: true)하거나 일시적으로 scale-up해 처리합니다. 로컬 스토리지용 nodeMaintenanceWindow는 레거시 보조 수단이므로 유지보수 기간을 짧게 유지하고, kubectl drain에는 --delete-emptydir-data가 필요하지만 이 플래그가 PostgreSQL 데이터(PVC)를 건드리지는 않습니다.
이것으로 Part III를 마칩니다.