内容提要
本文介绍如何在Kubernetes上使用CloudNativePG(CNPG)作为OpenBao的PostgreSQL存储后端,实现无密码的TLS客户端证书认证。通过部署三实例CNPG集群、创建数据库角色和表结构,并配置OpenBao的Helm图表,实现高可用和同步复制。文章涵盖初始化、解封、读写测试及证书续期等操作,强调全开源、无供应商锁定。
延伸解读
无密码认证的落地细节
文章强调整个栈无密码,但并非简单不设密码,而是通过 DatabaseRole 的 clientCertificate 生成客户端证书,并在 pg_hba.conf 中显式配置 cert 认证规则。若缺少这些规则,角色会回退到默认的 scram-sha-256,因无密码导致连接失败。此外,Secret 卷挂载需设置 defaultMode: 0640,否则 libpq 会因私钥文件权限过宽而拒绝连接。
OpenBao 的存储后端与 HA 机制
OpenBao 使用 PostgreSQL 作为存储后端,需预建两张表:openbao_kv_store 和 openbao_ha_locks,并设置 skip_create_table=true,因为运行时角色无 CREATE 权限。HA 通过 ha_enabled=true 和锁表实现,三个 OpenBao 副本各自独立,需逐个解封。存储后端在启动时建立连接池,不会自动重读证书,证书轮换后需滚动重启 OpenBao 才能生效。
高可用与灾备的边界
该方案在单集群内实现了高可用:CNPG 三实例同步复制保证零数据丢失,OpenBao 三副本配合反亲和性分散在不同节点。但文章明确指出,这仅是单集群部署,生产环境还需配置自动备份(如 Barman Cloud Plugin)和跨集群灾备(如 CNPG 的分布式拓扑),才能满足真实的 RTO/RPO 目标。
Q&A
如何在Kubernetes上使用CloudNativePG作为OpenBao的存储后端?
部署一个三实例的CNPG集群,创建数据库角色和表结构,然后通过Helm配置OpenBao,使用PostgreSQL存储后端,并设置TLS客户端证书认证。
CloudNativePG和OpenBao是什么关系?
CloudNativePG是一个Kubernetes operator,用于管理PostgreSQL集群;OpenBao是一个开源密钥管理工具,可以使用PostgreSQL作为其存储后端。两者结合可以实现高可用、无密码的密钥管理。
如何实现无密码的TLS客户端证书认证?
通过CNPG的DatabaseRole CRD创建角色并启用clientCertificate,生成客户端证书,然后在pg_hba中配置cert认证规则,确保连接使用证书而非密码。
OpenBao的PostgreSQL存储后端需要哪些表?
需要两个表:openbao_kv_store用于存储键值数据,openbao_ha_locks用于高可用锁。
如何初始化OpenBao并解封?
在openbao-0上执行bao operator init生成解封密钥和根令牌,然后对每个pod分别执行bao operator unseal三次,输入三个解封密钥。
OpenBao的证书如何续期?
CNPG会自动续期客户端证书,但OpenBao不会自动加载新证书,需要手动滚动重启OpenBao pods。
如何配置OpenBao的Helm图表以使用CNPG?
在values文件中设置storage为postgresql,指定连接URL,并设置skip_create_table为true,同时禁用dataStorage,并挂载客户端证书和CA。
如何实现高可用和同步复制?
使用三实例CNPG集群,配置同步复制(method: any, number: 1),并启用pod反亲和性,确保实例分布在不同节点。