在 Kubernetes 上运行 OpenBao 并使用 CloudNativePG PostgreSQL 后端

在 Kubernetes 上运行 OpenBao 并使用 CloudNativePG PostgreSQL 后端

💡 原文英文,约3700词,阅读约需14分钟。
📝

内容提要

本文介绍用 OpenBao 与 CloudNativePG 搭建全开源密钥管理栈:OpenBao 的 PostgreSQL 存储后端将 CNPG 三实例集群变为加密键值库,采用同步复制实现零数据丢失故障转移;通过 DatabaseRole 签发 TLS 客户端证书,实现无密码 mTLS 认证,并用 pg_hba 规则强制校验。文章详述部署集群、初始化表结构、Helm 安装 OpenBao 及解封验证流程,并提醒证书续期需滚动重启。

🔎

延伸解读

无密码 mTLS 认证的强制机制

文章强调,OpenBao 与 CNPG 之间的连接完全移除密码,依靠 DatabaseRole 签发的 TLS 客户端证书。但仅签发证书并不足够:CNPG 不会自动为 DatabaseRole 添加 cert 规则,必须通过显式 pg_hba 规则(如 hostssl ... cert)强制证书认证,否则连接会回退到默认的 scram-sha-256 规则,而角色没有密码,导致连接失败。这提醒读者,无密码方案需要认证策略的显式配置,而非默认行为。

同步复制与零数据丢失的权衡

CNPG 集群配置了同步复制(method: any, number: 1),dataDurability 默认为 required,实现 RPO=0 的故障转移。但文章指出,这以写入可用性为代价:如果没有可用的 standby,写入会被暂停。两个 standby 同时显示为 Standby (sync) 且 Sync State 为 quorum,说明 CNPG 不固定某个同步 standby,任一 standby 满足持久性即可。读者需根据业务对一致性和可用性的要求评估此配置。

证书自动续期与滚动重启的必要性

CNPG 的客户端证书有效期为 90 天,并在到期前约一周自动续期,替换 Secret 内容。然而,OpenBao 的 PostgreSQL 存储后端在进程启动时打开连接池,之后不会重新读取证书文件,因此续期后必须滚动重启 OpenBao Pod 才能生效。文章建议在 83 天的续期窗口内安排计划性滚动重启,避免证书过期导致连接中断。这是运维中容易忽略的环节。

单集群部署的局限与扩展方向

文章明确,该方案是单集群部署,虽然通过三副本、同步复制和反亲和性实现了集群内高可用,但生产环境还需考虑备份和灾难恢复。CNPG 1.26 起推荐使用 Barman Cloud Plugin 进行持续 WAL 归档和基础备份,支持时间点恢复;跨集群容灾则可通过 CNPG 的分布式拓扑,在第二区域部署异步副本集群,在主集群完全丢失时提升为主。读者应据此规划超出单集群的 RTO/RPO 目标。

Q&A

OpenBao 和 CloudNativePG 组合能带来什么好处?

OpenBao 是 Linux 基金会下 HashiCorp Vault 的开源分支,CloudNativePG 是 CNCF 沙箱项目。两者结合可构建完全开源的密钥管理栈:OpenBao 的 PostgreSQL 存储后端将 CNPG 集群变为加密键值存储,CNPG 提供自愈、同步复制和证书认证的 PostgreSQL 实例,无需依赖云数据库。

如何实现 OpenBao 连接 PostgreSQL 时无密码的 mTLS 认证?

通过 CloudNativePG 的 DatabaseRole CRD 为 schema 所有者和应用角色签发 TLS 客户端证书,并在 Cluster 的 pg_hba 中显式添加 hostssl 规则强制证书认证,同时拒绝非 SSL 连接。这样两个角色都无需密码,仅凭证书即可连接。

部署 CNPG 集群时如何配置同步复制以实现零数据丢失?

在 Cluster 的 postgresql 部分设置 synchronous: method: any, number: 1,并保持 dataDurability 默认的 required。这样任一 standby 满足持久性即可,CNPG 不会固定某个同步 standby,实现 RPO=0 的故障转移。

为什么需要手动初始化 OpenBao 的数据库表结构?

因为 DatabaseRole 尚不支持表级授权,且 OpenBao 的 postgresql 存储后端在 ha_enabled=true 时需要 openbao_kv_store 和 openbao_ha_locks 两张表。若让 OpenBao 自行创建,需要 CREATE 权限,而受限角色 openbao-rw 没有该权限。因此需用 schema 所有者角色运行一次性 Job 创建表并授权。

OpenBao 的证书续期后需要做什么操作?

CNPG 的客户端证书有效期为 90 天,到期前约一周自动续期,并原地更新 Secret。但 OpenBao 的 postgresql 存储后端在启动时打开连接池后不会重新读取证书文件,因此续期后需要滚动重启 OpenBao Pod 才能使新证书生效。建议在 83 天续期窗口内安排滚动重启。

这个方案在生产环境中还需要补充哪些能力?

该方案是单集群部署,生产环境还需要:使用 Barman Cloud Plugin 配置自动化 PostgreSQL 备份(支持 S3、GCS、Azure Blob),实现持续 WAL 归档和定时基础备份以支持时间点恢复;以及跨多个 Kubernetes 集群部署,利用 CNPG 的分布式拓扑实现灾难恢复,满足真实 RTO/RPO 目标。

🏷️

标签

➡️

继续阅读