云计算与数据中心

如何使用 CloudNativePG 作为 PostgreSQL 后端在 Kubernetes 上运行 OpenBao

EnterpriseDB 和 ControlPlane 团队提供了一套在 Kubernetes 上运行 OpenBao 的实用方案:使用由 CloudNativePG 管理的 PostgreSQL 集群,并通过同步复制和 TLS 证书取代密码。该方案还说明了这一设计的局限性,尤其是证书续期后需要重启 OpenBao,以及对备份和集群丢失恢复的要求。

2026-09-16
2 分钟阅读
7 浏览量
فريق تحرير certi.news
如何使用 CloudNativePG 作为 PostgreSQL 后端在 Kubernetes 上运行 OpenBao

CNCF 博客介绍了一套在 Kubernetes 上构建开源机密管理栈的运行方案,将 OpenBao 与 CloudNativePG 结合起来。OpenBao 是 HashiCorp Vault 的开源分支,隶属于 Linux Foundation;CloudNativePG 则将 PostgreSQL 集群转变为具备自愈能力、同步复制和基于证书的身份验证的服务。该方案利用了 Kubernetes(CNCF 的毕业项目)以及 CloudNativePG;后者是一个 Sandbox 项目,目前正接受 CNCF 技术监督委员会的评估,以进入 Incubation 阶段。

核心思路不仅是将 PostgreSQL 用作普通存储,而是让 OpenBao 依赖一个高度可用的 PostgreSQL 后端,同时不依赖特定云厂商专有的云数据库。该方案使用三个 CloudNativePG 实例,并采用基于法定人数的同步复制,只要有一个同步备用副本可用,就能确保数据持久性。反之,如果没有满足所需持久性条件的备用副本,写操作可能会停止。

设计发生了哪些变化?

OpenBao 使用原生 PostgreSQL 存储,并通过 ha_enabled = true 启用高可用锁表。该配置创建两个表:用于存储数据的 openbao_kv_store,以及用于保存高可用锁记录的 openbao_ha_locks。由于所有状态都应保留在 CloudNativePG 中,该方案禁用了 OpenBao 图表中的默认本地存储。

CloudNativePG 负责运行一个由三个实例组成的 PostgreSQL 集群,并通过节点选择器、容忍度和 Pod 亲和性约束,将这些实例调度到专用节点上,同时实现跨独立故障域的分布。该方案使用一个目录来指定精简版 PostgreSQL 18 的版本,而不是手动写入固定的镜像标签;文中还展示了使用带 SHA 摘要锁定的镜像进行测试的情况。

无密码身份验证

该方案最重要的方面之一,是从 OpenBao 连接数据库的过程中移除密码。CloudNativePG 创建 DatabaseRole 对象,分别用于拥有架构的角色和名为 openbao-rw 的受限运行角色,并为两者提供 TLS 客户端证书。pg_hba 规则强制这两个角色使用 TLS 连接和客户端证书,同时拒绝未加密连接。

这一细节很重要,因为仅创建证书并不会自动强制使用证书;PostgreSQL 规则才会针对每个连接决定使用证书、密码进行身份验证,还是拒绝连接。该方案还将容器中组合挂载的机密文件权限设置为 0640,因为当私钥以默认值 0644 挂载时,libpq 会拒绝组用户或所有用户可读的私钥。

由于根据文中内容,DatabaseRole 目前尚不能管理表级权限授予,因此通过一次性 Job 执行创建表的命令,并向受限角色授予 SELECT、INSERT、UPDATE 和 DELETE 权限。该任务还会撤销 PUBLIC 的 CONNECT 权限,撤销 PUBLIC 对公共架构的使用权限,然后将所需的最低权限重新授予 openbao-rw。OpenBao 配置中启用 skip_create_table,以避免受限运行角色自行尝试创建表。

这对 Kubernetes 运维人员在实践中意味着什么?

该方案通过 cnpg-playground 仓库提供本地测试路径;该仓库会创建一个包含六个节点的 Kind 集群,并预先加入 CloudNativePG 配置。测试需要 Docker、Kind、Helm 和 kubectl。不过,测试环境中的节点分布带来了一个重要限制:PostgreSQL 节点是专用且带有标签的,而为了在剩余的两个通用节点上分布三个 OpenBao 副本并满足强制亲和性,资源并不充足。因此,该方案暂时允许 OpenBao 在 Kind 环境中使用控制平面节点,同时明确警告不要将这一容忍设置带入生产环境。在包含三个未标记工作节点的生产集群中,则不需要这一处理。

安装 OpenBao 图表后,必须初始化集群,并分别为每个实例解除封印,使用五个 Shamir 密钥中的三个。解除第一个实例的封印不会解除另外两个实例的封印;此外,StatefulSet 默认的 OrderedReady 策略会延迟创建下一个实例,直到前一个实例就绪。因此,应安全保存解除封印密钥和根令牌,然后按顺序为每个实例输入密钥。

初始化后,OpenBao 会将引导状态和密钥存储在 openbao_kv_store 表中;测试机密值会作为 BYTEA 类型的加密数据保存,即使直接访问 PostgreSQL 表,也不会以明文形式存在。文中确认,使用 KV v2 和受限 PostgreSQL 角色进行机密写入和读取的测试成功。

运行限制及方案未涵盖的内容

证书由 CloudNativePG 自动续期:CNPG 客户端证书的有效期为 90 天,通常会在到期前约一周续期。但 OpenBao 不会自动重新读取证书文件;PostgreSQL 存储接口会在进程启动时打开连接池。因此,必须规划在证书续期后对 OpenBao 实例进行滚动重启,最好在旧证书到期前 83 天的续期窗口内完成。

此外,Kubernetes 集群内部的高可用并不等同于完整的灾难恢复计划。该方案不会自动创建备份,也不提供整个集群丢失后的恢复能力。对于生产使用,文中建议加入 Barman Cloud Plugin,并使用 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 等对象存储,同时使用 Backup 和 ScheduledBackup 资源归档 WAL 和基础备份,以实现时间点恢复。至于需要在整个集群丢失后仍能生存的 RTO 和 RPO 目标,则需要在第二个集群或区域中部署一个异步 PostgreSQL 集群。

新闻来源
ف
作者

فريق تحرير certi.news

同一分类

你可能还喜欢

查看所有新闻