Files
qinglong/docs/adr/ADR-0131-barman-plugin-cert-manager-authority.md
T

137 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-0131Barman Plugin cert-manager 证书 Authority
- 状态:Proposedcert-manager v1.20.3 与 Kubernetes 1.32.8 兼容选择、
official release manifest SHA-256、三个实际运行 image 的 OCI index 与
amd64/arm64 digest、Barman 双向 TLS 身份/轮换窗口、cross-lock 和 mutation
gate 已完成;真实 API readiness 与轮换演练仍是 Release Gate
- 日期:2026-08-03
- 关联 RFCQL-RFC-0001 D-127、D-128、D-129
- 关联 ADRADR-0127、ADR-0129、ADR-0130
## 背景
Barman Cloud CNPG-I plugin 与 CloudNativePG operator 之间使用 TLS。官方 v0.13.0
release manifest 创建 namespaced SelfSigned Issuer、client Certificate 和 server
Certificate,并要求 cert-manager API 在安装 plugin 前 ready。上游也允许部署方
自管证书,但部署方必须自行证明完整证书链、双向身份和轮换。
QL3 当前 live Kubernetes 基线为 1.32.8。不能直接使用 `releases/latest`:最新版
可能提高最低 Kubernetes 版本,也不能在 release manifest 中继续保留 tag-only
image 后声称供应链锁定。
## 决策
### 1. Barman 默认证书 authority 为 cert-manager v1.20.3
选择 cert-manager `1.20.3`,因为官方支持矩阵覆盖 Kubernetes `1.32``1.35`
与 QL3 `1.32.8` Kind 基线相交;更新的 `1.21.0` 从 Kubernetes `1.33` 起,不作为
当前默认值。`1.20.3` 还包含 Challenge/Order 聚合 RBAC 的高危安全修复。
该依赖只属于启用 Barman 的 Cluster 基础设施:
- cert-manager 安装在 `cert-manager` namespace
- Barman plugin 和它的 Issuer/Certificate 安装在 CloudNativePG operator 所在的
`cnpg-system` namespace
- edge、standalone、worker 和 QL3 npm/package 闭包不得导入 cert-manager client、
CRD 或 installer
- cluster-control 应用 Pod 无安装、签发、renew 或读取 plugin 私钥的权限。
### 2. 供应链锁与 live readiness 分离
`operators/cert-manager/selection-lock.json` 当前强制:
- `version: 1.20.3`
- reviewed Kubernetes `1.32.8`
- official release asset SHA-256
`7ee74ba06845213e96d8ceaff3d20dd51e682765c1418eddda4e8780ba082261`
- release manifest 实际引用的 controller、cainjector、webhook 三个 image 均锁定
OCI index 及 `linux/amd64``linux/arm64` 子 manifest
- static manifest 没有 startup API check 或 solver workload,禁止为满足数量要求
虚构第四个 image
- `status: supply-chain-verified``releaseReady: false`
- 只保留 `live-cert-manager-api-and-plugin-mtls-rotation-evidence` blocker。
源码 tag 内的 `manifest.yaml` 不是 Release 资产:v1.20.3 仍必须从固定 Release URL
下载并先核对上述 SHA-256,再按 selection lock 将三个 tag-only 引用改写为对应
OCI index digest。锁目录保持仅含 JSON,不复制约 1 MiB 的上游 installer。
该静态 lock 不会因为仓库中出现一份历史报告而改写为 `releaseReady: true`。每次正式
镜像发布必须由 `cluster-dr-release-evidence` 在 commit-scoped 私有 runner mount 中
重新审计一份 24 小时内、source revision 精确匹配的 live report;该报告必须同时证明
client/server 轮换后 WAL、backup、latest restore 与 PITR 继续成功。`publish` Job 对此
证据采用硬 `needs`,因此没有 live 报告时保持不可发布,而不是让 operator 版本锁冒充
运行证据。
### 3. Barman 双向 TLS 身份固定
`cnpg-system` 中只允许以下资源合同:
- `Issuer/selfsigned-issuer``cert-manager.io/v1`、namespaced、SelfSigned
- client Certificate `barman-cloud-client`
`commonName=barman-cloud-client``usage=client auth`
Secret `barman-cloud-client-tls`
- server Certificate `barman-cloud-server`
`commonName=barman-cloud`、DNS SAN `barman-cloud`
`usage=server auth`、Secret `barman-cloud-server-tls`
- 两者 `duration=2160h``renewBefore=360h`
Secret 内容不得进入 Git、审计输出或应用 Pod。证书名称、用途、SAN、namespace 或
轮换窗口漂移必须失败关闭。SelfSigned 只用于 namespace 内 plugin transport
不能复用为 PostgreSQL、Ingress、Worker 或用户 workload 的通用 CA。
### 4. 安装和轮换顺序固定
安装顺序:
1. 核验 cert-manager release asset 与全部平台 image digest
2. 以 cluster-admin 安装锁定清单;
3. 等待 CRD established、webhook/cainjector/controller ready,并通过 API
readiness;不能只看 Deployment 副本数;
4. 核验 Barman release asset,使用 digest-pinned controller/sidecar 引用安装;
5. 等待两个 Certificate Ready,复验证书 Secret type、key 集合、subject/SAN、
usage、serial、NotBefore/NotAfter 与不相同的私钥;
6. 等待 Barman Deployment ready,再允许任何 Cluster 增加 plugin/WAL archiver。
轮换演练必须在有连续 WAL 和可恢复 base backup 的测试集群上执行:
1. 记录 client/server 旧 serial、Secret resourceVersion 和 NotAfter
2. 触发受审 renew,不删除 Issuer、Secret 或跳过证书验证;
3. 等待两个 Certificate 再次 Ready,并证明 serial/resourceVersion 推进;
4. 证明 CloudNativePG operator 与 Barman manager 重连、每个 PostgreSQL sidecar
使用新证书且无旧证书长期连接;
5. 轮换窗口内继续归档 WAL,完成一份新 base backup,并用轮换后的证书恢复;
6. 保存非密钥事件、condition、serial/fingerprint 和中断时间报告。
仅 Certificate Ready、Secret 更新或 plugin Pod 重启不能单独证明轮换成功。
## 替代方案
- **直接使用 `releases/latest`**:拒绝。版本、Kubernetes 兼容性和镜像都会漂移。
- **当前选择 cert-manager 1.21.0**:拒绝。其官方最低 Kubernetes 为 1.33,高于
QL3 1.32.8 live 基线。
- **每个部署默认自管证书 Secret**:拒绝作为默认值。它会把链验证、双向身份、
renew、原子 Secret 发布和 sidecar/operator 重载证明复制给每个部署。成熟平台
可在独立 ADR/overlay 中采用外部 CA,但必须满足同等证据。
- **复用 PostgreSQL operator CA 或应用 CA**:拒绝。会合并数据库、plugin 和应用
transport 的信任域。
- **由 cluster-control Pod 生成证书**:拒绝。常驻应用不能获得 cluster-wide
签发或 Secret 写 authority。
## 影响
- 启用 Barman 的 Cluster 增加 cert-manager controller、webhook 和 cainjector
常驻成本;这不进入路由器/standalone/worker 产物。
- Kubernetes 1.32 基线存在时,cert-manager 不能独立升级到 1.21;若升级
Kubernetes,需重新评审两者的原子升级顺序。
- 供应链锁已完成;真实 API readiness 与轮换证据完成前,本 ADR 和 Barman
Release Gate 保持 Proposed。
## 验证
- `pnpm audit:cert-manager-selection:ql3`
- `node --test test/back/ql3CertManagerSelectionAudit.test.cjs`
- `pnpm audit:barman-cloud-supply-chain:ql3`
- `node --test test/back/ql3CloudNativePgDrEvidenceAudit.test.cjs`
- official Release manifest/OCI digest 复核
- cert-manager API readiness、Barman mTLS 安装与 renew/backup/restore live evidence