介绍如何在 Kubernetes 上运行 Pgpool-II 实现 PostgreSQL查询负载均衡和连接池。

介绍

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

PostgreSQL operator 有好几种,比如 Crunchy PostgreSQL OperatorZalando PostgreSQL OperatorKubeDB。但是,这些 operator 不提供查询负载均衡功能。

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

架构

前提条件

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

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

部署 Pgpool-II

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

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

  1. backend_hostname0 = '<primary service name>'
  2. backend_hostname1 = '<replica service name>'
  3. backend_port0 = '5432'
  4. backend_port1 = '5432'
  5. backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
  6. backend_flag1 = 'DISALLOW_TO_FAILOVER'
  7. failover_on_backend_error = off
  8. sr_check_period = 10 (when using streaming replication check)
  9. sr_check_user='username of PostgreSQL user' (when using streaming replication check)
  10. load_balance_mode = on
  11. connection_cache = on
  12. listen_addresses = '*'

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

  1. 使用环境变量

  2. 使用 ConfigMap

您可能需要在生产环境中配置客户端身份验证和更多参数。在生产环境中,我们建议使用 ConfigMap 来配置 pgpool.confpool_hba.conf

使用环境变量配置 Pgpool-II

Kubernetes 环境变量可以传递给 pod 中的容器。您可以在部署清单中定义环境变量来配置 Pgpool-II 的参数。pgpool-deploy-minimal.yaml 是一个示例清单,包括环境变量的最小设置。您可以下载 pgpool-deploy-minimal.yaml 并修改此清单中的环境变量。

  1. $ 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 的设置不是必需的。

例如,清单中定义的以下环境变量,

  1. env:
  2. - name: PGPOOL_PARAMS_BACKEND_HOSTNAME0
  3. value: "mypostgres"
  4. - name: PGPOOL_PARAMS_BACKEND_HOSTNAME1
  5. value: "mypostgres-replica"
  6. - name: PGPOOL_PARAMS_BACKEND_FLAG0
  7. value: "ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER"
  8. - name: PGPOOL_PARAMS_BACKEND_FLAG1
  9. value: "DISALLOW_TO_FAILOVER"

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

  1. backend_hostname0 = 'mypostgres'
  2. backend_hostname1 = 'mypostgres-replica'
  3. backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
  4. backend_flag1 = 'DISALLOW_TO_FAILOVER'

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

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

  1. kubectl apply -f pgpool-deploy-minimal.yaml

使用 ConfigMap 配置 Pgpool-II

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

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

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

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

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: pgpool-config
  5. labels:
  6. name: pgpool-config
  7. data:
  8. pgpool.conf: |-
  9. listen_addresses = '*'
  10. port = 9999
  11. socket_dir = '/var/run/pgpool'
  12. pcp_listen_addresses = '*'
  13. pcp_port = 9898
  14. pcp_socket_dir = '/var/run/pgpool'
  15. backend_hostname0 = 'postgres'
  16. ...
  17. pool_hba.conf: |-
  18. local all all trust
  19. host all all 127.0.0.1/32 trust
  20. host all all ::1/128 trust
  21. hostssl all all 0.0.0.0/0 md5

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

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

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

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

Pgpool-II 配置

后端设置

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

  1. backend_hostname0 = '<primary service name>'
  2. backend_hostname1 = '<replica service name>'
  3. backend_port0 = '5432'
  4. backend_port1 = '5432'

自动故障转移

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

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

  1. backend_flag0 ='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
  2. backend_flag1 ='DISALLOW_TO_FAILOVER'
  3. failover_on_backend_error = off

将密码注册到 pool_passwd

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

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

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

  1. username: <some string>_USERNAME
  2. password: <some string>_PASSWORD

使用 Secret 定义环境变量是保证用户凭据安全的推荐方法。在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 Secret。 使用 kubectl get secret 命令检查现有的 Secret

