因为 PostgreSQL 是上运l实一个有状态的应用程序,并且管理 PostgreSQL 有非常具体的行P现P询读要求(例如备份、恢复、负载自动故障转移等),均衡接池Kubernetes 的和连内置功能无法处理这些任务。因此,上运l实需要一个扩展 Kubernetes 功能以创建和管理 PostgreSQL 的行P现P询读 Operator。
PostgreSQL operator 有好几种,负载比如 Crunchy PostgreSQL Operator、均衡接池Zalando PostgreSQL Operator 和 KubeDB。和连但是上运l实,这些 operator 不提供查询负载均衡功能。行P现P询读
Crunchy PostgreSQL Operatorhttps://github.com/CrunchyData/postgres-operator
Zalando PostgreSQL Operatorhttps://github.com/zalando/postgres-operator
KubeDBhttps://github.com/kubedb/operator
结合 PostgreSQL Operator 和 Pgpool-II 在 Kubernetes 上部署具有查询负载均衡和连接池能力的负载 PostgreSQL 集群。Pgpool-II 可以与上面提到的均衡接池任何 PostgreSQL Operator 结合使用。

在开始配置过程之前,和连请检查以下前提条件。
确保你有一个 Kubernetes 集群,并且安装了 kubectl。PostgreSQL Operator 和 PostgreSQL cluster 已安装。Kubernetes 不需要 Pgpool-II 的健康检查、自动故障转移、watchdog 和在线恢复功能。您只需要启用负载平衡和连接池。
Pgpool-II pod 应该使用以下最低配置:
复制backend_hostname0 = <primary service name>backend_hostname1 = <replica service name>backend_port0 = 5432backend_port1 = 5432backend_flag0 = ALWAYS_PRIMARY|DISALLOW_TO_FAILOVERbackend_flag1 = DISALLOW_TO_FAILOVERfailover_on_backend_error =off
sr_check_period = 10 (when using streaming replication check)sr_check_user=username of PostgreSQL user (when using streaming replication check)load_balance_mode = onconnection_cache = onlisten_addresses = *1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.有两种配置 Pgpool-II 的方法。服务器租用
1.使用环境变量
https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/
2.使用 ConfigMap
https://kubernetes.io/docs/concepts/configuration/configmap/
您可能需要在生产环境中配置客户端身份验证和更多参数。在生产环境中,我们建议使用 ConfigMap 来配置 pgpool.conf 和 pool_hba.conf。
使用环境变量配置 Pgpool-II
Kubernetes 环境变量可以传递给 pod 中的容器。您可以在部署清单中定义环境变量来配置 Pgpool-II 的参数。pgpool-deploy-minimal.yaml 是一个示例清单,包括环境变量的最小设置。您可以下载 pgpool-deploy-minimal.yaml 并修改此清单中的环境变量。
复制$ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-minimal.yaml1.以 PGPOOL_PARAMS_ 开头的环境变量可以转换为 Pgpool-II 的配置参数,这些值可以覆盖默认设置。
在 Kubernetes 上,您只需要指定两个后端节点。根据您的 PostgreSQL 集群信息更新 pgpool-deploy-minimal.yaml。将主服务名称指定为 backend_hostname0。将副本服务名称指定为 backend_hostname1。因为故障转移由 Kubernetes 管理,所以将 DISALLOW_TO_FAILOVER 标志指定给两个节点的 backend_flag,并将 ALWAYS_PRIMARY 标志指定给 backend_flag0。 backend_data_directory 的设置不是必需的。
backend_hostnamehttps://www.pgpool.net/docs/42/en/html/runtime-config-backend-settings.html#GUC-BACKEND-HOSTNAME
backend_flaghttps://www.pgpool.net/docs/42/en/html/runtime-config-backend-settings.html#GUC-BACKEND-FLAG
backend_data_directoryhttps://www.pgpool.net/docs/42/en/html/runtime-config-backend-settings.html#GUC-BACKEND-DATA-DIRECTORY
例如,清单中定义的免费信息发布网以下环境变量,
复制env:- name:PGPOOL_PARAMS_BACKEND_HOSTNAME0
value: "mypostgres"- name:PGPOOL_PARAMS_BACKEND_HOSTNAME1
value: "mypostgres-replica"- name:PGPOOL_PARAMS_BACKEND_FLAG0
value: "ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER"- name:PGPOOL_PARAMS_BACKEND_FLAG1
value: "DISALLOW_TO_FAILOVER"1.2.3.4.5.6.7.8.9.将在 pgpool.conf 中转换为以下配置参数。
复制backend_hostname0 = mypostgresbackend_hostname1 = mypostgres-replicabackend_flag0 = ALWAYS_PRIMARY|DISALLOW_TO_FAILOVERbackend_flag1 = DISALLOW_TO_FAILOVER1.2.3.4.然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。
配置清单后,运行以下命令部署 Pgpool-II。
复制kubectl apply -f pgpool-deploy-minimal.yaml1. 使用 ConfigMap 配置 Pgpool-II或者,您可以使用 Kubernetes ConfigMap 来存储整个 pgpool.conf 和 pool_hba.conf。ConfigMap 可以作为卷挂载到 Pgpool-II 的容器中。
您可以从以下存储库下载定义 ConfigMap 和 Deployment 的示例清单文件。
pgpool2_on_k8shttps://github.com/pgpool/pgpool2_on_k8s
复制curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-configmap.yamlcurl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy.yaml1.2.定义 ConfigMap 的清单采用以下格式。您可以根据您的配置偏好对其进行更新。要使用 pool_hba.conf 进行客户端身份验证,您需要打开 enable_pool_hba。默认为关闭。
enable_pool_hbahttps://www.pgpool.net/docs/42/en/html/runtime-config-connection.html#GUC-ENABLE-POOL-HBA
复制apiVersion:v1
kind:ConfigMap
metadata: name: pgpool-config
labels: name: pgpool-config
data: pgpool.conf: |- listen_addresses = * port = 9999 socket_dir = /var/run/pgpool pcp_listen_addresses = * pcp_port = 9898 pcp_socket_dir = /var/run/pgpool backend_hostname0 = postgres...
pool_hba.conf: |-local all all trust
host all all 127.0.0.1/32trust
host all all ::1/128trust
hostssl all all 0.0.0.0/0 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。
运行以下命令创建 ConfigMap 并部署引用此 ConfigMap 的 Pgpool-II pod。
复制kubectl apply -f pgpool-configmap.yamlkubectl apply -f pgpool-deploy.yaml1.2.部署 Pgpool-II 后,您可以使用 kubectl get pod 和 kubectl get svc 命令查看 Pgpool-II pod 和服务。
在 Kubernetes 上,您只需要指定两个后端节点。服务器托管指定主服务名称为 backend_hostname0,副本服务名称为 ackend_hostname1。
复制backend_hostname0 = <primary service name>backend_hostname1 = <replica service name>backend_port0 = 5432backend_port1 = 54321.2.3.4. 自动故障转移Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查 PostgreSQL 的状态。如果检测到错误,Pgpool-II 将触发故障转移。在 Kubernetes 上,Kubernetes 会监控 PostgreSQL 的 Pod,如果一个 Pod 宕机,Kubernetes 会重启一个新的 Pod。您需要禁用 Pgpool-II 的自动故障转移,因为 Kubernetes 不需要 Pgpool-II 的自动故障转移。
将 PostgreSQL node 0 指定为主节点 (ALWAYS_PRIMARY),因为即使主节点或副本 pod 扩展、重新启动或发生故障转移,服务名称也不会更改。
复制backend_flag0 =ALWAYS_PRIMARY|DISALLOW_TO_FAILOVERbackend_flag1 =DISALLOW_TO_FAILOVERfailover_on_backend_error = off1.2.3.将密码注册到 pool_passwd
Pgpool-II 使用包含 PostgreSQL 用户密码的 pool_passwd 文件执行身份验证。
pool_passwdhttps://www.pgpool.net/docs/42/en/html/runtime-config-connection.html#GUC-POOL-PASSWD
在 Pgpool-II pod 启动时,Pgpool-II 自动执行 pg_md5 命令,根据 _USERNAME 和 _PASSWORD 格式定义的环境变量生成 pool_passwd。
pg_md5https://www.pgpool.net/docs/42/en/html/pg-md5.html
代表 PostgreSQL 用户的用户名和密码的环境变量必须按以下格式定义:
复制username: <some string>_USERNAME
password: <some string>_PASSWORD1.2.使用 Secret 定义环境变量是保证用户凭据安全的推荐方法。在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 Secret。使用 kubectl get secret 命令检查现有的 Secret。
例如,创建 mypostgres-postgres-secret 来存储 postgres 用户的用户名和密码。要引用这个 secret,您可以定义如下环境变量:
复制env:- name:POSTGRES_USERNAME
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key:username
- name:POSTGRES_PASSWORD
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key: password1.2.3.4.5.6.7.8.9.10.11.启动 Pgpool-II pod 时,会在 /opt/pgpool-II/etc 下自动生成 pool_passwd 和 pcp.conf。
复制$ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pool_passwdpostgres:md53175bce1d3201d16594cebf9d7eb3f9d
$ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pcp.confpostgres:e8a48653851e28c69d0506508fb27fc51.2.3.4.5. 流复制检查Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查复制延迟。要使用此功能,需要 sr_check_user 和 sr_check_password。如果 sr_check_password 留空,Pgpool-II 将尝试从 pool_passwd 获取 sr_check_user 的密码。
sr_check_userhttps://www.pgpool.net/docs/42/en/html/runtime-streaming-replication-check.html#GUC-SR-CHECK-USER
sr_check_passwordhttps://www.pgpool.net/docs/42/en/html/runtime-streaming-replication-check.html#GUC-SR-CHECK-PASSWORD
下面是一个使用 postgres 用户每隔 10 秒连接到 PostgreSQL 以执行流式复制检查的示例。因为 sr_check_password 留空,所以 Pgpool-II 会从 pool_passwd 中获取 postgres 用户的密码。
复制sr_check_period = 10sr_check_user=postgres1.2.创建 secret 存储 sr_check_user 中指定的 PostgreSQL 用户的用户名和密码,并配置环境变量以引用创建的 Secret。在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 secret。使用 kubectl get secret 命令检查现有的 secret。
例如,下面的环境变量引用了 Secret mypostgres-postgres-secret。
复制env:- name:POSTGRES_USERNAME
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key:username
- name:POSTGRES_PASSWORD
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key: password1.2.3.4.5.6.7.8.9.10.11.但是,在 Kubernetes 上,Pgpool-II 连接到任何副本,而不是连接到所有副本。即使有多个副本,Pgpool-II 也将它们作为一个副本进行管理。因此,Pgpool-II 可能无法正确确定复制延迟。要禁用此功能,请配置以下参数:
复制sr_check_period = 01. SSL 设置打开 ssl 以启用 SSL 连接。
复制ssl = on1.当 ssl = on 时,在 Pgpool-II 启动时,会在 /opt/pgpool-II/certs/ 下自动生成私钥文件和证书文件。 ssl_key 和 ssl_cert 会自动配置私钥文件和证书文件的路径。
此外,要仅允许 SSL 连接,请将以下记录添加到 pool_hba.conf 中。
复制hostssl all all 0.0.0.0/0 md51.Pgpool-II Exporter 是 Pgpool-II 指标的 Prometheus 导出器。
Pgpool-II Exporterhttps://github.com/pgpool/pgpool2_exporter
示例清单 pgpool-deploy-metrics.yaml 用于在 Pgpool-II Pod 中部署 Pgpool-II 容器和 Pgpool-II Exporter 容器。
复制spec: containers: - name:pgpool
image: pgpool/pgpool
...
- name: pgpool-stats
image: pgpool/pgpool2_exporter
...1.2.3.4.5.6.7.8.下载示例清单 pgpool-deploy-metrics.yaml。
复制$ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml1.然后,配置 Pgpool-II 和 Pgpool-II Exporter。以下是 Pgpool-II Exporter 容器中用于连接 Pgpool-II 的环境变量的设置。
复制env:- name:POSTGRES_USERNAME
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key:username
- name:POSTGRES_PASSWORD
valueFrom: secretKeyRef: name: mypostgres-postgres-secret
key:password
- name:PGPOOL_SERVICE
value: "localhost"- name:PGPOOL_SERVICE_PORT
value: "9999"1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.配置 Pgpool-II 和 Pgpool-II Exporter 后,部署 Pgpool-II Pod。
复制kubectl apply -f pgpool-configmap.yamlkubectl apply -f pgpool-deploy-metrics.yaml1.2.相关文章:
相关推荐:
IT资讯网源码下载企商汇服务器租用益华科技源码库IT技术网香港云服务器亿华云创站工坊益强科技益华科技编程之道思维库云站无忧科技前瞻亿华智慧云智能时代亿华云益强编程舍汇智坊益华科技IT资讯网益强数据堂益强智未来益强IT技术网亿华科技亿华互联运维纵横多维IT资讯益强智囊团益强资讯优选码上建站亿华智造亿华灵动益强编程堂极客编程益强科技亿华云计算码力社
5.5249s , 11765.3046875 kb
Copyright © 2025 Powered by 在 Kubernetes 上运行 Pgpool-Il 实现 PostgreSQL 查询(读)负载均衡和连接池,亿华互联 滇ICP备2023000592号-16