CNAP 클라우드 플랫폼 GitOps 대시보드를 직접 체험해보세요  —  실시간 CI/CD, 모니터링, 보안 관제를 한 곳에서     CNAP 클라우드 플랫폼 GitOps 대시보드를 직접 체험해보세요  —  실시간 CI/CD, 모니터링, 보안 관제를 한 곳에서     CNAP 클라우드 플랫폼 GitOps 대시보드를 직접 체험해보세요  —  실시간 CI/CD, 모니터링, 보안 관제를 한 곳에서     CNAP 클라우드 플랫폼 GitOps 대시보드를 직접 체험해보세요  —  실시간 CI/CD, 모니터링, 보안 관제를 한 곳에서    

CloudNativePG Operator

PostgreSQL 클러스터를 Kubernetes에서 선언적으로 관리하는 오퍼레이터입니다. Barman Cloud Plugin과 함께 배포하여 WAL 아카이빙과 베이스 백업을 지원합니다.

  • 버전: cloudnative-pg 0.27.0, plugin-barman-cloud 0.3.1
  • Helm Chart: cnpg/cloudnative-pg 0.27.0, cnpg/plugin-barman-cloud 0.3.1
  • 네임스페이스: database
  • 의존성: cert-manager (1-03-cert-manager.md)

1. 개요

CloudNativePG(CNPG)는 PostgreSQL 클러스터의 생성·운영·장애 조치를 CRD로 관리합니다. Barman Cloud Plugin은 MinIO 등 S3 호환 스토리지를 이용한 WAL 아카이빙과 베이스 백업을 담당합니다.

이 가이드는 Operator 설치만 다룹니다. PostgreSQL 클러스터 생성은 2-04-cnpg-cluster.md를 참고합니다.


2. 사전 요구사항


3. 디렉터리 구조

cnpg/operator/
├── Makefile
└── kustomize/
    ├── base/
    │   └── helm/
    │       ├── cloudnative-pg/          # CNPG Operator Chart (pull로 다운로드)
    │       └── plugin-barman-cloud/     # Barman Cloud Plugin Chart (pull로 다운로드)
    └── overlays/
        └── dev/
            ├── kustomization.yaml       # HelmChartInflationGenerator 등록
            └── helm/
                ├── cnpg/
                │   ├── helm-chart.yaml  # CNPG HelmChartInflationGenerator 설정
                │   └── values.yaml      # CNPG Operator 파라미터 (모니터링, 리소스)
                └── barman/
                    ├── helm-chart.yaml  # Barman HelmChartInflationGenerator 설정
                    └── values.yaml      # Barman Cloud Plugin 파라미터 (리소스)

4. 배포

4.1 Helm Chart 다운로드

make pull

cnpg 리포지터리에서 두 Chart를 kustomize/base/helm/에 다운로드합니다.

4.2 배포 설정

overlays/dev/helm/cnpg/values.yaml — Prometheus PodMonitor와 Grafana 대시보드를 활성화합니다.

monitoring:
  podMonitorEnabled: true
  podMonitorAdditionalLabels:
    prometheus: main
  grafanaDashboard:
    create: true
    configMapName: "cnpg-grafana-dashboard"
    labels:
      prometheus: main

overlays/dev/helm/barman/values.yaml — 리소스만 설정합니다. Chart에 PodMonitor 템플릿이 없어 monitoring 설정은 불필요합니다.

4.3 배포 실행

make preview  # 적용 전 매니페스트 확인
make apply    # 클러스터에 적용

참고: make apply는 CNPG CRD 크기 제한 문제를 피하기 위해 --server-side=true를 사용합니다.


5. 설치 후 검증

5.1 CRD 등록 확인

kubectl get crd | grep cnpg.io

예상 결과:

backups.postgresql.cnpg.io
clusterimagecatalogs.postgresql.cnpg.io
clusters.postgresql.cnpg.io
databases.postgresql.cnpg.io
failoverquorums.postgresql.cnpg.io
imagecatalogs.postgresql.cnpg.io
objectstores.barmancloud.cnpg.io
poolers.postgresql.cnpg.io
publications.postgresql.cnpg.io
scheduledbackups.postgresql.cnpg.io
subscriptions.postgresql.cnpg.io

5.2 Operator 메트릭 확인

Operator Pod의 포트 8080에서 controller_runtime 메트릭을 노출합니다. 모든 controller의 reconcile 오류 카운터가 0이면 정상입니다.

kubectl port-forward -n database \
  $(kubectl get pod -n database -l app.kubernetes.io/name=cloudnative-pg -o name | head -1) \
  18080:8080

curl -s http://localhost:18080/metrics | grep controller_runtime_reconcile_errors_total

예상 결과:

controller_runtime_reconcile_errors_total{controller="backup"} 0
controller_runtime_reconcile_errors_total{controller="cluster"} 0
controller_runtime_reconcile_errors_total{controller="plugin"} 0
controller_runtime_reconcile_errors_total{controller="pooler"} 0
controller_runtime_reconcile_errors_total{controller="scheduled-backup"} 0

6. Troubleshooting

6.1 CRD 적용 오류 — 리소스 크기 초과

증상: kubectl apply 직접 실행 시 metadata.annotations: Too long 오류

원인: CNPG CRD 크기가 kubectl apply의 annotation 크기 제한 초과

해결: make apply는 이미 --server-side=true를 사용합니다. 직접 실행할 경우 동일 옵션을 추가합니다.

kustomize build --enable-alpha-plugins kustomize/overlays/dev | kubectl apply --server-side=true -f -

6.2 Webhook 오류 — 클러스터 생성 실패

증상: PostgreSQL 클러스터 생성 시 Internal error occurred: failed calling webhook 오류

원인: Operator Pod 기동 중이거나 Webhook 인증서 미준비 상태

해결: Operator Pod가 Running 상태인지 확인 후 재시도합니다.


7. 제거

주의: make delete는 Operator를 삭제하지만 CRD는 삭제하지 않습니다. CRD가 남아 있으면 재설치 시 충돌이 발생할 수 있습니다.

주의: PostgreSQL 클러스터가 존재하는 상태에서 CRD를 삭제하면 클러스터 리소스가 모두 소멸합니다. 클러스터를 먼저 삭제한 후 CRD를 제거합니다.

make delete
kubectl delete crd -l app.kubernetes.io/name=cloudnative-pg
kubectl delete crd -l app.kubernetes.io/name=plugin-barman-cloud