LLM WikiAccess-protected knowledge portal
← 스터디 홈
159편 · 약 13분

CloudNativePG 1.30: Kubernetes PostgreSQL 프라이머리 선출을 Lease 뮤텍스로 직렬화하고 보안 기준을 높인 방법

요약

CloudNativePG 1.30.0이 2026년 6월 29일 출시되었다(90일 이내). Kubernetes에서 PostgreSQL을 운영하는 사실상 표준 오퍼레이터의 두 가지 핵심 변화다.

  1. Kubernetes Lease 뮤텍스: 프라이머리 승격을 직렬화해 이중 프라이머리(split-brain) 위험을 줄이는 구조적 안전장치가 추가되었다.
  2. 보안 강화: 메트릭 익스포터의 수퍼유저 권한 에스컬레이션(CVE-2026-44477, 1.29.1 패치), search_path 고정(CVE-2026-55769), SCRAM-SHA-256 패스워드 인코딩(CVE-2026-55765) 세 가지 CVE가 수정되었다.

이 챕터는 Lease가 왜 필요한지, 어떻게 동작하는지, 업그레이드 전에 무엇을 확인해야 하는지 운영 관점에서 정리한다.


CloudNativePG 개요

CloudNativePG는 EDB(EnterpriseDB)가 주도하고 CNCF에서 관리되는 Kubernetes 전용 PostgreSQL 오퍼레이터다. 핵심 설계 원칙은 하나의 CRD(Cluster)로 PostgreSQL 클러스터의 전체 라이프사이클을 선언적으로 관리하는 것이다.

주요 기능:

  • 스트리밍 복제 기반 1 Primary + N Standby 구성
  • 오퍼레이터 직접 자동 페일오버(Patroni 없이)
  • WAL 아카이빙, PITR, 인플레이스 메이저 업그레이드 지원
  • Prometheus 메트릭 익스포터 내장
  • PgBouncer 연결 풀러 통합

버전 현황(2026년 기준):

버전EOL 날짜비고
1.28.x2026-06-30EOL 완료
1.29.x2026-09-29보안 패치 전용
1.30.x미정현재 안정 버전

핵심 변화 1: Kubernetes Lease를 이용한 프라이머리 선출 직렬화

왜 필요한가

페일오버 중 두 인스턴스가 동시에 프라이머리라고 판단하는 이중 프라이머리(split-brain)는 PostgreSQL 운영의 가장 위험한 장애다. 데이터가 두 경로로 분기되면 복구가 어렵거나 불가능하다.

CloudNativePG는 기존에도 PostgreSQL의 WAL 타임라인 체계와 오퍼레이터 로직으로 split-brain을 방지했다. 1.30에서 Kubernetes Lease 객체를 추가적인 직렬화 레이어로 도입했다.

Kubernetes Lease란

Kubernetes에는 coordination.k8s.io/Lease 리소스가 있다. 분산 시스템에서 리더 선출(leader election)에 활용되는 표준 원시 타입으로, etcd가 원자적 조작을 보장한다.

apiVersion: coordination.k8s.io/v1
kind: Lease
metadata:
  name: <cluster-name>
spec:
  holderIdentity: <instance-manager-pod-name>
  leaseDurationSeconds: 15
  renewTime: <RFC3339Micro>
  acquireTime: <RFC3339Micro>

인스턴스 매니저는 이 Lease를 획득한 경우에만 프라이머리로 동작한다. 정상 종료 시 Lease를 즉시 해제해, 레플리카가 TTL 만료를 기다리지 않고 빠르게 승격할 수 있다.

동작 흐름

정상 운영 계획된 페일오버 비정상 페일오버 Primary Pod Lease 보유 (15초마다 갱신) ↓ WAL 스트리밍 Standby Pod × N Lease 미보유 → 읽기 전용 etcd Lease 객체: holderIdentity=primary-pod Primary 정상 종료 → Lease 즉시 해제 ↓ 즉시 가능 최적 Standby Lease 획득 → 프라이머리 승격 TTL 대기 없음 → 빠른 승격 완료 Primary 응답 없음 Lease 갱신 중단 ↓ TTL 만료 후 Standby들이 Lease 획득 시도 etcd 원자적 조작 → 단 하나만 성공 동시 승격 차단됨 Lease = 승격 게이트(뮤텍스) 주의: Lease는 승격 게이트이지 펜싱(fencing) 메커니즘이 아니다. 구 Primary 격리는 별도 처리 필요.
CloudNativePG 1.30 Lease 기반 프라이머리 선출 흐름

중요 주의점

Lease는 승격 뮤텍스이지 펜싱(fencing) 메커니즘이 아니다. 구 Primary가 격리되지 않은 채 계속 쓰기를 받을 수 있는 극단적인 시나리오를 직접 막지는 않는다. Primary 격리는 여전히 PostgreSQL 복제 타임라인과 오퍼레이터의 기존 메커니즘이 담당한다.

.spec.primaryLease 스탠자로 TTL 등 타이밍 파라미터를 조정할 수 있다.


핵심 변화 2: DatabaseRole CRD

기존에는 PostgreSQL 롤(사용자)을 선언적으로 관리할 방법이 없었다. 수동 SQL 또는 초기화 스크립트에 의존해야 했다.

1.30은 DatabaseRole CRD를 도입해 GitOps 방식으로 롤을 선언할 수 있게 했다.