例如,创建 mypostgres-postgres-secret 来存储 postgres 用户的用户名和密码。 要引用这个 secret,您可以定义如下环境变量:

  1. env:
  2. - name: POSTGRES_USERNAME
  3. valueFrom:
  4. secretKeyRef:
  5. name: mypostgres-postgres-secret
  6. key: username
  7. - name: POSTGRES_PASSWORD
  8. valueFrom:
  9. secretKeyRef:
  10. name: mypostgres-postgres-secret
  11. key: password

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

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

流复制检查

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

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

  1. sr_check_period = 10
  2. sr_check_user='postgres'

创建 secret 存储 sr_check_user 中指定的 PostgreSQL 用户的用户名和密码,并配置环境变量以引用创建的 Secret。 在大多数 PostgreSQL Operators 中,创建 PostgreSQL 集群时会自动创建几个定义 PostgreSQL 用户凭据的 secret。使用 kubectl get secret 命令检查现有的 secret

例如,下面的环境变量引用了 Secret mypostgres-postgres-secret

  1. env:
  2. - name: POSTGRES_USERNAME
  3. valueFrom:
  4. secretKeyRef:
  5. name: mypostgres-postgres-secret
  6. key: username
  7. - name: POSTGRES_PASSWORD
  8. valueFrom:
  9. secretKeyRef:
  10. name: mypostgres-postgres-secret
  11. key: password

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

  1. sr_check_period = 0

SSL 设置

打开 ssl 以启用 SSL 连接。

  1. ssl = on

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

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

  1. hostssl all all 0.0.0.0/0 md5

带监控的 Pgpool-II

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

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

  1. spec:
  2. containers:
  3. - name: pgpool
  4. image: pgpool/pgpool
  5. ...
  6. - name: pgpool-stats
  7. image: pgpool/pgpool2_exporter
  8. ...

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

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

然后,配置 Pgpool-IIPgpool-II Exporter。以下是 Pgpool-II Exporter 容器中用于连接 Pgpool-II 的环境变量的设置。

  1. env:
  2. - name: POSTGRES_USERNAME
  3. valueFrom:
  4. secretKeyRef:
  5. name: mypostgres-postgres-secret
  6. key: username
  7. - name: POSTGRES_PASSWORD
  8. valueFrom:
  9. secretKeyRef:
  10. name: mypostgres-postgres-secret
  11. key: password
  12. - name: PGPOOL_SERVICE
  13. value: "localhost"
  14. - name: PGPOOL_SERVICE_PORT
  15. value: "9999"

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

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

更多

云原生 PostgreSQL - CrunchyData PGO 教程:创建、连接、删除 Postgres 集群

