CloudNativePG 1.30 릴리스 노트
CloudNativePG 1.30 릴리스 노트 (Release notes for CloudNativePG 1.30)
CloudNativePG의 1.30 마이너 릴리스에서 사용자에게 보이는 변경 사항의 이력을 담고 있어요.
전체 변경 목록은 GitHub의 릴리스 분기 commits을 참조하세요.
출처: 문서
본문
버전 1.30.1
릴리스 날짜: 2026년 9월 23일
개선 사항 (Enhancements)
-
인트리(in-tree) Barman Cloud 복구를 위해
.barmanObjectStore.data에restoreAdditionalCommandArgs를 추가해서, 복구 중 커스텀 플래그가barman-cloud-restore로 전달되도록 했어요. (#11278) -
플러그인 작성자는 빈 WAL 아카이브를 오류로 취급해야 하는지 더 이상 다시 유도할 필요가 없어요. 이제 오퍼레이터가
check_empty_wal_archive결정을 한 번 계산해 WAL 아카이빙과 복원 훅 둘 다에서 CNPG-I 플러그인에 전달해요. (#11216) -
.spec.postgresql.parameters에서ssl_ecdh_curvePostgreSQL 파라미터를 설정할 수 있게 됐어요. 오퍼레이터가 이 값을 관리하지 않는데도 이전에는 validating webhook이 거부했어요. @Jamstah가 기여했어요. (#11308) -
spec.pgbouncer.parameters에서auth_user를 설정해 PgBouncer가auth_query연결에 사용하는 사용자를 항상authQuerySecret에서 유도하는 대신 재정의할 수 있게 됐어요. 인증할 역할이 Secret이 암시하는 역할과 다른 커스텀authQuerySecret에 유용해요. @jonasbadstuebner가 기여했어요. (#10899) -
PgBouncer가 열을 추가하거나 재배열할 때 PgBouncer 메트릭이 조용히 0을 보고하던 것을 수정했어요:
SHOW STATS와SHOW POOLS결과가 이제 위치가 아니라 열 이름으로 매칭돼요. @AdzerKI(SHOW STATS)가 기여했어요. (#11366, #11464) -
cnpg플러그인:backup명령에--dry-run옵션을 추가해서, 생성되지 않고 만들어질Backup리소스를 출력하도록 했어요. (#11233)
보안 및 공급망 (Security and Supply Chain)
-
..순회가 내장된 절대 확장 경로(예:/a/../../../../etc)가 raw 경로만 확인되어 허용되던 webhook 검증 우회를 수정했어요. 그런 경로는 여전히 런타임에 해석되면 확장의 마운트 지점을 벗어났어요. 이제 영향받는 항목은 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 오퍼랜드 이미지를 18.6-system-trixie로 업데이트했어요. (#11257)
-
오퍼레이터 자신의 베이스 이미지를 Debian 12 (bookworm)에서 Debian 13 (trixie)으로 옮겼어요. 이제 Debian 12가 LTS 전용 유지보수로 전환됐기 때문이에요. (#11193)
수정 사항 (Fixes)
-
장애 조치 중 도달할 수 없는 이전 프라이머리를, 완료될 수 없는 체크포인트와 fast-shutdown 시도를 기다리는 대신 즉시 강등하도록 했어요. 이전에는 PostgreSQL이 응답하지 않게 된 이전 프라이머리가 절대 종료되지 않아 새 프라이머리의 레플리카로 재합류할 수 없었어요. 이제 종료는 reconciler를 차단하지 않고 요청되지만, PostgreSQL이 종료 신호를 계속 무시하면 강등은 여전히 1분 이상 걸릴 수 있어요. (#11347)
-
클러스터의 어떤 인스턴스가 펜싱(fenced)된 상태에서 장애 조치와 Pod 재생성이 멈추는 것을 수정했어요. 펜싱된 인스턴스는 Pod가 영구적으로 Not Ready인데도 status 엔드포인트에서 계속 스스로 healthy라고 보고해서, readiness 가드, 프라이머리 선거 로직, Pod 재부착 게이트가 클러스터 다른 곳의 무관한 실패에 반응하지 못하게 막았고, 누군가 수동으로 펜싱을 제거할 때까지 멈춰 있었어요. 이제 세 가지 모두 펜싱된 인스턴스를 인식하고 건너뛰어요. (#11274)
-
영원히 멈추거나 조용히 되돌려질 수 있던 장애 조치를 수정했어요. 장애 조치가 대기 중인 동안 reconciler가 완료할 준비가 되었는지 확인을 건너뛰거나, 대기 상태를 Pod 누락으로 오인해 대상 프라이머리를 비정상 인스턴스로 되돌릴 수 있었어요. 이제 보류 중인 장애 조치를 계속 진행하고 WAL 수신자가 내려가면 완료하며, 승격 직전에 기다리는 동안 쿼럼 안전이 바뀌었는지 재확인해요. (#11336)
-
PostgresqlStatusList의 designated-primary 정렬을 수정해서 LSN이 같을 때 순서가 어긋나게 정렬되지 않도록 했어요. designated primary의 Pod가 나중에 상태 목록에서 사라지면 오퍼레이터가 잘못된 스탠바이를 승격할 수 있었어요. (#11494) -
인스턴스 매니저가 실제로 프라이머리
Lease를 보유할 때까지 PostgreSQL 시작을 게이트로 막아, 재시작하거나 재스케줄된 프라이머리가 리스 획득 전에 쓰기 수락을 시작할 수 있던 창을 닫았어요. 이제 리스 획득은 인스턴스 초기화 중, PostgreSQL이 시작되기 전에 엄격하게 발생하며, 인스턴스가 이미 ready로 보고된 후 조정 루프에서 나중에만 발생하는 것이 아니에요. (#11356) -
프라이머리 리스 인수
Get호출을 리스의RenewDeadline으로 제한해서, 도달할 수 없는 API 서버에 대한 호출이 무기한 차단하는 대신 빠르게 실패하고 재시도하도록 했어요. 제한이 없으면 같은 멈춘 호출이 일시적인 API 서버 블립 후 프라이머리 자신의 리스 갱신을 지연시킬 수도 있었고, 리스가 만료된 것처럼 보이면 다른 인스턴스가 원치 않는 인수를 유발할 위험이 있었어요. (#11350) -
60초 후 fast shutdown을 포기하던 것을 중단했어요. 요청이 명시적 타임아웃을 지니지 않아
pg_ctl이 자신의 암시적 60초 한도로 폴백했고, 컨테이너의 PID 1인 인스턴스 매니저가 더 큰 구성된stopDelay와 무관하게 종료 중에 PostgreSQL을 내려버렸어요. 이제 fast 단계는 전체stopDelay를 기다려요. (#11263) -
부트스트랩 중 시크릿을 새로고침하기 전에 인증서 상태를 기다리도록 했어요. (#11450)
-
인트리 Barman Cloud 복구가
wal.maxParallel과wal.restoreAdditionalCommandArgs를 무시하고, 구성된 병렬성을 사용하는 대신 WAL을 한 번에 한 세그먼트씩 가져오던 것을 수정했어요. (#11105) -
pending과 terminating 인스턴스에서
unrecoverable주석을 존중하도록 했어요. (#11241) -
VolumeSnapshot 기반 백업을 마무리할 때
Backup.spec.online을 존중해서, 콜드 백업이 더 이상 상태에서 online으로 보고되지 않도록 했어요. (#11276) -
PostgreSQL 18+에서
.spec.postgresql.dataChecksums가false일 때--no-data-checksums를 명시적으로 설정하도록 했어요. 18+는 이제initdb에서 체크섬을 기본적으로 활성화하기 때문이에요. @evan314159이 기여했어요. (#11488) -
PVC 조정 시
.spec.inheritedMetadata레이블을 버리던 것을 중단했어요. 이전에는 적용된 후 오퍼레이터 자신의 레이블로 덮어써졌어요. @GellertBabel이 기여했어요. (#11499) -
Pooler와DatabaseRole이 삭제 표시된 후 소유 리소스를 다시 생성하는 것을 중단했어요. 이는 그 리소스가 사라지기를 기다리는 외부 finalizer(예: ArgoCD foreground 삭제)를 차단할 수 있었어요. @mjlshen이 기여했어요. (#11359) -
pg_stat_wal메트릭에서NULLstats_reset값을 처리하도록 했어요. 이 값은 PostgreSQL 18 클러스터에서 가끔 Prometheus 스크래핑을 깨뜨릴 수 있었어요. @HoniSanders가 기여했어요. (#11207) -
오래된 비-FIFO 파일이 로그 파이프를 막았을 때 로그 스트리밍을 복구하도록 했어요. (#11246)
-
Pod의 프로세스 로그 샘플링을 중단해서, 로그 줄이 조용히 버려지지 않도록 했어요. (#11131)
-
오퍼레이터가 Helm 릴리스 시크릿을 캐시하는 것을 중단했어요. 대형 Helm 릴리스가 함께 설치된 클러스터에서 메모리 사용량이 급증하고 오퍼레이터가 크래시루프할 수 있었어요. (#11211)
-
오퍼레이터 재시작 후 소유 리소스 finalizer 정리를 다시 실행하도록 해서, 오퍼레이터가 내려간 동안 삭제된 네임스페이스가 영원히
Terminating에 매달리지 않도록 했어요. (#11215) -
WAL 프리페칭(
wal.maxParallel > 1)이 활성화되었을 때 재합류하는 레플리카가pg_rewind완료에 오래 걸리던 것을 수정했어요. (#11204) -
프로브에서 연결을 거부하는 PostgreSQL 인스턴스를 시작된 것으로 취급하도록 했어요. (#11152)
-
클러스터의
pvcTemplate가volumeAttributesClass를 설정할 때 매 조정마다 중복 PATCH를 발행하던 것을 중단했어요. @andrew-farries가 기여했어요. (#11196) -
첫 번째 실패한 슬롯에서 복제 슬롯 조정을 멈추던 것을 중단했어요. (#11119)
-
롤아웃 중 디스크의 구성 해시가 아니라 실행 중인 구성 해시를 비교해서 불필요한 스위치오버를 피하도록 했어요. (#11130)
-
일찍 포기하는 대신 데드라인까지
VolumeSnapshot오류를 재시도하도록 했어요. (#11132) -
플러그인 기반 복구 중 데이터 볼륨에 WAL을 재생하는 대신
pg_wal을 WAL 볼륨으로 심링크하도록 했어요. 데이터 볼륨에 재생하면 대규모 시점 복구에서 고갈될 수 있었어요. (#11127) -
PhaseUpgradeDelayed상태 메시지의 문법을 수정했어요. @Utkarsh-sharma47가 기여했어요. (#11065) -
CloudNativePG Interface (CNPG-I):
-
cnpg플러그인:
버전 1.30.0
릴리스 날짜: 2026년 6월 29일
중요한 변경 사항 (Important changes)
-
네이티브(인트리) Barman Cloud 지원의 지원 중단 공지를, 1.30.0이 아니라 이제 CloudNativePG 1.31.0에서 제거된다는 내용으로 업데이트했어요. 사용자는 여전히 Barman Cloud Plugin으로 마이그레이션하도록 권장돼요. (#11083)
-
Database,Pooler,Publication,Subscription,ScheduledBackup리소스에서cluster참조가 이제 불변(immutable)이에요. 이들 객체 중 하나를 다른 클러스터를 가리키게 하는 것은 잘 정의된 의미가 없으며 이전에는 컨트롤러를 일관되지 않은 상태로 남겼어요; 이제 업데이트는 CEL 검증 규칙으로 API 서버에서 거부돼요. (#10743)
기능 (Features)
-
안전한 프라이머리 선거를 위한 프라이머리
Lease: 클러스터 이름을 딴 쿠버네티스Lease객체를 도입해, 프라이머리 승격을 직렬화하는 뮤텍스로 동작하도록 했어요: 인스턴스 매니저는 프라이머리로 동작하기 전에 리스를 보유해야 하며, 깨끗한 종료 시 이를 해제해서 레플리카가 전체 TTL을 기다리지 않고 승격할 수 있게 해요. 타이밍은 새.spec.primaryLeasestanza로 구성 가능해요. 리스는 펜스가 아니라 승격 게이트예요. 프라이머리 격리는 여전히 펜싱을 담당해요. (#10627) -
선언적 역할 관리를 위한
DatabaseRoleCRD:Cluster의.spec.managed.rolesstanza에 인라인으로 선언하는 대신, PostgreSQL 역할을 독립형 쿠버네티스 객체로 관리하는DatabaseRole커스텀 리소스를 도입했어요. 각 역할은 자신의 수명 주기, 상태, RBAC을 가지며, 이는 GitOps 워크플로에 적합하고 역할 정의를 그들을 소유한 애플리케이션 옆에 둘 수 있게 해요. 사양은 인라인 방식과 같은RoleConfiguration구조를 재사용하므로, 역할 마이그레이션은 stanza를 자신의 매니페스트로 옮기는 문제예요.databaseRoleReclaimPolicy필드(retain, 기본값, 또는delete)는 영구 볼륨을 반영해 리소스가 삭제될 때 역할에 무슨 일이 일어날지 제어해요. (#6155) -
선언적 역할을 위한 TLS 클라이언트 인증서:
DatabaseRole이 이제clientCertificate블록을 포함해 오퍼레이터가 클러스터의 클라이언트 CA로 서명되고<databaserole-name>-client-certSecret에 저장된 TLS 클라이언트 인증서를 자동 생성·갱신하게 할 수 있어요. 이를 통해 비밀번호 없는 PostgreSQLcert인증이 가능해지며, 기능이 비활성화되거나DatabaseRole이 삭제되면 Secret이 정리돼요. (#10896) -
이미지 카탈로그를 통한 PgBouncer 이미지 관리:
Pooler리소스가 새spec.pgbouncer.imageCatalogRef필드를 통해ImageCatalog또는ClusterImageCatalog의 항목을 참조할 수 있게 돼, PgBouncer 이미지 관리를 중앙화해요. 카탈로그 항목이 업데이트되면 참조하는 모든Pooler가 스펙 변경 없이 자동 조정되고 새 이미지를 롤아웃해요. 해석된 이미지는status.image에 보고되며, 새status.phase(active,paused,inactive,failed)가kubectl get pooler의Phase열로도 표시되어 수명 주기를 요약해요. (#10568)
개선 사항 (Enhancements)
-
Image Volume 확장을 사용하는 클러스터의 PostgreSQL 19 이상으로의
pg_upgrade인플레이스 메이저 업그레이드를 활성화했어요. PostgreSQL 19에서pg_upgrade에 추가된 확장 경로 지원을 기반으로 해요. 업그레이드Job동안 소스 및 대상 버전 확장 이미지가 나란히 마운트되므로, 이전 서버는 라이브러리를 유지하고 실패한 업그레이드는 깨끗하게 되돌려져요. (#10366) -
.spec.monitoring.tls.enabled를 통해Pooler메트릭 엔드포인트에 TLS 지원을 추가했어요. 활성화되면 메트릭 서버가 HTTPS로 서빙되며,.spec.pgbouncer.clientTLSSecret의 인증서와 키를 재사용하고 회전을 지원하기 위해 매 핸드셰이크마다 다시 로드해요 (재시작 불필요). 생성된PodMonitor는 그에 따라https로 스크랩해요. (#10466) -
Clusterscale 하위리소스(status.selector)에 레이블 셀렉터를 추가해서,Cluster가 Vertical Pod Autoscaler(VPA)와 Horizontal Pod Autoscaler(HPA)의 유효한targetRef가 되게 했어요. 이제Cluster를 인스턴스 Pod에 매핑할 수 있어요. @sebv004가 기여했어요. (#8996) -
프라이머리 Pod가 kubelet 관점에서
Ready인데 오퍼레이터의/pg/status검사가 실패하고 장애 조치가 연기될 때, 오퍼레이터가Cluster에서WarningPrimaryStatusCheckFailed이벤트를 발생시키도록 했어요.kubectl describe cluster로 사용자가 연기를 볼 수 있게 해줘요. (#10509) -
ENABLE_WEBHOOK_NAMESPACE_SUFFIX플래그를 추가해서, 오퍼레이터의 webhook 구성 이름에-<OPERATOR_NAMESPACE>접미사를 붙여 여러 오퍼레이터 인스턴스가 같은 클러스터에서 공존할 수 있게 했어요. 오퍼레이터는 이 구성만 조회하며, 사용자가 만들고 유지해야 해요. @maxlengdell이 기여했어요. (#10420) -
오퍼레이터가 CNPG-i 플러그인의 Pod가 롤아웃될 때 자동으로 다시 로드하도록 했어요: 플러그인
Services를 뒷받침하는EndpointSlices를 감시하고, 새 Pod가Ready가 되면 플러그인을 사용하는 모든 클러스터를 다시 큐에 넣어, 다음 resync를 기다리지 않고 업그레이드된 플러그인이 선택되도록 해요. (#10836) -
인스턴스 시리얼 번호가 이제 전역 카운터를 항상 증가시키는 대신 기존 인스턴스 이름 중 가장 낮은 빈 슬롯을 재사용해 할당돼요. Pod와 PVC 이름은 인스턴스 재생성 전반에 걸쳐 안정적으로 유지되며(예: 노드 드레인 후 재생성된 인스턴스가 같은 이름으로 돌아옴), 삭제된 인스턴스가 비운 시리얼은 회수돼요. 새
Initialized클러스터 조건이 클러스터가 첫 번째 부트스트랩을 완료했는지 보고하고,status.latestGeneratedNode는 지원 중단됐어요: 더 이상 기록되지 않지만 하위 호환을 위해 CRD에 보존돼요. (#10548) -
입소 webhook을 사용할 수 없거나 실패 무시로 구성된 경우, 조정 중에 기본값 설정과 검증이 폴백으로 실행되도록 해서, 오퍼레이터가 더 이상 잘못되거나 불완전한 사양을 조정하지 않도록 했어요. 누락된 기본값은 직접 적용되고, 검증 실패는 나중에 조용히 실패하는 대신 리소스 상태에 드러나요. (#10874)
보안 (Security)
-
CVE-2026-55769/GHSA-x8c2-3p4r-v9r6: 오퍼레이터 발행 연결의search_path고정: 데이터베이스 소유자가public스키마에 오버로드된 내장 연산자를 심고search_path를 변경해서, 클러스터 슈퍼유저로 실행되는 연산자 검사 프로브가pg_catalog보다 먼저 그 오버로드를 해석하게 만들 수 있었어요. 이는CWE-426권한 상승 체인(CVE-2018-1058과 같은 종류)으로,COPY ... FROM PROGRAM을 통해 인포드 RCE로 이어질 수 있었어요. 이제 오퍼레이터는 모든 풀링된 연결에서search_path = pg_catalog, public, pg_temp를 고정해서 startup 메시지에 포함되고 테넌트가 통제하는 기본값보다 우선하도록 해요. (#10774,GHSA-x8c2-3p4r-v9r6) -
GHSA-7qwx-x8ff-3px9: 인증된 오퍼레이터-인스턴스 매니저 호출: 인스턴스 매니저의 원격 웹서버가 오퍼레이터 전용 제어 엔드포인트에 대해 인증 대신 네트워크 격리에 의존했어서, Pod의 status 포트에 도달할 수 있는 누구든 이들을 호출해 백업 조정과 WAL 아카이빙을 방해하고 운영 메타데이터를 읽을 수 있었어요. (업그레이드 엔드포인트는 SHA-256 고정이므로 임의 코드 실행은 허용되지 않았어요.) 이제 오퍼레이터는 시작 시 인메모리 ECDSA P-256 클라이언트 인증서를 생성하고 그 SHA-256 지문을 클러스터 상태로 조정해요; 인스턴스 매니저는 일치하는 인증서를 제시하지 않는 민감한 엔드포인트에 대한 요청을 거부해요. 이 강화는 백포트되지 않아요; 이전 릴리스는NetworkPolicy로 status 포트를 계속 제한해야 해요. (#10579,GHSA-7qwx-x8ff-3px9) -
CVE-2026-55765/GHSA-w3gf-xc94-wvmj: 오퍼레이터 측 SCRAM-SHA-256 비밀번호 인코딩: 이제 오퍼레이터는CREATE/ALTER ROLE ... PASSWORD를 발행하기 전에 평문 역할 비밀번호를 SCRAM-SHA-256으로 인코딩해서, PostgreSQL이 파싱하고(pg_stat_statements나pgaudit같은 확장이 캡처할 수 있는) 리터럴이 평문 시크릿이 아니라 SCRAM 검증기(verifier)가 되도록 해요. 사전 해시된(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)
-
선언적
Database,Publication,Subscription객체가 클러스터가 레플리카로 강등된 후에도 영원히 오래된 프라이머리 측 상태를 보고하던 것을 수정했어요. 이제 컨트롤러가 레플리카 조건을 다시 확인하고Cluster를 감시해서 강등을 신속히 감지해요. (#10871) -
인스턴스 시리얼 카운터가 상응하는
Job과 PVC가 생성되기 전에 증가되어 생기는 비순차 Pod 이름(예:-1,-3)을 수정했어요. 이제 증가는 그 리소스들이 존재한 후에만 지속돼요. (#10491) -
레플리카 클러스터에서
Database,Publication,Subscription삭제가Terminating에 갇히는 것을 수정했어요. 레플리카 게이트가 finalizer reconciler보다 먼저 실행되어 finalizer가 결코 해제되지 않았어요. 레플리카에서는 PostgreSQL 객체가 프라이머리 클러스터에 맡겨져요. (#10853) -
delete회수 정책을 가진 충돌하는 중복Database또는Subscription이 생존 CR이 소유한 PostgreSQL 객체를 떨어뜨리던 것을 수정했어요. 이제 드롭은 기록된 조정에 게이트로 의존해요. (#10870) -
슈퍼유저 접근이 비활성화된 후 다시 활성화되면
postgres슈퍼유저가 잠긴 채로 남는 것을 수정했어요. 캐시된 시크릿 버전이 무효화되지 않아 비밀번호가 재적용되지 않았기 때문이에요. @mhartmann-jaconi가 진단했어요. (#10834) -
백업이 백업을 실행 중인 인스턴스 매니저가
running에 도달하기 전에 재시작될 때(예: 오퍼레이터 업그레이드에 따른 인플레이스 업그레이드)started단계에 갇히던 것을 수정했어요. 이제 조정이 재스케줄되어 손실된 세션이 감지돼요. (#10859) -
exec/attach스트리밍이 WebSocket을 협상하되 SPDY 폴백을 두도록 수정해서, SPDY를 제거한 Kubernetes 버전과 WebSocket exec 업그레이드를 거부하는 OpenShift 같은 플랫폼 둘 다와의 호환성을 복원했어요. @bartscheers가 기여했어요. (#10876, #10933) -
동시
Backup객체가 경합할 때의 리소스 누수를 수정했어요: 이제 백업이 엄격한 생성 시간 순서로 실행되어, 이미 실행 중인 백업이 더 새로운 것에 선점되지 않고 그 복제 슬롯과 PostgreSQL 세션이 프라이머리에서 더 이상 고아가 되지 않아요. @GabriFedi97이 기여했어요. (#10747) -
참조된 Secret을 가져올 수 없을 때 역할 조정이 PostgreSQL 역할의 비밀번호를 지우던 것을 수정했어요. 이제 Secret을 사용할 수 있을 때까지 역할은 그대로 두며, 동작별 오류가 더 나은 가시성을 위해 집계돼요. (#10053)
-
메트릭 exporter 설정 오류(흔히 컨트롤러와의 중복 키 경합)가
streaming_replica생성의 롤백을 일으키고 레플리카 합류를 가로막던 부트스트랩 실패를 수정했어요. 이제 메트릭 exporter 단계가 별도 트랜잭션에서 실행돼요. @BlaiseAntony가 기여했어요. (#10749) -
Backup이 생성되었지만 그 상태 패치가 착지하지 않을 때 발생하던ScheduledBackup컨트롤러 루프를 수정했어요. 이제 컨트롤러는AlreadyExists로 루프하는 대신 다음 반복을 위해 기존Backup을 채택해요. (#10612) -
Cluster가 삭제된Pooler를 조정할 때의 nil-pointer 패닉을 수정했어요. (#10667) -
부트스트랩 로그 처리를 수정해서
WithActiveInstance동안 모든 명명된 로그 파이프(postgres,postgres.csv,postgres.json)가 소비자를 갖도록 했어요. 명명된 파이프 대신 일반 파일이 생성되는 것을 방지해요. (#10043) -
주소를 대괄호로 감싸 잘못된 IPv6 URL 생성이 발생하는 것을 수정했어요. @Infinoid가 기여했어요. (#10682)
-
외부 클러스터 플러그인의 구성이
enabled: false를 설정했는데도 여전히 활성으로 취급되던 것을 수정했어요. (#10932) -
오브젝트 스토어에서 부트스트랩 복구 중, 복원 Job이 오래된
Cluster(프라이머리가 아직 기록되지 않고 타임라인도 아직 설정되지 않음)를 읽고.history파일이 분할 뇌(split-brain) 가드에 의해 거부될 수 있던 경합을 수정했어요. 이 경우 복구가 베이스 백업의 타임라인에서 멈추고 이후 타임라인에서 커밋된 트랜잭션을 조용히 버렸어요. 이제 클러스터 타임라인이 설정되지 않은 동안 history 파일이 허용돼요. @dennispidun이 기여했어요. (#10818) -
인스턴스의 PVC 삭제가 인스턴스를 영구적으로 멈추게 할 수 있던 경합을 수정했어요: WAL PVC가 여전히 종료 중인 동안 데이터 PVC가 제거되면, 오퍼레이터가 종료 중인 볼륨에 바인딩된 인스턴스를 재생성해 Pod를 스케줄 불가로 만들고 모든 추가 조정을 막았어요. 이제 오퍼레이터는 인스턴스를 재생성하거나 재부착하기 전에 종료 중인 PVC가 완전히 제거될 때까지 기다리며, 로그 줄과 클러스터 단계로 대기를 표면화해요. (#11017)
-
서버와 클라이언트 CA가 같은 Secret(기본값)으로 해석될 때 클러스터 생성 중 캐시 경합을 수정했어요: 오래된 informer 캐시가 중복
Create를 트리거해AlreadyExists로 실패하고 클러스터를Unable to create required cluster objects에 갇히게 할 수 있었어요. 이제 이름이 일치하면 오퍼레이터가 이미 가져온 CA Secret을 재사용해요. (#10989) -
다른 부트스트랩 방법이 이미 적용하는 것과 같은 사전 비행 디렉토리 검사를 강제함으로써,
pg_basebackup부트스트랩 경로가 기존PGDATA를 덮어쓰거나 실패하던 것(예: 레플리카 Pod 재시작 후)을 수정했어요. 이는 정적으로 프로비저닝된 PVC가 조용히 덮어써지는 것도 보호해요. (#11006) -
post-reconcile 플러그인 훅이 오류를 반환할 때
Cluster단계가Healthy와 플러그인 실패 단계 사이에서 깜빡이는 것을 수정했어요. 이제Healthy단계는 성공한 조정의 마지막 단계로 등록되어, 플러그인 오류로 끝나는 루프가 절대Healthy를 보고하지 않아요. @GabriFedi97이 기여했어요. (#10421) -
외부 서버의 Secret이 회전된 후(예: CA 번들이 인증서 두 개에서 하나로 줄어듦) 오래된 인증서 데이터와 부분 읽기가 발생하던 것을 수정했어요. 이제 파일이 원자적으로 기록되므로 libpq는 항상 이전 또는 새 값 중 하나만 읽고 절대 혼합을 읽지 않아요. @Anand-240이 기여했어요. (#10975)
-
플러그인 연결이 짧은 이름 대신 플러그인
ServiceFQDN을 사용하도록 수정해서, 클러스터 수준 프록시가 Pod에 자동 주입될 때의 실패를 피했어요. @kdautrey가 기여했어요. (#10921) -
요청별
Clustercreate/update 검증 webhook 메시지의 과도한 오퍼레이터 로그 노이즈를 수정했어요. 이제info대신debug로 기록돼요. (#10984) -
spec.postgresql.parameters가 유효한 PostgreSQL 파라미터 이름이 아닌 키를 받아서postgresql.conf에 임의 지시문을 주입할 수 있던 것을 수정했어요. 이제 키 이름이 webhook으로 검증돼요. (#11029) -
기존 클러스터에서 WAL-아카이버 플러그인이 활성화되었을 때 스위치오버 교착을 수정했어요:
primaryUpdateMethod: switchover에서 깨끗한 강등이 아직 없는 아카이버 사이드카를 필요로 하므로 프라이머리를 롤아웃할 수 없었어요. 이제 오퍼레이터가 프라이머리 Pod를 제자리에서 재생성해 사이드카가 주입되고 아카이빙이 재개돼요. 검사는 Barman Cloud 플러그인처럼 아카이버를 네이티브 사이드카(restartPolicy: Always가 있는 init container)로 주입하는 플러그인도 포함해요. (#11032, #11059) -
인스턴스 생성 Job이 backoff 한계를 소진했을 때 클러스터가 무기한
Setting up primary에 남는 것을 수정했어요. 이제 오퍼레이터가 종료 Job 실패를 감지하고 실패한 Job을 밝혀 그 로그를 가리키며 클러스터를 복구 불가(unrecoverable)로 표시해요. (#11035) -
데이터 PVC가 생성된 후 초기화 Job이 시작되기 전에 status-patch 충돌이 발생해 고아 Pending PVC를 인스턴스로 세어 부트스트랩 게이트를 막던 첫 프라이머리 부트스트랩 교착을 수정했어요. 이제 PVC 상태 reconciler가 할당된 시리얼을 재사용해 부트스트랩 Job을 재생성해요. (#11039)
-
외부 클러스터 이름과 시크릿 셀렉터 참조가 검증 없이 파일시스템 경로에 결합되던 것을 수정했어요. 인스턴스 매니저가 연결 자료를 덤프할 때
..구성 요소나 경로 구분자가 외부 시크릿 디렉토리를 벗어날 수 있었어요. 이제 이 값들은 validating webhook에서 거부되고 쓰기 지점에서 다시 확인돼요. @r0binak이 보고했어요. (#11045) -
백업이 영원히
pending에 갇히던 것을 수정했어요: 동시 백업 게이트가 매 조정마다 실행되어 인스턴스 매니저가 비동기로 기록한 이미 완료된 단계를 덮어쓸 수 있었어요. 이제 게이트는 백업 단계가 여전히 설정되지 않거나pending일 때만 실행돼요. (#11056) -
오래된 캐시가 오퍼레이터로 하여금 이미 프로비저닝한 스냅샷을 다시 만들게 해
AlreadyExists로 실패할 때, 선언적VolumeSnapshot백업이 영구적으로 실패로 표시되던 것을 수정했어요. 이제 기존 스냅샷이 이 백업의 레이블을 지니면 오퍼레이터가 충돌을 허용하고 채택해요. 외부 스냅샷과의 충돌은 여전히 오류로 표면화돼요. (#11071) -
finalize 단계 중 일시적 인스턴스 매니저 연결 오류(예: 짧은 pod-network 중단으로 인한 dial 타임아웃)로 볼륨 스냅샷 백업이 버려지던 것을 수정했어요. 스냅샷이 이미 프로비저닝되었어도 그랬어요. 이제 그러한 네트워크 오류는 종료로 취급되는 대신 재시도돼요. (#11069)
-
토큰 저장과 전환 메타데이터 정리 사이에 조정이 다시 큐에 들어갈 때(예: 깜빡이는 webhook에 대해 정리 패치가 실패) 레플리카 스위치오버가
status.demotionToken을 잃던 것을 수정했어요. 빈 no-change 토큰이 더 이상 저장된 값 위에 패치로 덮어써지지 않아요. (#11075) -
cnpg플러그인:
지원되는 버전 (Supported versions)
- Kubernetes 1.36, 1.35, 1.34
- PostgreSQL 18, 17, 16, 15, 14
- PostgreSQL 18.4가 기본 이미지
- PostgreSQL 14 지원은 2026년 11월 12일에 종료