images/·manifests/helm/·.claude/ 의 20개 파일이 doc/decisions·doc/analysis 등 **이 레포에 존재한 적 없는 경로 15종을 48곳에서** 인용하고 있었다. security-catalog 에서 포팅할 때 따라온 것인데, 그 레포는 개인 레포(github.com/wbsong111/security-catalog)라 팀 구성원은 접근조차 못 한다 — "security-catalog 에 있으나 이관되지 않았다" 는 안내가 아무 역할을 하지 못했다. 원문을 통째로 복사하지 않았다 ---------------------------- 원본 문서들이 서로를 근거로 인용한다. decisions/0001 하나만 봐도 analysis/cnpg-image-baseline.md · analysis/vendor-unassessed-data-sources.md 처럼 **인용 목록에 없던 또 다른 미이관 문서**를 가리킨다. 복사는 문제를 옮기는 것이지 없애는 게 아니다. 그리고 대부분은 애초에 dip-catalog 가 더 나은 것을 갖고 있다. 7곳에서 인용되던 analysis/sles-oval-measurement.md 는 원문 스스로 "이 문서는 결정하지 않는다. 재측정하면 갱신된다" 고 밝히는 스냅샷인데, dip-catalog 는 같은 측정을 CoverageProbe 로 매 스캔마다 자동으로 한다. 문서를 복사하는 것보다 게이트를 가리키는 것이 정확하다. 그래서 성격별로 나눴다 --------------------- 재측정으로 복원 안 되는 것 → doc/decisions/ 에 자립적 ADR 로 다시 씀 (4건) 이미 단일 출처가 있는 것 → 그쪽으로 인용 교체 (11종 경로) ADR 4건은 security-catalog 0001·0005·0006·0007 이 원본이고, 결론과 근거만 추려 dip-catalog 맥락으로 새로 썼다 — **레포 밖을 가리키는 링크가 0이다.** 번호는 이 레포에서 0001~0004 로 다시 붙였고 원본 대응은 각 문서와 README 에 적었다. 왜 안 가져온 것은 안 가져왔는지도 README 표에 남겼다. 인용 교체는 카테고리별로: analysis/*-cve.md, cnpg-image-vuln-comparison.md → 해당 ADR · images/<image>/README.md analysis/sles-oval-measurement.md → 게이트 CoverageProbe (doc/sbom-pipeline.md) cve-zero-pipeline.md, architecture/build-pipeline.md → doc/sbom-pipeline.md image-selection.md → .claude/image-authoring.md charts/*/deploy-test.md → scripts/deploy-test/*.sh + 절차 문서 찾은 오류 2건 ------------- - images/cloudnative-pg/source.build.env 가 인용한 decisions/0004-cloudnative-pg-operator-self-build.md 는 **번호 오기**다. 원본 0004 는 postgresql-chart-selection 이고 이 결정은 0005 다. - cnpg-cluster values.yaml·templates/database.yaml 이 인용한 doc/deploy-test-cnpg.md 는 **원본 레포에도 없다.** CREATE EXTENSION 함정 설명은 주석 자체에 이미 있어 인용만 뺐다. 검증 ---- 우리 파일의 깨진 doc/ 인용 0건 (전수 스캔) 새 문서·수정 문서의 로컬 링크 전부 실재 확인 helm template cnpg-cluster · etcd · cloudnative-pg 정상 렌더 남은 doc/health-checking.md(144곳)·doc/integration/*(2곳)은 업스트림 CRD·차트 안의 문자열로 우리가 쓴 인용이 아니다 — 건드리지 않았다. Closes #33 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
cloudnative-pg
CloudNativePG Operator Helm Chart
Homepage: https://cloudnative-pg.io
About this chart
Helm chart to install the CloudNativePG operator, originally created and sponsored by EDB to manage PostgreSQL workloads on any supported Kubernetes cluster running in private, public, or hybrid cloud environments.
NOTE: this chart supports only the latest point release of the CloudNativePG operator.
The chart installs only the operator (controller manager, webhooks, RBAC and CRDs). To provision a PostgreSQL
Cluster resource, use the companion cluster chart
(see the Cluster chart README for details)
or apply your own Cluster manifest.
Getting Started
Add the chart repository
helm repo add cnpg https://cloudnative-pg.github.io/charts
helm repo update
Install the operator
helm upgrade --install cnpg \
--namespace cnpg-system \
--create-namespace \
cnpg/cloudnative-pg
Install with custom parameters
You can override individual chart values from the command line with --set.
For example, to enable the Prometheus PodMonitor:
helm upgrade --install cnpg \
--namespace cnpg-system \
--create-namespace \
--set monitoring.podMonitorEnabled=true \
cnpg/cloudnative-pg
Note
Enabling the
PodMonitorrequires the Prometheus Operator CRDs to be installed in the cluster. Without them the install fails withno matches for kind "PodMonitor".
See the Values section below for the full list of configurable parameters.
Verify the installation
kubectl -n cnpg-system get deploy
kubectl -n cnpg-system rollout status deploy/cnpg-cloudnative-pg
Single namespace installation
It is possible to limit the operator's capabilities to solely the namespace in which it has been installed. With this restriction, the cluster-level permissions required by the operator will be substantially reduced, and the security profile of the installation will be enhanced.
You can install the operator in single-namespace mode by setting the config.clusterWide flag to false,
as in the following example:
helm upgrade --install cnpg \
--namespace cnpg-system \
--create-namespace \
--set config.clusterWide=false \
cnpg/cloudnative-pg
IMPORTANT: the single-namespace installation mode can't coexist with the cluster-wide operator. Otherwise there would be collisions when managing the resources in the namespace watched by the single-namespace operator. It is up to the user to ensure there is no collision between operators.
Uninstalling
helm uninstall cnpg --namespace cnpg-system
Warning
Uninstalling the chart does not remove the CRDs. Deleting them cascade-deletes every
Cluster(and other CloudNativePG) resource across the whole cluster, together with the PostgreSQL data stored in their PVCs. This is irreversible, so only delete the CRDs if you intend to permanently remove all managed databases.
Source Code
Requirements
Kubernetes: >=1.29.0-0
| Repository | Name | Version |
|---|---|---|
| https://cloudnative-pg.github.io/grafana-dashboards | monitoring(cluster) | 0.0 |
Values
| Key | Type | Default | Description |
|---|---|---|---|
| additionalArgs | list | [] |
Additional arguments to be added to the operator's args list. |
| additionalEnv | list | [] |
Array containing extra environment variables which can be templated. |
| affinity | object | {} |
Affinity for the operator to be installed. |
| commonAnnotations | object | {} |
Annotations to be added to all other resources. |
| config.clusterWide | bool | true |
This option determines if the operator is responsible for observing events across the entire Kubernetes cluster or if its focus should be narrowed down to the specific namespace within which it has been deployed. |
| config.create | bool | true |
Specifies whether the secret should be created. |
| config.data | object | {} |
The content of the configmap/secret, see https://cloudnative-pg.io/documentation/current/operator_conf/#available-options for all the available options. |
| config.maxConcurrentReconciles | int | 10 |
The maximum number of concurrent reconciles. Defaults to 10. |
| config.name | string | "cnpg-controller-manager-config" |
The name of the configmap/secret to use. |
| config.secret | bool | false |
Specifies whether it should be stored in a secret, instead of a configmap. |
| containerSecurityContext | object | {"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsGroup":10001,"runAsUser":10001,"seccompProfile":{"type":"RuntimeDefault"}} |
Container Security Context. |
| crds.create | bool | true |
Specifies whether the CRDs should be created when installing the chart. |
| dnsPolicy | string | "" |
|
| fullnameOverride | string | "" |
|
| hostNetwork | bool | false |
|
| image.pullPolicy | string | "IfNotPresent" |
|
| image.repository | string | "ghcr.io/cloudnative-pg/cloudnative-pg" |
|
| image.tag | string | "" |
Overrides the image tag whose default is the chart appVersion. |
| imagePullSecrets | list | [] |
|
| monitoring.grafanaDashboard.annotations | object | {} |
Annotations that ConfigMaps can have to get configured in Grafana. |
| monitoring.grafanaDashboard.configMapName | string | "cnpg-grafana-dashboard" |
The name of the ConfigMap containing the dashboard. |
| monitoring.grafanaDashboard.create | bool | false |
|
| monitoring.grafanaDashboard.labels | object | {} |
Labels that ConfigMaps should have to get configured in Grafana. |
| monitoring.grafanaDashboard.namespace | string | "" |
Allows overriding the namespace where the ConfigMap will be created, defaulting to the same one as the Release. |
| monitoring.grafanaDashboard.sidecarLabel | string | "grafana_dashboard" |
Label that ConfigMaps should have to be loaded as dashboards. DEPRECATED: Use labels instead. |
| monitoring.grafanaDashboard.sidecarLabelValue | string | "1" |
Label value that ConfigMaps should have to be loaded as dashboards. DEPRECATED: Use labels instead. |
| monitoring.podMonitorAdditionalLabels | object | {} |
Additional labels for the podMonitor |
| monitoring.podMonitorEnabled | bool | false |
Specifies whether the monitoring should be enabled. Requires Prometheus Operator CRDs. |
| monitoring.podMonitorMetricRelabelings | list | [] |
Metrics relabel configurations to apply to samples before ingestion. |
| monitoring.podMonitorRelabelings | list | [] |
Relabel configurations to apply to samples before scraping. |
| monitoringQueriesConfigMap.name | string | "cnpg-default-monitoring" |
The name of the default monitoring configmap. |
| monitoringQueriesConfigMap.queries | string | `"backends:\n query: | \n SELECT sa.datname\n , sa.usename\n , sa.application_name\n , states.state\n , COALESCE(sa.count, 0) AS total\n , COALESCE(sa.max_tx_secs, 0) AS max_tx_duration_seconds\n FROM ( VALUES ('active')\n , ('idle')\n , ('idle in transaction')\n , ('idle in transaction (aborted)')\n , ('fastpath function call')\n , ('disabled')\n ) AS states(state)\n LEFT JOIN (\n SELECT datname\n , state\n , usename\n , COALESCE(application_name, '') AS application_name\n , pg_catalog.count(*)\n , COALESCE(EXTRACT (EPOCH FROM (pg_catalog.max(pg_catalog.now() OPERATOR(pg_catalog.-) xact_start))), 0) AS max_tx_secs\n FROM pg_catalog.pg_stat_activity\n GROUP BY datname, state, usename, application_name\n ) sa ON states.state OPERATOR(pg_catalog.=) sa.state\n WHERE sa.usename IS NOT NULL\n metrics:\n - datname:\n usage: "LABEL"\n description: "Name of the database"\n - usename:\n usage: "LABEL"\n description: "Name of the user"\n - application_name:\n usage: "LABEL"\n description: "Name of the application"\n - state:\n usage: "LABEL"\n description: "State of the backend"\n - total:\n usage: "GAUGE"\n description: "Number of backends"\n - max_tx_duration_seconds:\n usage: "GAUGE"\n description: "Maximum duration of a transaction in seconds"\n\nbackends_waiting:\n query: |
| nameOverride | string | "" |
|
| namespaceOverride | string | "" |
|
| nodeSelector | object | {} |
Nodeselector for the operator to be installed. |
| podAnnotations | object | {} |
Annotations to be added to the pod. |
| podLabels | object | {} |
Labels to be added to the pod. |
| podSecurityContext | object | {"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}} |
Security Context for the whole pod. |
| priorityClassName | string | "" |
Priority indicates the importance of a Pod relative to other Pods. |
| rbac.aggregateClusterRoles | bool | false |
Aggregate ClusterRoles to Kubernetes default user-facing roles. Ref: https://kubernetes.io/docs/reference/access-authn-authz/rbac/#user-facing-roles |
| rbac.create | bool | true |
Specifies whether ClusterRole and ClusterRoleBinding should be created. |
| replicaCount | int | 1 |
|
| resources | object | {} |
|
| service.ipFamilies | list | [] |
Sets the families that should be supported and the order in which they should be applied to ClusterIP as well. Can be IPv4 and/or IPv6. |
| service.ipFamilyPolicy | string | "" |
Set the ip family policy to configure dual-stack see Configure dual-stack |
| service.name | string | "cnpg-webhook-service" |
The name of the Webhook Service. |
| service.port | int | 443 |
|
| service.type | string | "ClusterIP" |
|
| serviceAccount.create | bool | true |
Specifies whether the service account should be created. |
| serviceAccount.name | string | "" |
The name of the service account to use. If not set and create is true, a name is generated using the fullname template. |
| tolerations | list | [] |
Tolerations for the operator to be installed. |
| topologySpreadConstraints | list | [] |
Topology Spread Constraints for the operator to be installed. |
| updateStrategy | object | {} |
Update strategy for the operator. ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy |
| webhook | object | {"livenessProbe":{"initialDelaySeconds":3},"mutating":{"create":true,"failurePolicy":"Fail"},"port":9443,"readinessProbe":{"initialDelaySeconds":3},"startupProbe":{"failureThreshold":6,"periodSeconds":5},"validating":{"create":true,"failurePolicy":"Fail"}} |
The webhook configuration. |
Maintainers
| Name | Url | |
|---|---|---|
| phisco | p.scorsolini@gmail.com |
Contributing
Please read the code of conduct and the guidelines to contribute to the project.
Copyright
Helm charts for CloudNativePG are distributed under Apache License 2.0.