Umut TEKIN:探索:使用 initdb 引导 PostgreSQL 集群(CNPG)

Umut TEKIN:探索:使用 initdb 引导 PostgreSQL 集群(CNPG)

💡 原文英文,约1300词,阅读约需5分钟。
📝

内容提要

本文介绍使用CloudNativePG以initdb方式声明式创建PostgreSQL集群,通过Kubernetes清单配置自定义编码、数据校验、角色和数据库,并利用managed、Database CR及postInitSQL管理角色与库,同时演示用LoadBalancer服务暴露数据库供集群外应用连接。

🔎

延伸解读

initdb 引导的声明式配置要点

通过 initdb 引导方式,可以在 Kubernetes 清单中直接指定数据库编码、数据校验和初始角色。例如,设置 encoding: 'LATIN1' 和 dataChecksums: true 会影响集群的底层存储格式,而 managed.roles 则允许声明式地创建具有特定权限的角色,如 nikola 拥有 createdb 权限,tesla 为超级用户。这些配置在集群初始化时生效,确保了环境的一致性。

角色与数据库的多种管理方式

除了在 initdb 中预定义角色和数据库,还可以通过 kubectl exec 手动创建,或使用 Database CR 和 managed 字段进行声明式管理。Database CR 允许独立定义数据库及其所有者,而 managed 字段则能持续同步角色状态。此外,postInitSQL、postInitApplicationSQL 和 postInitTemplateSQL 提供了在初始化后执行自定义 SQL 的灵活性,适合注入表结构或权限设置。

从集群外连接数据库的实践

默认情况下,CNPG 创建的服务仅在集群内可访问。通过配置 services.additional 并指定 type: LoadBalancer,可以生成一个外部可用的服务。在 Minikube 环境中,即使未指定静态 IP,也会自动分配一个外部 IP,但实际连接需使用 minikube service 命令获取的节点 IP 和端口。这为本地开发和测试提供了便利,但在生产环境中需考虑安全性和网络策略。

❓

Q&A

如何使用 CloudNativePG 的 initdb 方式创建 PostgreSQL 集群?

通过定义 Kubernetes 清单,在 Cluster 资源的 spec.bootstrap.initdb 中指定数据库、所有者、编码等参数,然后使用 kubectl apply 应用清单即可。例如,创建一个名为 cluster-example-initdb 的集群,设置 database: cybertec, owner: cybertec, encoding: 'LATIN1',并引用包含用户名和密码的 Secret。

在 CNPG 中如何声明式地管理 PostgreSQL 角色和数据库?

可以通过 Cluster 资源的 spec.managed.roles 字段声明角色,例如指定角色名、是否可登录、是否超级用户等。对于数据库,可以创建 Database 自定义资源(CR),指定数据库名、所有者以及所属集群。此外,还可以使用 postInitSQL、postInitApplicationSQL 或 postInitTemplateSQL 在集群初始化后执行 SQL 来创建角色和数据库。

如何配置 CNPG 集群以允许从 Kubernetes 集群外部连接数据库?

可以通过在 Cluster 资源的 spec.services.additional 中定义额外的服务,并设置类型为 LoadBalancer。例如,创建一个名为 test-rw 的 LoadBalancer 服务,暴露端口 5432。然后使用 minikube service test-rw -n cnpg-system --url 获取外部访问的 IP 和端口,最后使用 psql 连接。

initdb 引导时如何自定义数据库的编码和校验和?

在 Cluster 资源的 spec.bootstrap.initdb 下设置 encoding 字段(如 'LATIN1')来自定义编码,设置 dataChecksums: true 来启用数据校验和。这些选项会在初始化集群时生效。

postInitSQL、postInitApplicationSQL 和 postInitTemplateSQL 有什么区别?

它们都是在集群初始化后执行 SQL 的钩子,但作用范围不同:postInitSQL 在 postgres 数据库中执行;postInitApplicationSQL 在应用数据库中执行;postInitTemplateSQL 在模板数据库中执行。可以根据需要选择使用,以自定义集群和数据库。

如何验证 CNPG 集群创建后角色和数据库是否正确配置?

可以进入 Pod 并使用 psql 执行元命令查看。例如,使用 \du 列出角色,\l 列出数据库,\d 查看表。还可以通过 show data_checksums; 检查数据校验和是否开启。

🏷️

标签

➡️

继续阅读