「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池

本文涉及的产品
PolarClaw,2核4GB
简介: 「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池

介绍



因为 PostgreSQL 是一个有状态的应用程序,并且管理 PostgreSQL 有非常具体的要求(例如备份、恢复、自动故障转移等),Kubernetes 的内置功能无法处理这些任务。因此,需要一个扩展 Kubernetes 功能以创建和管理 PostgreSQLOperator


PostgreSQL operator 有好几种,比如 Crunchy PostgreSQL Operator、Zalando PostgreSQL Operator 和 KubeDB。但是,这些 operator 不提供查询负载均衡功能。

  • Crunchy PostgreSQL Operator
  • Zalando PostgreSQL Operator
  • KubeDB

结合 PostgreSQL OperatorPgpool-IIKubernetes 上部署具有查询负载均衡和连接池能力的 PostgreSQL 集群。Pgpool-II 可以与上面提到的任何 PostgreSQL Operator 结合使用。


架构



image.png


前提条件



在开始配置过程之前,请检查以下前提条件。

  • 确保你有一个 Kubernetes 集群,并且安装了 kubectl
  • PostgreSQL OperatorPostgreSQL cluster 已安装。


部署 Pgpool-II



Kubernetes 不需要 Pgpool-II 的健康检查、自动故障转移、watchdog 和在线恢复功能。您只需要启用负载平衡和连接池。

Pgpool-II pod 应该使用以下最低配置:


backend_hostname0 = '<primary service name>'
backend_hostname1 = '<replica service name>'
backend_port0 = '5432'
backend_port1 = '5432'
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
failover_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 = on
connection_cache = on
listen_addresses = '*'


有两种配置 Pgpool-II 的方法。

  1. 使用环境变量
  1. 使用 ConfigMap


您可能需要在生产环境中配置客户端身份验证和更多参数。在生产环境中,我们建议使用 ConfigMap 来配置 pgpool.confpool_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.yaml


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_hostname
  • backend_flag
  • 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"


将在 pgpool.conf 中转换为以下配置参数。


backend_hostname0 = 'mypostgres'
backend_hostname1 = 'mypostgres-replica'
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 = 'DISALLOW_TO_FAILOVER'


然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。


配置清单后,运行以下命令部署 Pgpool-II


kubectl apply -f pgpool-deploy-minimal.yaml


使用 ConfigMap 配置 Pgpool-II


或者,您可以使用 Kubernetes ConfigMap 来存储整个 pgpool.confpool_hba.confConfigMap 可以作为卷挂载到 Pgpool-II 的容器中。


您可以从以下存储库下载定义 ConfigMapDeployment 的示例清单文件。

  • pgpool2_on_k8s


curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-configmap.yaml
curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy.yaml


定义 ConfigMap 的清单采用以下格式。您可以根据您的配置偏好对其进行更新。要使用 pool_hba.conf 进行客户端身份验证,您需要打开 enable_pool_hba。默认为关闭。


  • 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/32          trust
    host    all         all         ::1/128               trust
    hostssl all         all         0.0.0.0/0             md5


然后,您需要定义包含 PostgreSQL 用户的用户名和密码的环境变量,用于客户端身份验证。

运行以下命令创建 ConfigMap 并部署引用此 ConfigMapPgpool-II pod。


kubectl apply -f pgpool-configmap.yaml
kubectl apply -f pgpool-deploy.yaml


部署 Pgpool-II 后,您可以使用 kubectl get podkubectl get svc 命令查看 Pgpool-II pod 和服务。


Pgpool-II 配置



后端设置


Kubernetes 上,您只需要指定两个后端节点。指定主服务名称为 backend_hostname0,副本服务名称为 ackend_hostname1


backend_hostname0 = '<primary service name>'
backend_hostname1 = '<replica service name>'
backend_port0 = '5432'
backend_port1 = '5432'


自动故障转移


Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查 PostgreSQL 的状态。如果检测到错误,Pgpool-II 将触发故障转移。在 Kubernetes 上,Kubernetes 会监控 PostgreSQLPod,如果一个 Pod 宕机,Kubernetes 会重启一个新的 Pod。您需要禁用 Pgpool-II 的自动故障转移,因为 Kubernetes 不需要 Pgpool-II 的自动故障转移。


PostgreSQLnode 0 指定为主节点 (ALWAYS_PRIMARY),因为即使主节点或副本 pod 扩展、重新启动或发生故障转移,服务名称也不会更改。


backend_flag0 ='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_flag1 ='DISALLOW_TO_FAILOVER'
failover_on_backend_error = off


