CloudNativePG 1.29 릴리스 노트
CloudNativePG 1.29 릴리스 노트 (Release notes for CloudNativePG 1.29)
CloudNativePG 1.29 마이너 릴리스에서 사용자에게 보이는 변경 사항의 역사를 정리해 드릴게요. 이 버전에서 추가된 기능, 보안 강화, 그리고 수정된 버그들을 하나씩 살펴볼게요.
출처: 문서
본문
변경 사항의 전체 목록은 GitHub의 릴리스 브랜치에 있는 커밋을 참고하세요.
버전 1.29.3
릴리스 날짜: 2026년 9월 23일
:::warning 이 버전은 1.29.x 시리즈의 마지막 릴리스예요. 1.29는 더 이상 지원되지 않으므로, 가능하면 더 새로운 마이너 버전으로 업그레이드하는 것을 강력히 권장해요. :::
개선 사항 (Enhancements)
-
.barmanObjectStore.data에restoreAdditionalCommandArgs를 추가해서 트리 안의 Barman Cloud 복구 시, 복구 중barman-cloud-restore에 사용자 정의 플래그가 전달되도록 했어요. (#11278) -
플러그인 작성자들은 더 이상 빈 WAL 아카이브를 오류로 취급해야 하는지 스스로 판단할 필요가 없어요. 오퍼레이터가 이제
check_empty_wal_archive결정을 한 번 계산해서 WAL 아카이빙 및 복원 훅 모두에서 CNPG-I 플러그인에 전달해요. (#11216) -
.spec.postgresql.parameters에서ssl_ecdh_curvePostgreSQL 파라미터를 설정할 수 있게 됐어요. 오퍼레이터가 관리하지 않는데도 이전에는 검증 웹훅이 거부했었는데, 이제 허용돼요. @Jamstah 님의 기여. (#11308) -
spec.pgbouncer.parameters에서auth_user를 설정해서 PgBouncer가auth_query연결에 사용하는 사용자를 재정의할 수 있게 됐어요. 이전에는 항상authQuerySecret에서만 파생했어요. 사용자 정의authQuerySecret를 쓸 때 인증할 역할이 Secret이 암시하는 역할과 다르다면 유용해요. @jonasbadstuebner 님의 기여. (#10899) -
PgBouncer가 컬럼을 추가하거나 순서를 바꿀 때 메트릭이 조용히 0으로 보고되던 문제를 수정했어요.
SHOW STATS와SHOW POOLS결과를 이제 위치가 아니라 컬럼 이름으로 매칭해요. @AdzerKI 님의 기여 (SHOW STATS). (#11366, #11464) -
cnpg플러그인:backup명령에--dry-run옵션을 추가해서, 생성하지 않고 만들어질Backup리소스만 출력하도록 했어요. (#11233)
보안 및 공급망 (Security and Supply Chain)
-
내장된
..경로 탐색(경로 이동)을 가진 절대 경로(예:/a/../../../../etc)가 원본 경로만 검사되면서 허용되던 웹훅 검증 우회를 수정했어요. 이런 경로는 런타임에 정규화되면 확장 프로그램의 마운트 지점을 벗어날 수 있었어요. 이제 admission, 메이저 업그레이드 Job, 이미 저장된 Cluster 스펙 전반에서 영향을 받는 항목을 일관되게 정규화해서 거부/건너뜀 처리해요. @Anand-240 님의 기여. (#11210) -
google.golang.org/grpc를 v1.83.1로 업데이트해서 CVE-2026-84304 / GHSA-vp52-pcj8-j9qc (HTTP/2 DATA 프레임 분할을 통한 gRPC-Go 힙 메모리 고갈)를 수정했어요. (#11394)
변경 사항 (Changes)
-
기본 PostgreSQL operand 이미지를 18.6-system-trixie로 업데이트했어요. (#11257)
-
오퍼레이터의 기본 베이스 이미지를 Debian 12 (bookworm)에서 Debian 13 (trixie)으로 옮겼어요. Debian 12가 LTS 전용 유지보수로 전환됐기 때문이에요. (#11193)
수정 사항 (Fixes)
-
폴오버(failover) 중에 절대 완료되지 않을 체크포인트와 fast-shutdown 시도를 기다리는 대신, 도달 불가한 이전 프라이머리를 즉시 강등시켜요. 이전에는 PostgreSQL이 응답하지 않게 된 이전 프라이머리가 종료되지 않아서 새로운 프라이머리의 리플리카로 다시 합류할 수 없었어요. 이제 종료 요청이 리컨실러(조정자)를 막지 않고 처리되지만, PostgreSQL이 종료 신호를 계속 무시한다면 강등에 1분 이상 걸릴 수 있어요. (#11347)
-
클러스터의 어떤 인스턴스가 펜싱(fencing)되어 있는 동안 폴오버와 Pod 재생성이 멈추던 문제를 수정했어요. 펜싱된 인스턴스는 Pod가 영구적으로 Ready가 아님에도 status 엔드포인트에서 스스로 정상이라고 계속 보고해서, readiness 가드, 프라이머리 선출 로직, Pod 재연결 게이트가 클러스터 다른 곳의 무관한 장애에 반응하지 못하게 막았어요. 누군가 수동으로 펜싱을 제거할 때까지 중단됐는데, 이제 세 가지 모두 펜싱된 인스턴스를 인식하고 건너뜁니다. (#11274)
-
영원히 멈추거나 조용히 되돌려질 수 있는 폴오버를 수정했어요. 폴오버가 대기 중인 동안 리컨실러가 완료 준비 여부 확인을 건너뛰거나, 대기 상태를 누락된 Pod로 오인해서 대상 프라이머리를 다시 비정상 상태로 되돌릴 수 있었어요. 이제 대기 중인 폴오버를 계속 진행하고 WAL 수신기가 내려가면 완료하며, 승격 직전에 정족수(quorum) 안전성을 다시 확인해요. (#11336)
-
PostgresqlStatusList의 지정 프라이머리 정렬에서 LSN이 동률일 때 순서가 어긋나던 문제를 수정했어요. 지정 프라이머리의 Pod가 나중에 status 목록에서 사라지면 오퍼레이터가 잘못된 스탠바이를 승격시킬 수 있었어요. (#11494) -
60초 후 fast shutdown을 중단하던 문제를 수정했어요. 요청에 명시적 타임아웃이 없어서
pg_ctl이 자체 암묵적 60초 제한으로 돌아갔고, 컨테이너에서 PID 1인 인스턴스 매니저가 더 큰stopDelay가 설정돼 있어도 종료 중에 PostgreSQL을 내렸어요. 이제 fast 단계는 전체stopDelay동안 대기해요. (#11263) -
부트스트랩 중 인증서를 새로고치기 전에 인증서 상태를 기다리도록 했어요. (#11450)
-
트리 안 Barman Cloud 복구가
wal.maxParallel과wal.restoreAdditionalCommandArgs를 무시하고 WAL을 한 세그먼트씩 가져오던 문제를 수정했어요. 이제 설정된 병렬성을 사용해요. (#11105) -
대기 중이거나 종료 중인 인스턴스에서
unrecoverable어노테이션을 존중하도록 했어요. (#11241) -
VolumeSnapshot 기반 백업 마무리 시
Backup.spec.online을 존중해서, 콜드 백업이 status에서 온라인으로 보고되지 않도록 했어요. (#11276) -
일시적인 인스턴스 매니저 연결 오류(예: 잠깐의 pod 네트워크 장애로 인한 dial timeout)에서 볼륨 스냅샷 백업을 즉시 실패로 처리하지 않고 재시도하도록 했어요. (#11069)
-
PostgreSQL 18+에서
.spec.postgresql.dataChecksums가false일 때initdb가 기본적으로 체크섬을 켜므로,--no-data-checksums를 명시적으로 설정하도록 했어요. @evan314159 님의 기여. (#11488) -
PVC 조정에서
.spec.inheritedMetadata라벨이 오퍼레이터 자체 라벨에 덮어써지던 문제를 수정했어요. 이제 적용 후에도 유지돼요. @GellertBabel 님의 기여. (#11499) -
삭제 표시된 후
Pooler와DatabaseRole이 소유 리소스를 다시 만들지 않도록 했어요. 이전에는 리소스가 사라지길 기다리는 외부 finalizer(예: ArgoCD foreground 삭제)를 막을 수 있었어요. @mjlshen 님의 기여. (#11359) -
pg_stat_wal메트릭에서NULL인stats_reset값을 처리하도록 했어요. 이전에는 PostgreSQL 18 클러스터에서 Prometheus 스크래핑을 가끔 깨뜨릴 수 있었어요. @HoniSanders 님의 기여. (#11207) -
오래된 비-FIFO 파일이 로그 파이프를 막을 때 로그 스트리밍을 복구하도록 했어요. (#11246)
-
Pod 프로세스의 로그를 샘플링하지 않도록 했어요. 이제 로그 줄이 조용히 유실되지 않아요. (#11131)
-
메모리 사용량을 급증시키고 큰 Helm 릴리스가 설치된 클러스터에서 오퍼레이터가 크래시루프에 빠질 수 있었던 Helm 릴리스 Secret 캐싱을 중단했어요. (#11211)
-
오퍼레이터 재시작 후 소유 리소스 finalizer 정리를 다시 실행해서, 오퍼레이터가 중단된 동안 삭제된 네임스페이스가 영원히
Terminating상태로 멈추지 않도록 했어요. (#11215) -
WAL 프리페칭(
wal.maxParallel > 1)이 켜져 있을 때 다시 합류하는 리플리카가pg_rewind를 완료하는 데 오래 걸리던 문제를 수정했어요. (#11204) -
프로브(probe)에서 연결을 거부하는 PostgreSQL 인스턴스를 시작된 것으로 취급하도록 했어요. (#11152)
-
클러스터의
pvcTemplate가volumeAttributesClass를 설정했을 때 매 조정마다 중복 PATCH를 발행하던 문제를 중단했어요. @andrew-farries 님의 기여. (#11196) -
리플리케이션 슬롯 조정이 첫 번째 실패한 슬롯에서 멈추지 않도록 했어요. (#11119)
-
롤아웃 중 디스크의 구성 해시가 아니라 실행 중인 구성 해시를 비교해서 불필요한 스위치오버를 피하도록 했어요. (#11130)
-
VolumeSnapshot오류를 일찍 포기하지 않고 기한까지 재시도하도록 했어요. (#11132) -
플러그인 기반 복구 중 데이터 볼륨에 WAL을 재생하는 대신
pg_wal을 WAL 볼륨에 심볼릭 링크로 연결했어요. 이전에는 큰 PITR(특정 시점 복구)에서 데이터 볼륨이 고갈될 수 있었어요. (#11127) -
PhaseUpgradeDelayed상태 메시지의 문법을 수정했어요. @Utkarsh-sharma47 님의 기여. (#11065) -
CloudNativePG 인터페이스 (CNPG-I):
-
cnpg플러그인:
버전 1.29.2
릴리스 날짜: 2026년 6월 29일
주요 변경 사항 (Important changes)
-
네이티브(트리 안) Barman Cloud 지원의 폐기(deprecation) 공지를 1.30.0이 아니라 CloudNativePG 1.31.0에서 제거된다는 내용으로 갱신했어요. 여전히 Barman Cloud Plugin으로 마이그레이션하는 것을 권장해요. (#11083)
-
Database,Pooler,Publication,Subscription,ScheduledBackup리소스에서cluster참조가 이제 불변(immutable)이에요. 이 객체 중 하나를 다른 클러스터로 가리키는 것은 명확한 의미가 없고 이전에는 컨트롤러를 일관성 없는 상태로 남겼는데, 이제 CEL 검증 규칙을 통해 API 서버에서 업데이트가 거부돼요. (#10743)
개선 사항 (Enhancements)
-
Image Volume 확장 프로그램을 사용하는 클러스터에서 PostgreSQL 19 이상으로의
pg_upgrade인플레이스 메이저 업그레이드를 지원하게 됐어요. PostgreSQL 19의pg_upgrade에 추가된 확장 경로 지원을 기반으로 해요. 업그레이드Job동안 소스/대상 버전 확장 이미지를 나란히 마운트해서, 이전 서버가 라이브러리를 유지하고 실패한 업그레이드가 깨끗하게 되돌아가요. (#10366) -
Clusterscale 하위 리소스에 라벨 선택자(status.selector)를 추가해서,Cluster가 Vertical Pod Autoscaler (VPA)와 Horizontal Pod Autoscaler (HPA)의 유효한targetRef가 되고,Cluster를 인스턴스 pod에 매핑할 수 있게 됐어요. @sebv004 님의 기여. (#8996) -
프라이머리 pod가 kubelet 관점에서
Ready인데 오퍼레이터의/pg/status검사가 실패하고 폴오버가 연기되면, 오퍼레이터가 이제Cluster에Warning성격의PrimaryStatusCheckFailed이벤트를 발생시켜요.kubectl describe cluster로 연기 상황을 볼 수 있어요. (#10509) -
CNPG-I 플러그인의 pod가 롤링될 때 오퍼레이터가 플러그인을 자동으로 다시 로드해요. 플러그인
Service를 뒷받침하는EndpointSlices를 감시하고, 새 pod가Ready가 되면 플러그인을 사용하는 모든 클러스터를 다시 큐에 넣어서 업그레이드된 플러그인을 다음 리싱크를 기다리지 않고 반영해요. (#10836)
보안 및 공급망 (Security and Supply Chain)
-
CVE-2026-55769/GHSA-x8c2-3p4r-v9r6: 오퍼레이터 발급 연결에서의search_path고정: 데이터베이스 소유자가public스키마에 오버로드된 내장 연산자를 심고search_path를 조작해서, 클러스터 수퍼유저로 실행되는 오퍼레이터 인트로스펙션 프로브가pg_catalog보다 그 오버로드를 먼저 해석하게 만들 수 있었어요.COPY ... FROM PROGRAM을 통한 pod 내 RCE까지 이어질 수 있는CWE-426권한 상승 체인(CVE-2018-1058와 같은 계열)이에요. 오퍼레이터는 이제 모든 풀 연결에search_path = pg_catalog, public, pg_temp를 고정해서 시작 메시지에 포함시키고 테넌트가 제어하는 기본값보다 우선하게 해요. (#10774,GHSA-x8c2-3p4r-v9r6) -
CVE-2026-55765/GHSA-w3gf-xc94-wvmj: 오퍼레이터 측 SCRAM-SHA-256 비밀번호 인코딩: 오퍼레이터가 이제CREATE/ALTER ROLE ... PASSWORD를 발행하기 전에 평문 역할 비밀번호를 SCRAM-SHA-256으로 인코딩해서, PostgreSQL이 파싱하고(pg_stat_statements나pgaudit같은 확장이 포착할 수 있는) 리터럴이 평문 비밀이 아닌 SCRAM 검증자가 되도록 해요. 사전 해시된(MD5 또는 SCRAM) 값은 변경 없이 전달되고, Secret별 어노테이션cnpg.io/passwordPassthrough: "enabled"로 선택 해제할 수 있어요. (#10724,GHSA-w3gf-xc94-wvmj)
변경 사항 (Changes)
-
Kubernetes 1.36 지원을 추가했어요. (#10900)
-
기본 PostgreSQL 버전을 18.4로 업데이트했어요. (#10719)
-
퍼블릭 클라우드 제공업체에서 오퍼레이터를 테스트하는 데 사용하는 Kubernetes 버전을 업데이트했어요. (#10720, #10563, #11033)
수정 사항 (Fixes)
-
spec.postgresql.parameters가 유효하지 않은 PostgreSQL 파라미터 이름 키를 받아서postgresql.conf에 임의 지시문을 주입할 수 있던 문제를 수정했어요. 이제 웹훅이 키 이름을 검증해요. (#11029) -
선언적
Database,Publication,Subscription객체가 클러스터가 리플리카로 강등된 후에도 영원히 오래된 프라이머리 측 상태를 보고하던 문제를 수정했어요. 이제 컨트롤러가 리플리카 조건을 다시 확인하고Cluster를 감시해서 강등을 신속하게 감지해요. (#10871) -
인스턴스 시리얼 카운터가 해당
Job과 PVC가 만들어지기 전에 증가해서 비순차적 pod 이름(예:-1,-3)이 생기던 문제를 수정했어요. 이제 해당 리소스가 존재한 후에만 증가분을 저장해요. (#10491) -
기존 클러스터에 WAL 아카이버 플러그인이 활성화됐을 때 발생하는 스위치오버 교착 상태를 수정했어요.
primaryUpdateMethod: switchover일 때 깨끗한 강등에는 아직 없는 아카이버 사이드카가 필요해서 프라이머리를 롤아웃할 수 없었어요. 이제 오퍼레이터가 프라이머리 Pod를 제자리에서 다시 만들어 사이드카를 주입하고 아카이빙을 재개해요. 이 검사는 Barman Cloud 플러그인처럼 아카이버를 네이티브 사이드카(restartPolicy: Always인 init 컨테이너)로 주입하는 플러그인도 다룹니다. (#11032, #11059) -
인스턴스 생성 Job이 backoff 한도를 소진했을 때 클러스터가 무기한
Setting up primary에 머무르던 문제를 수정했어요. 이제 오퍼레이터가 종료 상태의 Job 실패를 감지하고 클러스터를 복구 불가(unrecoverable)로 표시하며, 실패한 Job과 로그를 가리켜요. (#11035) -
리플리카 클러스터에서
Database,Publication,Subscription삭제가Terminating에 멈추던 문제를 수정했어요. 리플리카 게이트가 finalizer 리컨실러보다 먼저 실행되어 finalizer가 해제되지 않았어요. 리플리카에서 PostgreSQL 객체는 프라이머리 클러스터에 남겨요. (#10853) -
delete회수 정책이 있는 충돌하는 중복Database또는Subscription이 살아남은 CR이 소유한 PostgreSQL 객체를 삭제하던 문제를 수정했어요. 이제 삭제가 기록된 리컨실레이션에 의해 게이트된다. (#10870) -
수퍼유저 접근을 비활성화했다 다시 활성화한 후
postgres수퍼유저가 잠겨 버리던 문제를 수정했어요. 캐시된 Secret 버전이 무효화되지 않아 비밀번호가 다시 적용되지 않았어요. @mhartmann-jaconi 님이 진단. (#10834) -
백업이
running에 도달하기 전에 그것을 실행 중이던 인스턴스 매니저가 재시작됐을 때(예: 오퍼레이터 업그레이드에 따른 인플레이스 업그레이드) 백업이started단계에 갇히던 문제를 수정했어요. 이제 리컨실레이션을 다시 예약해서 유실된 세션을 감지해요. (#10859) -
exec/attach스트리밍이 SPDY 폴백과 함께 WebSocket을 협상하도록 수정해서, SPDY를 제거한 Kubernetes 버전과 WebSocket exec 업그레이드를 거부하는 OpenShift 같은 플랫폼 모두와 호환되도록 했어요. @bartscheers 님의 기여. (#10876, #10933) -
동시
Backup객체가 경쟁할 때 발생하는 리소스 누수를 수정했어요. 이제 백업이 엄격한 생성 시간 순서로 실행되어, 실행 중인 백업이 더 새로운 백업에 선점되지 않고 그 리플리케이션 슬롯과 PostgreSQL 세션이 프라이머리에서 고아가 되지 않아요. @GabriFedi97 님의 기여. (#10747) -
참조된 Secret을 가져올 수 없을 때 역할 리컨실레이션이 PostgreSQL 역할의 비밀번호를 지우던 문제를 수정했어요. 이제 Secret을 사용할 수 있을 때까지 역할을 그대로 두고, 동작별 오류를 모아 더 잘 보이게 해요. (#10053)
-
메트릭 익스포터 설정 오류(흔히 컨트롤러와의 중복 키 경쟁)가
streaming_replica생성을 롤백하고 리플리카 합류를 막던 부트스트랩 실패를 수정했어요. 이제 메트릭 익스포터 단계가 별도 트랜잭션에서 실행돼요. @BlaiseAntony 님의 기여. (#10749) -
Backup이 생성됐는데 status 패치가 착륙하지 않을 때 발생하는ScheduledBackup컨트롤러 루프를 수정했어요. 이제 컨트롤러가 다음 반복에서 기존Backup을 채택해서AlreadyExists로 루프를 돌지 않아요. (#10612) -
Cluster가 삭제된Pooler를 리컨실레이션할 때 nil 포인터 패닉을 수정했어요. (#10667) -
WithActiveInstance중 모든 이름이 지정된 로그 파이프(postgres,postgres.csv,postgres.json)가 소비자를 갖도록 부트스트랩 로그 처리를 수정해서, 네임드 파이프 대신 일반 파일이 생성되는 것을 방지했어요. (#10043) -
주소를 대괄호로 감싸서 유효하지 않은 IPv6 URL 생성 문제를 수정했어요. @Infinoid 님의 기여. (#10682)
-
구성이
enabled: false로 설정된 외부 클러스터 플러그인이 여전히 활성으로 취급되던 문제를 수정했어요. (#10932) -
객체 저장소에서의 부트스트랩 복구 중 발생하는 경쟁 조건을 수정했어요. 복원 Job이 오래된
Cluster(프라이머리가 아직 기록되지 않고 타임라인도 설정 안 됨)를 읽고 그.history파일이 분할-뇌(split-brain) 가드에 거부될 수 있었어요. 이 경우 복구가 기본 백업의 타임라인에서 멈추고 이후 타임라인에서 커밋된 트랜잭션을 조용히 버렸어요. 이제 클러스터 타임라인이 설정되지 않은 동안에는 history 파일을 허용해요. @dennispidun 님의 기여. (#10818) -
서버와 클라이언트 CA가 같은 Secret(기본값)으로 해석될 때 클러스터 생성 중 발생하는 캐시 경쟁을 수정했어요. 오래된 informer 캐시가 중복
Create를 유발해서AlreadyExists로 실패하고 클러스터가Unable to create required cluster objects에 갇힐 수 있었어요. 이제 이름이 일치하면 이미 가져온 CA Secret을 재사용해요. (#10989) -
기존
PGDATA(예: 리플리카 Pod 재시작 후)에서pg_basebackup부트스트랩 경로가 덮어쓰거나 실패하던 문제를 다른 부트스트랩 방식이 이미 적용하는 것과 같은 사전 플라이트 디렉터리 검사를 강제해서 수정했어요. 정적으로 프로비저닝된 PVC가 조용히 덮어써지는 것도 보호해요. (#11006) -
리컨실레이션 후 플러그인 훅이 오류를 반환할 때
Cluster단계가Healthy와 플러그인 실패 단계 사이를 흔들던 문제를 수정했어요. 이제 성공적인 리컨실레이션의 마지막 단계로Healthy가 등록되어, 플러그인 오류로 끝나는 루프가Healthy를 보고하지 않아요. @GabriFedi97 님의 기여. (#10421) -
외부 서버의 Secret이 회전됐을 때(예: CA 번들이 인증서 2개에서 1개로 줄어들 때) 오래된 인증서 데이터와 부분 읽기를 수정했어요. 이제 파일을 원자적으로 써서 libpq가 항상 옛값이나 새값 중 하나만 읽고 섞이지 않아요. @Anand-240 님의 기여. (#10975)
-
플러그인 연결이 짧은 이름 대신 플러그인
ServiceFQDN을 사용하도록 수정해서, 클러스터 수준 프록시가 pod에 자동 주입될 때 발생하는 실패를 피했어요. @kdautrey 님의 기여. (#10921) -
요청별
Cluster생성/업데이트 검증 웹훅 메시지로 인한 과도한 오퍼레이터 로그 소음을 수정했어요. 이제info가 아닌debug로 기록돼요. (#10984) -
데이터 PVC가 생성됐지만 초기화 Job이 시작되기 전에 status 패치 충돌이 발생해 고아 Pending PVC가 인스턴스로 집계되면서 부트스트랩 게이트를 막는 최초 프라이머리 부트스트랩 교착 상태를 수정했어요. 이제 PVC 상태 리컨실러가 할당된 시리얼을 재사용해 부트스트랩 Job을 다시 생성해요. (#11039)
-
외부 클러스터 이름과 Secret 선택자 참조가 검증 없이 파일시스템 경로로 이어지던 문제를 수정했어요.
..구성 요소나 경로 구분자가 인스턴스 매니저가 연결 자재를 덤프할 때 외부 Secret 디렉터리를 벗어날 수 있었어요. 이제 검증 웹훅에서 거부하고 쓰기 지점에서 다시 확인해요. @r0binak 님이 보고. (#11045) -
백업이 영원히
pending에 갇히는 문제를 수정했어요. 동시 백업 게이트가 매 리컨실레이션마다 실행되면서 인스턴스 매니저가 비동기적으로 쓴 이미 완료된 단계를 덮어쓸 수 있었어요. 이제 게이트는 백업 단계가 아직 설정되지 않았거나pending일 때만 실행돼요. (#11056) -
오래된 캐시로 인해 오퍼레이터가 이미 프로비저닝한 스냅샷을 다시 만들어
AlreadyExists로 실패할 때 선언적VolumeSnapshot백업이 영구적으로 실패로 표시되던 문제를 수정했어요. 이제 기존 스냅샷이 이 백업의 라벨을 갖고 있으면 충돌을 수용하고 채택해요. 외부 스냅샷과의 충돌은 여전히 오류로 표시돼요. (#11071) -
스냅샷이 이미 프로비저닝됐는데도 마무리 단계 중 일시적인 인스턴스 매니저 연결 오류(예: 잠깐의 pod 네트워크 장애로 인한 dial timeout)로 볼륨 스냅샷 백업이 버려지던 문제를 수정했어요. 이제 이런 네트워크 오류를 종료 오류가 아니라 재시도해요. (#11069)
-
토큰 저장과 전환 메타데이터 정리 사이에 리컨실레이션이 재큐(requeue)될 때(예: 불안정한 웹훅에 대한 정리 패치 실패) 리플리카 스위치오버가
status.demotionToken을 잃던 문제를 수정했어요. 이제 저장된 값 위에 빈 no-change 토큰을 다시 패치하지 않아요. (#11075) -
cnpg플러그인:
버전 1.29.1
릴리스 날짜: 2026년 5월 8일
보안 및 공급망 (Security and Supply Chain)
-
CVE-2026-44477/GHSA-423p-g724-fr39: 메트릭 익스포터 권한 상승: 메트릭 익스포터가 더 이상postgres수퍼유저로 인증하지 않아요. 이제pg_monitor권한만 가진 전용cnpg_metrics_exporter역할을 사용해서, 낮은 권한의 데이터베이스 사용자가 PostgreSQL 수퍼유저를 얻을 수 있는 체인을 차단해요. (GHSA-423p-g724-fr39)업그레이드 영향: 사용자 소유 테이블을 읽는 사용자 정의 모니터링 쿼리나
PUBLIC CONNECT가 해지된 데이터베이스에서target_databases: '*'를 사용하는 쿼리는cnpg_metrics_exporter에 명시적인GRANT문이 필요해요. 모니터링 문서의 "Custom query privileges and safety"와 "Manually creating the metrics exporter role"를 참고하세요.리플리카 클러스터의 경우, 소스 프라이머리 클러스터를 먼저, 그다음 그로부터 소비하는 리플리카 클러스터를 업그레이드하세요.
cnpg_metrics_exporter역할은 소스 프라이머리에서 생성되어 하위로 복제돼요. 먼저 업그레이드된 리플리카 클러스터는 소스 프라이머리가 업그레이드될 때까지 누락된 역할에 대해 스크래핑해요. 위에 연결된 수동 복구 섹션도 리플리카 클러스터를 다룹니다. -
기본 모니터링 쿼리의 스키마 한정 카탈로그 참조: 모든
pg_catalog객체를 명시적으로 한정해서 제공되는 모니터링 구성과 문서 샘플을 강화했어요. 한정되지 않은 참조는search_path를 통해 해석되는데, 데이터베이스 사용자가 이를 조작해 내장 객체를 가릴 수 있어요. (#10576) -
발견 가능한 SBOM과 공급망 증명(provenance): 오퍼레이터 컨테이너 이미지에 첨부된 SBOM과 SLSA 공급망 증명이 이제 OCI 1.1 Referrers 스펙을 따르므로, 표준 레지스트리 도구와 공급망 스캐너가 자동으로 발견할 수 있어요. (#10601)
-
github.com/jackc/pgx/v5의 CVE 해결: v5.9.2로 올려서CVE-2026-33816(pgproto3의 메모리 안전성)과GHSA-j88v-2chj-qfwx(단순 프로토콜 달러 따옴표 문자열 처리의 SQL 주입)의 업스트림 수정을 반영했어요. (#10437, #10499) -
Go 런타임의 CVE 해결: Go 1.26.3으로 빌드해서
crypto/x509,crypto/tls,net/http,net의 업스트림 수정(CVE-2026-32280, CVE-2026-32281, CVE-2026-33810, CVE-2026-33814, CVE-2026-33811, CVE-2026-39825)을 반영했어요. (#10463, #10647) -
빌드 파이프라인 강화: Go 1.26.3 상향으로
cmd/go모듈 체크섬 검증의 CVE-2026-42501도 해결해서 릴리스 빌드 중 공급망 노출을 줄여요. 영향을 받는 코드 경로는 실행 중인 오퍼레이터에서 도달할 수 없어요. (#10647)
변경 사항 (Changes)
- TLS 피어 검증을
VerifyPeerCertificate에서VerifyConnection으로 전환했어요. 후자는 모든 완료된 핸드셰이크에서 실행돼요(전자는 재개된 TLS 1.3 세션에서 건너뜀). CloudNativePG는 현재 세션 재개를 활성화하지 않으므로 관찰 가능한 효과는 없지만, 나중에 세션 캐싱이 도입되면 검증을 미래 지향적으로 만듭니다. (#10478)
수정 사항 (Fixes)
-
이전 프라이머리가 프라이머리 라벨을 유지하던 폴오버 창을 수정했어요. 폴오버 중(예: 일시적인 네트워크 분할 후) 이전 프라이머리가 돌아오면
-rw서비스가 계속 거기로 라우팅하고 리플리카가 다시 연결되며 커밋된 쓰기가pg_rewind로 유실될 수 있었어요. 이제 이전 프라이머리를unhealthy로 라벨링해서 폴오버 중 서비스 트래픽에서 격리해요. (#10409) -
프라이머리를 호스팅하는 노드가 도달 불가해졌을 때 폴오버가 트리거되지 않던 문제를 수정했어요. 노드 컨트롤러가 kubelet이 보고를 멈추면
False로 뒤집는 pod의Ready조건을, 그 시나리오에서 오래된True로 남는ContainersReady대신 읽어요. 스퍼리어스 폴오버 가드(#10445)와 결합해, 폴오버는 Kubernetes 자체가 pod를 not Ready로 표시할 때만 트리거돼요. (#10448) -
프라이머리의 HTTP status 엔드포인트의 일시적 장애로 인한 스퍼리어스 폴오버를 수정했어요. (#10445)
-
PostgreSQL 구성 값에서 백슬래시와 제어 문자 이스케이핑을 수정했어요.
log_line_prefix같은 파라미터의 그런 문자가 이전에는 구성 파일을 손상시키거나 런타임에 조용히 제거될 수 있었어요. (#10515) -
restore_command구성을 각 인자를 셸 인용하도록 수정했어요. 공백을 포함한destinationPath(예:s3://my bucket/wal) 같은 값이 POSIX 셸에서 단어 분할되어 WAL 복원 도구에 별도 인자로 전달됐어요. (#10518) -
admission 웹훅에서
recoveryTarget검증을 강화했어요.targetXID는 이제 음이 아닌 32비트 정수여야 하고,targetName은 64바이트보다 짧고 ASCII 제어 문자가 없어야 해요. 잘못된 값은 나중에 PostgreSQL 복구 중 실패하는 대신 admission에서 거부돼요. (#10565) -
데이터 디렉터리에 남은
pgsql_tmp*디렉터리가 있을 때 스냅샷 복원이 실패하던 문제를 수정했어요. (#10447) -
PVC 저장소 크기와 리소스 요청이 동시에 변경될 때 발생하는 교착 상태를 수정했어요. (#10427)
버전 1.29.0
릴리스 날짜: 2026년 3월 31일
주요 변경 사항 (Important changes)
- 네이티브(트리 안) Barman Cloud 지원의 폐기 공지를 1.29.0이 아니라 CloudNativePG 1.30.0에서 제거된다는 내용으로 갱신했어요. 여전히 Barman Cloud Plugin으로 마이그레이션하는 것을 권장해요. (#10167)
기능 (Features)
-
이미지 카탈로그의 PostgreSQL 확장:
ImageCatalog기능을 확장해 PostgreSQL 확장을 지원하도록 했어요. 사용자가 카탈로그 내에서 확장별 이미지를 정의하고 관리해서 사용자 정의 PostgreSQL 빌드 배포를 단순화할 수 있어요. (#9781) -
포드 선택자를 통한 동적 네트워크 접근 제어:
pg_hba.conf규칙을 동적으로 관리하는 선언적podSelectorRefs정의를 도입했어요. 라벨 선택자로 클라이언트 pod를 식별하면 오퍼레이터가 그 임시 IP 주소를 자동으로 해석하고 PostgreSQL 호스트 기반 인증 규칙을 그에 맞게 갱신해요. 이를 통해 같은 네임스페이스의 인가된 워크로드만 데이터베이스에 연결할 수 있고, 수동 IP 관리나 정적 CIDR 범위가 필요 없어요. (#10148) -
공유
ServiceAccount지원:Cluster와Pooler스펙 모두에 선택적serviceAccountName필드를 추가했어요. 여러 리소스가 기존 ServiceAccount를 공유해서 모든 클러스터와 풀러에 걸쳐 일회성 IAM 구성(예: AWS IRSA, GCP Workload Identity, Azure Workload Identity)을 가능하게 해요. @bozkayasalihx 님의 기여. (#9287)
개선 사항 (Enhancements)
-
TLS 암호 스위트와 최소/최대 TLS 버전의 세밀한 구성을 지원하도록
PoolerCRD를 개선했어요. 관리자가 풀러-클라이언트와 풀러-서버 연결 모두에 대해 엄격한 보안 컴플라이언스 요구 사항을 충족할 수 있어요. @alex1989hu 님의 기여. (#9571) -
업그레이드 Job에
BackoffLimit=0을 설정해서 실패한pg_upgrade의 불필요한 재시도를 막아 메이저 업그레이드 신뢰성을 개선했어요. 사용자가 컨테이너 이미지를 되돌리면 오퍼레이터가 실패한 Job을 자동으로 삭제해서 클러스터가 원래 버전에서 우아하게 재시작해요. (#10104, #10298) -
리컨실레이션 루프의 주요 단계에서 네이티브 Kubernetes 이벤트를 내보내 오퍼레이터의 관측성을 개선했어요.
kubectl get events로 오퍼레이터의 의사 결정 과정과 관리 리소스의 수명 주기를 직접 볼 수 있어요. (#10040) -
Backup 리소스에 대한
cnpg.io/reconciliationDisabled어노테이션 지원을 확장했어요. 관리자가 특정 백업 객체에 대한 오퍼레이터의 리컨실레이션 로직을 일시적으로 동결할 수 있어요. @GabriFedi97 님의 기여. (#10020) -
postgresql.extensions스탠자와ImageCatalog,ClusterImageCatalog리소스에bin_path필드를 추가했어요. 확장이 외부 바이너리용 디렉터리 경로를 지정할 수 있고, Postgres 프로세스의PATH환경 변수에 자동으로 추가돼요. (#10250) -
postgresql.extensions스탠자와ImageCatalog,ClusterImageCatalog리소스에env필드를 추가했어요. 클러스터 관리자가 Postgres 프로세스의 사용자 정의 환경 변수를 정의할 수 있어요. 이 필드는${image_root}플레이스홀더를 지원해서 확장의 절대 마운트 경로로 동적으로 해석돼요. (#10375) -
플러그인용 finalizer를 구현해서 해당 Service가 삭제될 때 플러그인이 관리하는 리소스가 우아하게 정리되도록 했어요. (#9560)
-
각 리컨실레이션 주기 전에 인스턴스가 프라이머리인지 확인해서 역할 관리를 개선했어요. 읽기 전용 리플리카에서 불필요한 리컨실레이션 시도와 스퍼리어스 오류 메시지를 피해요. (#9971)
-
클러스터에 새 PVC를 추가할 때
primaryUpdateMethod를 존중하도록 했어요. 저장소 확장이나 추가 중 롤아웃 전략(예: switchover 대 restart)이 지켜지도록 해요. (#9720) -
alpha.cnpg.io/unrecoverable어노테이션 로직을 개선해서 아직Ready상태에 도달하지 않은 pod에서도 작동하게 했어요. 멈춘 인스턴스의 복구를 돕습니다. (#9968) -
복구 불가능한 문제(예: 잘못된 자격 증명, 존재하지 않는 클라우드 버킷)를 만나는 백업에 대해 "종료 오류(Terminal Error)" 단계를 도입했어요. 오퍼레이터가 실패가 확정된 작업을 재시도하지 않아 리소스 고갈을 막고 status에서 즉각적이고 명확한 피드백을 줍니다. (#9353)
-
Backupstatus에reconciliationStartedAt과reconciliationTerminatedAt필드를 도입해서 장기 실행 백업 모니터링을 개선했어요. 이 변경은 오퍼레이터의 내부 수명 주기와 실제 백업 도구의 실행 시점(startedAt/stoppedAt)을 분리해서 사용자가 오퍼레이터가 요청을 처리하기 시작한 시점을 추적할 수 있게 해요. (#9351) -
백업이 대기열에 있고 사용 가능한 워커나 인스턴스 가용성을 기다리고 있음을 명시적으로 나타내는
Backupstatus의Pending단계를 추가했어요. (#9364)
보안 및 공급망 (Security and Supply Chain)
-
보안 모범 사례 통합: 리포지토리에 OpenSSF 기준 스캐너를 통합하고
SECURITY-INSIGHTS.yaml파일을 추가해 업계 표준 보안 보고에 부합하도록 했어요. (#10054, #10062) -
SLSA 공급망 증명과 SBOM: 릴리스 바이너리와 컨테이너 이미지에 SLSA 공급망 증명을 추가했어요. 또한 GoReleaser 파이프라인에서 SBOM 생성을 활성화해 의존성 투명성을 개선했어요. (#10048, #10074)
-
비밀번호 유출 방지: 특정 리컨실레이션 단계에서 PostgreSQL이 로그에 역할 비밀번호를 유출할 수 있는 잠재적 보안 위험을 수정했어요. (#9950)
변경 사항 (Changes)
- 기본 PostgreSQL 버전을 18.3(이미지
18.3-system-trixie)으로 업데이트했어요. (#10090)
수정 사항 (Fixes)
-
동기 복제를 사용하는 클러스터에 영향을 주는 오퍼레이터 업그레이드 중 교착 상태를 수정했어요. 이전/새 오퍼레이터 버전의 pod가 서로 다른 PostgreSQL 구성 해시를 계산해서 균일성 검사가 무기한 차단되고 롤링 업데이트와 인플레이스 업그레이드가 모두 진행되지 않았어요. (#10342)
-
WAL 디스크가 가득 찼을 때 펜싱 어노테이션을 처리할 수 없던 문제를 수정했어요. 디스크 공간 검사가 인스턴스 매니저 시작을 막았기 때문이에요. 이제 검사는 펜싱이 평가된 후 수명 주기 루프에서 더 늦게 수행돼요. (#10302)
-
초기 부트스트랩에 사용된
VolumeSnapshot이 삭제됐을 때 리플리카가Pending상태에 갇히던 문제를 수정했어요. 이제 오퍼레이터가 사용 전에 스냅샷 존재를 검증해요. 스냅샷이 없으면 다음 사용 가능한 후보를 시도하거나pg_basebackup으로 폴백해요. (#10192) -
"감독 프라이머리(supervised primary)" 롤아웃 전략이 사용 가능한 모든 롤아웃 슬롯을 소비해서 예약된 업데이트가 지연되던 문제를 방지했어요. @ermakov-oleg 님의 기여. (#9977)
-
특정 hot-standby 파라미터 변경이 리플리카 클러스터에 올바르게 적용되지 않던 문제를 수정했어요. (#9952)
-
"continue" 결과가 반환될 때 이후 플러그인을 건너뛸 수 있었던 CNPG-I 리컨실러 훅의 버그를 수정했어요. @sharifmshaker 님의 기여. (#9978)
-
현재 어떤 Pod에도 연결되지 않은 PVC에서 파일시스템 크기를 조정하려 할 때 발생하는 교착 상태 시나리오를 수정했어요. @jmealo 님의 기여. (#9981)
-
ConnectionParameters로 구성된 외부 클러스터(pg_basebackup기반 복구)를 승인하도록 부트스트랩 복구 소스의 웹훅 검증을 수정했어요. 이전에는 Barman 객체 저장소나 CNPG-I 플러그인도 구성하지 않는 한 잘못 거부됐어요. (#10268) -
확장 프로그램과 테이블스페이스의 볼륨 이름에 접두사를 붙여 표준 클러스터 볼륨과의 이름 충돌을 피하도록 했어요. (#9973)
-
비정상 클러스터를 하이버네이션할 때
WaitingForHealthy조건을 보고해서, 연기된 하이버네이션 상태가cnpg status로 보이도록 했어요. (#10193) -
대상 pod가 존재하지 않을 때도 펜싱이 올바르게 작동하도록 수정했어요. 펜싱은 클러스터 수준 어노테이션에서 작동하며 pod 존재에 의존하지 않아야 해요. 인스턴스 이름 검증은 이제
cnpg fencing on명령에서만 수행돼요. (#10035) -
patch 업데이트 전략 사용 시 모든 스펙 필드 변경을 올바르게 처리하도록 클러스터와 풀러 서비스 리컨실러를 수정했어요. 리컨실러가 이제 RFC 7386 JSON Merge Patching을 사용해서 클라우드 제공자가 설정한 필드(예:
loadBalancerClass)가 우연히 제거되는 것을 방지해요. (#10190, #10311) -
폐기된 트리 안 Barman Cloud 백업 구현의 병렬 WAL 복원에 영향을 주는 경쟁 조건을 수정했어요. 프리페치된 파일이 아직 다운로드 중에 읽혀서 PostgreSQL 복구가 "invalid checkpoint record" 오류로 실패할 수 있었어요. (#10285)
-
타임라인 history 파일 검증을 플러그인 기반 WAL 복원에도 적용하도록 수정했어요. 이전에는 #9650에서 도입된 보호가 트리 안 복원만 다뤄서 플러그인이 검사를 우회하고 미래 타임라인 history 파일을 다운로드해 리플리카에서 타임라인 불일치 오류가 발생할 수 있었어요. (#9849)
-
cnpg플러그인:- cnpg 플러그인이
pgbenchJob pod 템플릿에 ImagePullSecrets를 올바르게 전파하도록 했어요. (#10174)
- cnpg 플러그인이
지원 버전 (Supported versions)
- Kubernetes 1.35, 1.34, 1.33
- PostgreSQL 18, 17, 16, 15, 14
- PostgreSQL 18.3이 기본 이미지예요
- PostgreSQL 14 지원은 2026년 11월 12일에 종료돼요