6878b61efa
security-catalog 프로젝트에서 첫 실사용 자체 빌드 이미지 3종을 포팅한다 — 전부
상위 태그·베이스 OS 교체로 해소 안 되는 CVE(Go 모듈 정적 링크 또는 미수정 CRITICAL/
HIGH)를 자체 빌드(소스 컴파일 또는 SUSE BCI 재설치)로 대응한다:
- images/cloudnative-pg: CNPG operator, release-1.30 소스 컴파일 + bci-micro
- images/cnpg-postgresql: PostgreSQL 18.4, bci-base + zypper 재설치
- images/etcd: etcd v3.7.1, 소스 컴파일(x/text 강제 업그레이드) + bci-micro
함께 추가:
- manifests/helm/{cloudnative-pg,cnpg-cluster,etcd} — 위 이미지를 참조하는 카탈로그 차트
- scripts/deploy-test/*.sh, .claude/deploy-test-procedure.md — CVE 0건과 별개로
"실제로 뜨는가"를 검증하는 배포 스모크 테스트
- .claude/pitfalls.md — 자체 빌드/배포 테스트 중 실측한 함정 모음
검토 중 발견해 반영한 수정:
- cloudnative-pg 차트의 image 블록을 etcd와 동일한 registry/repository/tag 3필드+
따옴표 포맷으로 통일 — 기존 포맷(repository에 registry+repo 결합, 따옴표 없음)은
patch-catalog-tag.py 의 split 패처가 tag만 갱신하고 repository는 그대로 남기는
조용한 부분 치환을 일으켜, 향후 레지스트리 마이그레이션 시 깨진 참조를 만들 수 있었다
- cnpg-cluster 차트의 SLES 커버리지 코멘트를 최신 실측(trivy가 SLES 15.7을 정상
커버함, 2026-07-29 재측정)에 맞게 정정 — 폐기된 "측정 불가/OVAL 우회 필요" 결론이
남아있었다
- CLAUDE.md/MEMORY.md 의 "images/ 디렉토리 없음" 서술을 갱신하고, 레지스트리
마이그레이션(docker.io/wbsong111 → docker.io/paasup)·decisions/analysis 문서 이관·
리소스 프로파일 추가를 다음 작업으로 기록
이 3개 이미지는 아직 dip-catalog 자체 CI(build-image.yml)로 빌드·게이트·push 를
실행해본 적이 없다 — 현재 참조 태그는 security-catalog 쪽에서 이미 검증된 것이다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
168 lines
5.6 KiB
YAML
168 lines
5.6 KiB
YAML
# Default values for cnpg-cluster
|
|
# CloudNativePG operator(cloudnative-pg 차트)가 먼저 설치되어 있어야 한다.
|
|
nameOverride: ""
|
|
namespaceOverride: ""
|
|
|
|
# PostgreSQL 인스턴스 수. 1 = 단독, 3 이상 = primary 1 + replica N-1
|
|
instances: 3
|
|
|
|
postgresql:
|
|
image:
|
|
repository: ghcr.io/cloudnative-pg/postgresql
|
|
# 반드시 베이스 OS 를 포함한 태그를 쓴다.
|
|
# 금지: "18" — Debian 11(bullseye) 기반이며 2026-08-31 지원 종료
|
|
# 권장: "18.4-system-trixie" — Debian 13, 2030-06-30 까지 지원
|
|
# (operator 1.30.0 이 imageName 미지정 시 선택하는 기본값과 동일)
|
|
# 포함 확장: pgaudit 18.0, pg_stat_statements 1.12, pgcrypto 1.4, pg_trgm 1.6, vector 0.8.5
|
|
tag: "18.4-system-trixie"
|
|
# 전체 이미지 경로를 직접 지정할 때 사용 (오프라인 미러 등). 지정 시 image.* 는 무시된다.
|
|
imageName: ""
|
|
|
|
# postgresql.conf 파라미터
|
|
parameters:
|
|
max_connections: "100"
|
|
shared_buffers: 128MB
|
|
# 감사 로깅용. pgaudit 는 CNPG 기본 이미지에 포함되어 있다.
|
|
# shared_preload_libraries 는 CNPG 가 자동 관리하므로 직접 넣지 않는다.
|
|
|
|
# 확장 기능 (pgaudit 등). shared_preload_libraries 는 operator 가 계산한다.
|
|
sharedPreloadLibraries: []
|
|
|
|
# pg_hba.conf 추가 규칙. CNPG 기본값은 TLS 강제 + scram-sha-256 이다.
|
|
pg_hba: []
|
|
# - hostssl appdb appuser 10.42.0.0/16 scram-sha-256
|
|
|
|
# 동기 복제 설정. 미설정 시 비동기(async) 복제다.
|
|
# synchronous:
|
|
# method: any
|
|
# number: 1
|
|
|
|
# primary 업데이트 전략
|
|
# unsupervised = operator 가 자동으로 switchover 후 업데이트 (기본)
|
|
# supervised = 운영자가 수동 승격해야 진행
|
|
primaryUpdateStrategy: unsupervised
|
|
primaryUpdateMethod: switchover
|
|
|
|
storage:
|
|
size: 10Gi
|
|
storageClass: longhorn
|
|
|
|
# WAL 을 별도 볼륨으로 분리한다. I/O 경합을 줄이고 WAL 폭증이 데이터 볼륨을 채우는 것을 막는다.
|
|
walStorage:
|
|
enabled: true
|
|
size: 5Gi
|
|
storageClass: longhorn
|
|
|
|
resources:
|
|
requests:
|
|
cpu: 500m
|
|
memory: 1Gi
|
|
limits:
|
|
cpu: "2"
|
|
memory: 2Gi
|
|
|
|
# 초기 DB/사용자 생성
|
|
bootstrap:
|
|
initdb:
|
|
database: appdb
|
|
owner: appuser
|
|
# 비밀번호를 담은 기존 시크릿 이름. 미지정 시 operator 가 무작위 생성해
|
|
# <release>-app 시크릿에 저장한다.
|
|
secretName: ""
|
|
encoding: UTF8
|
|
localeCollate: ""
|
|
localeCType: ""
|
|
# 초기화 SQL. 최초 bootstrap 시 1회만 superuser 로 실행된다.
|
|
# 주의: CREATE EXTENSION 은 여기에 넣으면 안 된다. CNPG 1.30.0 에서 오류 없이
|
|
# 무시된다(검증 기록: doc/deploy-test-cnpg.md). 확장은 아래 databases 로 선언한다.
|
|
postInitApplicationSQL: []
|
|
# - ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
|
|
|
|
# 선언적 데이터베이스·확장·스키마 관리 (CNPG 1.26+ Database CRD).
|
|
# 확장 설치의 정식 경로다. bootstrap 으로 만든 DB 도 여기서 관리 대상으로 선언할 수 있다.
|
|
databases: []
|
|
# - name: appdb # bootstrap.initdb.database 와 같은 이름을 쓰면 그 DB 를 관리한다
|
|
# owner: appuser # 생략 시 bootstrap.initdb.owner
|
|
# ensure: present # present | absent
|
|
# reclaimPolicy: retain # retain = Database 리소스를 지워도 실제 DB 는 보존
|
|
# extensions:
|
|
# - name: pg_stat_statements
|
|
# - name: pgaudit
|
|
# schemas:
|
|
# - name: app
|
|
# owner: appuser
|
|
|
|
# postgres(superuser) 계정으로의 직접 접속 허용 여부.
|
|
# false 면 superuser 시크릿이 아예 생성되지 않는다. 보안상 false 를 권장한다.
|
|
enableSuperuserAccess: false
|
|
|
|
# Pod 분산 배치
|
|
affinity:
|
|
enablePodAntiAffinity: true
|
|
# preferred = 노드가 부족해도 스케줄됨 (단일 노드 dev 환경 필수)
|
|
# required = 노드당 1개 강제 (운영 권장, 노드 수 >= instances 필요)
|
|
podAntiAffinityType: preferred
|
|
topologyKey: kubernetes.io/hostname
|
|
nodeSelector: {}
|
|
tolerations: []
|
|
|
|
# 참고: 컨테이너 보안 컨텍스트는 operator 가 관리한다. CNPG 는 항상 non-root(uid 26)
|
|
# runAsNonRoot / readOnlyRootFilesystem 로 Pod 를 만들며, 차트에서 재정의할 값이 없다.
|
|
|
|
monitoring:
|
|
# Prometheus Operator CRD 필요
|
|
enablePodMonitor: false
|
|
# 커스텀 메트릭 쿼리 ConfigMap
|
|
customQueriesConfigMap: []
|
|
|
|
# 백업 — S3 호환 오브젝트 스토리지 (Barman Cloud)
|
|
backup:
|
|
enabled: false
|
|
# 보존 기간
|
|
retentionPolicy: 30d
|
|
barmanObjectStore:
|
|
destinationPath: "" # 예: s3://pg-backup/cnpg
|
|
endpointURL: "" # 예: http://rustfs.defense-llm.svc:9000
|
|
s3Credentials:
|
|
accessKeyId:
|
|
name: "" # 시크릿 이름
|
|
key: ACCESS_KEY_ID
|
|
secretAccessKey:
|
|
name: ""
|
|
key: ACCESS_SECRET_KEY
|
|
wal:
|
|
compression: gzip
|
|
maxParallel: 2
|
|
data:
|
|
compression: gzip
|
|
jobs: 2
|
|
|
|
# 정기 백업 스케줄 (backup.enabled: true 일 때만 생성)
|
|
scheduledBackup:
|
|
enabled: false
|
|
# CNPG 의 cron 은 6필드다 (초 분 시 일 월 요일)
|
|
schedule: "0 0 2 * * *"
|
|
backupOwnerReference: self
|
|
immediate: false
|
|
|
|
# PgBouncer 커넥션 풀러
|
|
pooler:
|
|
enabled: false
|
|
instances: 2
|
|
type: rw # rw | ro
|
|
poolMode: transaction # session | transaction | statement
|
|
parameters:
|
|
max_client_conn: "1000"
|
|
default_pool_size: "25"
|
|
resources:
|
|
requests:
|
|
cpu: 100m
|
|
memory: 128Mi
|
|
limits:
|
|
cpu: 500m
|
|
memory: 256Mi
|
|
|
|
# 추가 라벨/어노테이션
|
|
extraLabels: {}
|
|
extraAnnotations: {}
|