「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池的更多相关文章

  1. 在Kubernetes上运行SAP UI5应用(下): 一个例子体会Kubernetes内容器的高可用性和弹性伸缩

    上一篇文章 在Kubernetes上运行SAP UI5应用(上),我介绍了如何在Docker里运行一个简单的SAP UI5应用,并且已经成功地将一个包含了这个UI5应用的docker镜像上传到Dock ...

  2. 在kubernetes上运行WASM负载

    在kubernetes上运行WASM负载 WASM一般用在前端业务中,但目前有扩展到后端服务的趋势.本文使用Krustlet 将WASM服务部署到kubernetes. 简介 Krustlet 是一个 ...

  3. 在Docker和Kubernetes上运行MongoDB微服务

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟.容器是完全使用沙箱机制,相互之间不会有任何接 ...

  4. 在Kubernetes上运行SAP UI5应用(上)

    2018年只剩最后30天了.Jerry在2017年的最后一天,曾经立下一个目标:这个微信公众号在2018年保证至少每周发布一篇SAP原创技术文章. 从Jerry在后台统计的2018全年文章数量来看,这 ...

  5. 在Kubernetes上运行有状态应用:从StatefulSet到Operator

    一开始Kubernetes只是被设计用来运行无状态应用,直到在1.5版本中才添加了StatefulSet控制器用于支持有状态应用,但它直到1.9版本才正式可用.本文将介绍有状态和无状态应用,一个通过K ...

  6. 在 Kubernetes 上运行高可用的 Kafka 集群

    转载自:https://www.qikqiak.com/post/deploy-kafka-ha-on-k8s/ Apache Kafka 是目前最流行的分布式消息发布订阅系统,虽然 Kafka 非常 ...

  7. 史上最全Spring Cloud Alibaba--Nacos教程(涵盖负载均衡、配置管理、多环境切换、配置共享/刷新、灰度、集群)

    能够实现Nacos安装 基于Nacos能实现应用负载均衡 能基于Nacos实现配置管理 配置管理 负载均衡 多环境切换 配置共享 配置刷新 灰度发布 掌握Nacos集群部署 1 Nacos安装 Nac ...

  8. kubernetes云平台管理实战: 自动加载到负载均衡(七)

    一.如何实现外界能访问 外界访问不了 1.启动svc [root@k8s-master ~]# cat myweb-svc.yaml apiVersion: v1 kind: Service meta ...

  9. 实例演示:如何在Kubernetes上大规模运行CI/CD

    本周四晚上8:30,第二期k3s在线培训如约开播!本期课程将介绍k3s的核心架构,如高可用架构以及containerd.一起来进阶探索k3s吧! 报名及观看链接:http://z-mz.cn/PmwZ ...

随机推荐

  1. Linux防止文件被误删除或修改

    chattr简介 Linux没有回收站,一旦文件或文件夹被误删除,要寻找回来很麻烦,不如事先对一些重要的文件做一些保护,这时我们需要一个命令chattr,其使用格式为 chattr 操作符 属性 文件 ...

  2. 微服务架构 | *3.5 Nacos 服务注册与发现的源码分析

    目录 前言 1. 客户端注册进 Nacos 注册中心(客户端视角) 1.1 Spring Cloud 提供的规范标准 1.2 Nacos 的自动配置类 1.3 监听服务初始化事件 AbstractAu ...

  3. [Windows]为windows系统鼠标右键添加软件和图标

    转载自 https://blog.csdn.net/p312011150/article/details/81207059 一.打开注册表 首先打开windows的注册表,当然了,我个人倾向于 (1) ...

  4. CentOS 8安装Docker报错(Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.)

    CentOS8安装docker和docer-conpose 报错如下Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires contain ...

  5. ArrayList实现类

    特点 数组结构实现,查询快,增删慢 运行效率高,线程不安全 可重复 常用方法 Modifier and Type Method and Description boolean add(E e) 将指定 ...

  6. MobaXterm中文乱码问题

    现在Xshell和SecureCRT都要收费,本着不用盗版的原则,同时需要标签管理session,快捷命令等功能,最后选择了MobaXterm. 但是使用后发现中文会乱码.后按照博客的方法,修改了终端 ...

  7. 【程序6】用*号输出字母C的图案

    我自己写的 print(' * * *\n'); print(' * \n'); print(' * \n'); print(' * * * *\n'); 官方答案 print('*' * 10) f ...

  8. webStorm关于ESlint6语法格式化解决方案

    方式1: 下载ESLint6 格式化插件(格式化蛋痛,有点卡,而且必须先保存) 方式2:更改快捷键 在设置中,将下面这个格式化选项设置快捷键即可 到设置中的下面这个选项找修改即可

  9. vue中router与route区别

    1.$route对象 $route对象表示当前的路由信息,包含了当前 URL 解析得到的信息.包含当前的路径,参数,query对象等. 1.    $route.path      字符串,对应当前路 ...

  10. 「BalkanOI 2018 Day2」Parentrises

    「BalkanOI 2018 Day2」Parentrises part1 显然可以直接贪心. 右括号记-1,左括号记1. 默认起始全部绿色,不染色. 策略如下: 从左往右扫,如果右括号个数大于左括号 ...