apiVersion: postgresql.cnpg.io/v1
kind: DatabaseRole
metadata:
  name: app-readonly
spec:
  cluster:
    name: my-cluster
  roleName: app_readonly
  login: true
  inherit: true
  privileges:
    - privilege: CONNECT
      database: mydb
    - privilege: SELECT
      schema: public

오퍼레이터가 이 리소스를 감지해 CREATE ROLE, GRANT, REVOKE를 자동으로 실행하고, 드리프트를 주기적으로 조정한다. 롤 관리도 Git으로 리뷰·감사할 수 있게 됐다.


보안 강화: 세 가지 CVE

CVE-2026-44477 (1.29.1 패치, Critical CVSS 9.4)

문제: 메트릭 익스포터가 postgres 수퍼유저로 연결한 뒤 SET ROLE pg_monitor로 권한을 낮췄다. 스크레이프 세션 내의 SQL 표현식이 RESET ROLE을 실행하면 수퍼유저 권한을 회복할 수 있었다. COPY ... TO PROGRAM으로 OS 수준 명령을 실행하는 것까지 가능했다.

수정: 메트릭 익스포터 전용 cnpg_metrics_exporter 롤을 생성하고 pg_monitor 권한만 부여한다. 수퍼유저 연결을 완전히 제거했다.

영향: 1.29.0 이하를 사용 중이면 즉시 1.29.2 또는 1.30.x로 업그레이드해야 한다.

CVE-2026-55769 (1.30.0 / 1.29.2 / 1.28.4, 권한 에스컬레이션)

문제: 오퍼레이터의 풀된 연결에서 search_path가 고정되지 않아, DB 소유자가 public 스키마에 오버로드 연산자를 삽입하면 오퍼레이터가 의도치 않은 코드를 실행할 수 있었다.

수정: 오퍼레이터의 모든 풀된 연결에 search_path = pg_catalog, public, pg_temp를 고정한다.

운영 주의: 기존에 public 스키마에 연산자 오버로딩을 사용 중이라면 동작이 변경될 수 있다.

CVE-2026-55765 (1.30.0 / 1.29.2 / 1.28.4, 패스워드 평문 노출)

문제: 오퍼레이터가 CREATE ROLE / ALTER ROLE 명령에 평문 패스워드를 포함해 PostgreSQL 로그 또는 감사 로그에 기록될 수 있었다.

수정: 오퍼레이터가 CREATE/ALTER ROLE 실행 전 SCRAM-SHA-256으로 패스워드를 인코딩한다. 로그에 평문이 남지 않는다.

운영 주의: password_encryption 파라미터가 md5로 설정된 클러스터는 변환이 필요할 수 있다.


인플레이스 메이저 업그레이드(Image Volume 지원)

1.30에서 Image Volume 확장 기능을 활용한 인플레이스 메이저 업그레이드가 지원된다. 소스 버전과 타겟 버전의 확장 이미지를 나란히 마운트해, 업그레이드 실패 시 원래 이미지로 클린하게 되돌릴 수 있다.


업그레이드 체크리스트

항목확인 사항
현재 버전이 1.28.x1.29.x를 거쳐 1.30.x로 순차 업그레이드 필요
CVE-2026-444771.29.0 이하라면 즉시 1.29.2 이상으로 업그레이드
Lease 객체 RBAC1.30 업그레이드 후 클러스터당 Lease 객체 자동 생성. 오퍼레이터 ServiceAccount에 coordination.k8s.io/leases 권한 확인
search_path 변화CVE-2026-55769 수정으로 public 스키마 연산자 오버로딩이 영향받을 수 있음
SCRAM-SHA-256password_encryption 설정 확인. MD5만 허용하는 레거시 클라이언트 여부 검토
DatabaseRole CRD기존 수동 롤 관리 스크립트와 충돌 여부 검토
1.28.x EOL2026-06-30 EOL 완료. 보안 패치 수신 종료

요점 정리

CloudNativePG 1.30은 운영 안정성보안 기준을 동시에 높인 릴리스다.

Lease 뮤텍스는 기존 페일오버 메커니즘을 대체하는 것이 아니라 추가적인 직렬화 레이어로 작동한다. split-brain 위험을 더 좁은 시간 창으로 제한하고, 계획된 페일오버를 더 빠르게 완료한다.

CVE-2026-44477(수퍼유저 메트릭 연결)은 Critical 등급이다. 1.29.0 이하를 사용 중이라면 지금 바로 업그레이드해야 한다.


References

  • CloudNativePG 1.30.0 출시 공지: https://cloudnative-pg.io/releases/cloudnative-pg-1-30.0-released/
  • PostgreSQL.org 뉴스 (CloudNativePG 1.30.0): https://www.postgresql.org/about/news/cloudnativepg-1300-released-3337/
  • CloudNativePG 1.29.1 보안 패치 공지 (CVE-2026-44477): https://cloudnative-pg.io/releases/cloudnative-pg-1-29.1-released/
  • CloudNativePG 릴리스 목록: https://cloudnative-pg.io/releases/
  • Kubernetes Lease API 공식 문서: https://kubernetes.io/docs/concepts/architecture/leases/
  • EDB Postgres for Kubernetes 1.30.0 릴리스 노트: https://www.enterprisedb.com/docs/postgres_for_kubernetes/latest/