将密码注册到 pool_passwd


Pgpool-II 使用包含 PostgreSQL 用户密码的 pool_passwd 文件执行身份验证。

  • pool_passwd


Pgpool-II pod 启动时,Pgpool-II 自动执行 pg_md5 命令,根据 <some string>_USERNAME<some string>_PASSWORD 格式定义的环境变量生成 pool_passwd

  • pg_md5

代表 PostgreSQL 用户的用户名和密码的环境变量必须按以下格式定义:


username: <some string>_USERNAME
password: <some string>_PASSWORD


使用 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: password


启动 Pgpool-II pod 时,会在 /opt/pgpool-II/etc 下自动生成 pool_passwdpcp.conf


$ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pool_passwd
postgres:md53175bce1d3201d16594cebf9d7eb3f9d
$ kubectl exec <pgpool pod> -it -- cat /opt/pgpool-II/etc/pcp.conf
postgres:e8a48653851e28c69d0506508fb27fc5


流复制检查


Pgpool-II 能够定期连接到已配置的 PostgreSQL 后端并检查复制延迟。要使用此功能,需要 sr_check_usersr_check_password。如果 sr_check_password 留空,Pgpool-II 将尝试从 pool_passwd 获取 sr_check_user 的密码。


  • sr_check_user
  • sr_check_password

下面是一个使用 postgres 用户每隔 10 秒连接到 PostgreSQL 以执行流式复制检查的示例。因为 sr_check_password 留空,所以 Pgpool-II 会从 pool_passwd 中获取 postgres 用户的密码。


sr_check_period = 10
sr_check_user='postgres'


创建 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: password


但是,在 Kubernetes 上,Pgpool-II 连接到任何副本,而不是连接到所有副本。即使有多个副本,Pgpool-II 也将它们作为一个副本进行管理。因此,Pgpool-II 可能无法正确确定复制延迟。要禁用此功能,请配置以下参数:


sr_check_period = 0


SSL 设置


打开 ssl 以启用 SSL 连接。


ssl = on


ssl = on 时,在 Pgpool-II 启动时,会在 /opt/pgpool-II/certs/ 下自动生成私钥文件和证书文件。 ssl_keyssl_cert 会自动配置私钥文件和证书文件的路径。

此外,要仅允许 SSL 连接,请将以下记录添加到 pool_hba.conf 中。


hostssl    all         all         0.0.0.0/0             md5


带监控的 Pgpool-II


Pgpool-II ExporterPgpool-II 指标的 Prometheus 导出器。

  • Pgpool-II Exporter

示例清单 pgpool-deploy-metrics.yaml 用于在 Pgpool-IIPod 中部署 Pgpool-II 容器和 Pgpool-II Exporter 容器。


spec:
  containers:
  - name: pgpool
    image: pgpool/pgpool
  ...
  - name: pgpool-stats
    image: pgpool/pgpool2_exporter
  ...


下载示例清单 pgpool-deploy-metrics.yaml


$ curl -LO https://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml


然后,配置 Pgpool-IIPgpool-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"


配置 Pgpool-IIPgpool-II Exporter 后,部署 Pgpool-II Pod


kubectl apply -f pgpool-configmap.yaml
kubectl apply -f pgpool-deploy-metrics.yaml


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
310 0
|
Kubernetes 搜索推荐 Docker
K8S容器运行时弃用Docker转型Containerd
K8S容器运行时弃用Docker转型Containerd
2612 0
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
744 269
|
负载均衡 IDE Java
SpringBoot整合XXL-JOB【04】- 以GLUE模式运行与执行器负载均衡策略
在本节中,我们将介绍XXL-JOB的GLUE模式和集群模式下的路由策略。GLUE模式允许直接在线上改造方法为定时任务,无需重新部署。通过一个测试方法,展示了如何在调度中心配置并使用GLUE模式执行定时任务。接着,我们探讨了多实例环境下的负载均衡策略,确保任务不会重复执行,并可通过修改路由策略(如轮训)实现任务在多个实例间的均衡分配。最后,总结了GLUE模式和负载均衡策略的应用,帮助读者更深入理解XXL-JOB的使用。
933 9
SpringBoot整合XXL-JOB【04】-  以GLUE模式运行与执行器负载均衡策略
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
399 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
302 1
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
Kubernetes 监控 Cloud Native
|
Kubernetes 安全 Serverless
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
237 6
|
Kubernetes API Perl
在K8S中,如何让Pod运行一次?如何解决一次性任务?
在K8S中,如何让Pod运行一次?如何解决一次性任务?
下一篇
开通oss服务