선언적 하이버네이션
선언적 하이버네이션 (Declarative hibernation)
CloudNativePG는 PostgreSQL 클러스터가 언제든 켜져 있고, 실행 중이며, 사용 가능하도록 설계됐어요.
그런데 데이터베이스가 워크로드가 활성일 때만 켜져 있으면 되는 워크로드 종류도 있어요. 배치 기반(batch-driven) 솔루션이 그런 경우예요.
배치 기반 솔루션에서 데이터베이스는 배치 프로세스가 실행되는 동안에만 켜져 있으면 돼요.
선언적 하이버네이션(declarative hibernation) 기능은 데이터베이스 PVC는 유지하면서 데이터베이스 Pod를 제거해 CPU 전력을 절약할 수 있게 해줘요.
출처: 문서
본문
하이버네이션 (Hibernation)
클러스터를 하이버네이션하려면 cnpg.io/hibernation=on 어노테이션을 설정해요:
$ kubectl annotate cluster <cluster-name> --overwrite cnpg.io/hibernation=on
하이버네이션된 클러스터에는 실행 중인 Pod가 하나도 없지만, PVC는 유지되어 나중에 클러스터를 다시 깨울(rehydrate) 수 있어요. 레플리카 PVC들도 프라이머리의 PVC와 함께 유지돼요.
하이버네이션 절차는 스위치오버를 피하면서 레플리카가 동기화 상태로 유지되도록, 먼저 프라이머리 Pod를 삭제한 다음 레플리카 Pod들을 삭제해요.
하이버네이션 상태는 cnpg.io/hibernation 컨디션을 찾아 모니터링할 수 있어요:
$ kubectl get cluster <cluster-name> -o "jsonpath={.status.conditions[?(.type==\"cnpg.io/hibernation\")]}"
{
"lastTransitionTime":"2023-03-05T16:43:35Z",
"message":"Cluster has been hibernated",
"reason":"Hibernated",
"status":"True",
"type":"cnpg.io/hibernation"
}
하이버네이션 상태는 kubectl용 cnpg 플러그인의 status 서브커맨드로도 읽을 수 있어요:
$ kubectl cnpg status <cluster-name>
Cluster Summary
Name: cluster-example
Namespace: default
PostgreSQL Image: ghcr.io/cloudnative-pg/postgresql:18.6-system-trixie
Primary instance: cluster-example-2
Status: Cluster in healthy state
Instances: 3
Ready instances: 0
Hibernation
Status Hibernated
Message Cluster has been hibernated
Time 2023-03-05 16:43:35 +0000 UTC
[..]
리하이드레이션 (Rehydration)
클러스터를 다시 깨우려면 cnpg.io/hibernation 어노테이션을 off로 설정하거나:
$ kubectl annotate cluster <cluster-name> --overwrite cnpg.io/hibernation=off
아예 해제해 버려도 돼요:
$ kubectl annotate cluster <cluster-name> cnpg.io/hibernation-
Pod가 다시 생성되고 클러스터가 운영을 재개해요.