3.4 Kubernetes 업그레이드와 유지보수
Kubernetes 자체도 주기적으로 업그레이드하고 노드 하드웨어를 점검해야 한다. 이때 노드에서 Pod를 비우는 drain이 일어나는데, PostgreSQL Pod가 무방비로 쫓겨나면 데이터 손실이나 순단으로 이어질 수 있다. CloudNativePG는 PodDisruptionBudget(PDB)과 maintenance window로 drain 과정에서 클러스터를 보호한다.
노드 유지보수 3단계
노드 점검은 대체로 세 단계를 거친다.
flowchart TD
D["drain<br/>워크로드 이동"]
SW["primary면<br/>switchover 먼저"]
OP["업그레이드·<br/>하드웨어 교체"]
UC["uncordon<br/>노드 복귀"]
D --> SW --> OP --> UC
classDef step fill:#dbeafe,stroke:#1d4ed8,color:#1e3a8a
class D,SW,OP,UC step
- 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는 자동 switchover
- 운영 Cluster는 PDB(
enablePDB: true)를 켜 둔다 — 한 번에 replica 하나씩만 정지 - 단일 인스턴스는 순단 감수(
reusePVC: true) 또는 일시 scale-up으로 처리 nodeMaintenanceWindow는 레거시 보조 수단, 창은 짧게kubectl drain은--delete-emptydir-data필요 (PostgreSQL 데이터는 안전)
이것으로 Part III를 마친다. 다음 Part IV에서는 bootstrap으로 실제 Cluster를 만드는 방법을 본다.