介绍由于PostgreSQL是一个有状态的应用程序,并且管理PostgreSQL有非常具体的要求(例如备份,恢复,自动故障转移等),Kubernetes'内置功能无法处理这些任务。因此,需要一个扩展Kubernetes功能以创建和管理PostgreSQL的Operator。有几种PostgreSQL运算符,例如CrunchyPostgreSQL运算符、ZalandoPostgreSQL运算符和KubeDB。但是,这些运算符不提供查询负载平衡。CrunchyPostgreSQLOperatorhttps://github.com/CrunchyData/postgres-operatorZalandoPostgreSQLOperatorhttps://github.com/zalando/postgres-operatorKubeDBhttps://github.com/kubedb/operator结合PostgreSQLOperator和Pgpool-II部署在Kubernetes上具有查询负载平衡和连接池功能的PostgreSQL集群。Pgpool-II可以与上述任何PostgreSQL运算符结合使用。体系结构先决条件在开始配置过程之前,请查看以下先决条件。确保你有一个安装了kubectl的Kubernetes集群。安装PostgreSQLOperator和PostgreSQL集群。在Kubernetes上部署Pgpool-II不需要Pgpool-II的健康检查、自动故障转移、看门狗和在线恢复功能。您只需要启用负载平衡和连接池。Pgpool-IIpod应使用以下最低配置:backend_hostname0=''backend_hostname1=''backend_port0='5432'backend_port1='5432'backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'backend_flag1='DIFAILOVER_TO'failover_on_backend_error=offsr_check_period=10(使用流复制检查时)sr_check_user='PostgreSQL用户的用户名'(使用流复制检查时)load_balance_mode=onconnection_cache=onlisten_addresses='*'Pgpool-II有两种配置方式1.使用环境变量https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/2。使用ConfigMaphttps://kubernetes.io/docs/concepts/configuration/configmap/生产环境可能需要配置客户端认证等参数。在生产环境中,我们推荐使用ConfigMap来配置pgpool.conf和pool_hba.conf。使用环境变量配置Pgpool-IIKubernetes环境变量可以传递给pod中的容器。您可以在部署清单中定义环境变量来配置Pgpool-II的参数。pgpool-deploy-minimal.yaml是一个示例清单,包括环境变量的最小设置。您可以下载pgpool-deploy-minimal.yaml并修改此清单中的环境变量。$curl-LOhttps://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-minimal.yamlPGPOOL_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-HOSTNAMEbackend_flaghttps://www.pgpool.net/docs/42/en/html/runtime-config-backend-settings.html#GUC-BACKEND-FLAGbackend_data_directoryhttps://www.pgpool.net/docs/42/en/html/runtime-config-backend-settings.html#GUC-BACKEND-DATA-目录示例,清单清单定义以下环境环境环境,env:-名称:pgpool_params_backend_hostname0value:“mypostgres”-名称:pgpost_host_host_host_host_hostname1valit“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。kubectlapply-fpgpool-deploy-minimal.yaml使用ConfigMap配置Pgpool-II或者,您可以使用KubernetesConfigMap来存储整个pgpool.conf和pool_hba.conf。ConfigMaps可以作为卷安装在Pgpool-II容器中。您可以从以下存储库下载定义ConfigMap和Deployment的示例清单文件。pgpool2_on_k8shttps://github.com/pgpool/pgpool2_on_k8scurl-LOhttps://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-configmap.yamlcurl-LOhttps://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy.yaml以下列格式定义ConfigMap的清单。您可以根据您的配置首选项对其进行更新。要使用pool_hba.conf进行客户端身份验证,您需要打开enable_pool_hba。默认关闭。enable_pool_hbahttps://www.pgpool.net/docs/42/en/html/runtime-config-connection.html#GUC-ENABLE-POOL-HBAapiVersion:v1kind:ConfigMapmetadata:name:pgpool-configlabels:name:pgpool-configdata:pgpool.conf:|-listen_addresses='*'port=9999socket_dir='/var/run/pgpool'pcp_listen_addresses='*'pcp_port=9898pcp_socket_dir='/var/run/pgpool'backend_hostname0='postgres'...pool_hba.conf:|-localallalltr??usthostallall127.0.0.1/32trusthostallall::1/128trusthostsslallall0.0.0.0/0然后需要定义环境变量,用于客户端认证.运行以下命令以创建ConfigMap并部署引用此ConfigMap的Pgpool-IIpod。kubectlapply-fpgpool-configmap.yamlkubectlapply-fpgpool-deploy.yaml部署Pgpool-II后,您可以使用kubectlgetpod和kubectlgetsvc命令查看Pgpool-IIpod和服务。Pgpool-II配置后端设置在Kubernetes上,只需要指定两个后端节点即可。将主服务名称指定为backend_hostname0,将副本服务名称指定为ackend_hostname1。backend_hostname0=''backend_hostname1=''backend_port0='5432'backend_port1='5432'自动故障转移Pgpool-II能够定期连接到已配置的PostgreSQL后端并检查PostgreSQL的状态。如果检测到错误,Pgpool-II将触发故障转移。在Kubernetes上,Kubernetes监控PostgreSQLPod,如果Pod宕机,Kubernetes会重新启动一个新的Pod。您需要禁用Pgpool-II的自动故障转移,因为Kubernetes不需要Pgpool-II的自动故障转移。将PostgreSQL节点0指定为主节点(ALWAYS_PRIMARY),因为即使主Pod或副本Pod扩展、重启或故障转移,服务名称也不会更改。backend_flag0='ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'backend_flag1='DISALLOW_TO_FAILOVER'failover_on_backend_error=off将密码注册到pool_passwdPgpool-II使用包含PostgreSQL用户密码的pool_passwd文件执行身份验证。pool_passwdhttps://www.pgpool.net/docs/42/en/html/runtime-config-connection.html#GUC-POOL-PASSWDPgpool-IIpod启动时,Pgpool-II自动执行pg_md5命令,根据_USERNAME使用以_PASSWORD格式定义的环境变量生成pool_passwd。pg_md5https://www.pgpool.net/docs/42/en/html/pg-md5.html表示PostgreSQL用户的用户名和密码的环境变量必须按以下格式定义:username:_USERNAMEpassword:_PASSWORD使用Secret定义环境变量是保证用户凭据安全的推荐方法。在大多数PostgreSQLOperator中,几个定义PostgreSQL用户凭证的Secret是在创建PostgreSQL集群时自动创建的。使用kubectlgetsecret命令检查现有的Secret。例如,创建mypostgres-postgres-secret来存储postgres用户的用户名和密码。要引用此机密,您可以定义以下环境变量:env:-name:POSTGRES_USERNAMEvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:username-name:POSTGRES_PASSWORDvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:password启动Pgpool-IIpod时,会在/opt/pgpool-II/etc下自动生成pool_passwd和pcp.conf。$kubectlexec-it--cat/opt/pgpool-II/etc/pool_passwdpostgres:md53175bce1d3201d16594cebf9d7eb3f9d$kubectlexec-it--cat/opt/pgpool-II/etc/pcp.confpostgres:e8a486538ff1e28c60c50520流复制检查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-USERsr_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='postgres'创建一个secret来存储sr_check_user中指定的PostgreSQL用户的用户名和密码,并配置环境变量来引用创建的Secret。在大多数PostgreSQLOperator中,定义PostgreSQL用户凭证的几个秘密在创建PostgreSQL集群时自动创建。使用kubectlgetsecret命令检查现有的secret。例如,下面的环境变量引用了Secretmypostgres-postgres-secret。env:-name:POSTGRES_USERNAMEvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:username-name:POSTGRES_PASSWORDvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:password但是,在Kubernetes上,任何Pgpool-II连接到副本而不是连接到所有副本。即使有多个副本,Pgpool-II也将它们作为一个副本来管理。因此,Pgpool-II可能无法正确确定复制延迟。要禁用此功能,请配置以下参数:sr_check_period=0SSL在ssl上设置以启用SSL连接。ssl=on当ssl=on时,Pgpool-II启动时会自动在/opt/pgpool-II/certs/下生成私钥文件和证书文件。ssl_key和ssl_cert会自动配置私钥文件和证书文件的路径。此外,要仅允许SSL连接,请将以下条目添加到pool_hba.conf。hostsslallall0.0.0.0/0md5Pgpool-IIPwithmonitoringgpool-IIExporter是用于Pgpool-II指标的Prometheus导出器。Pgpool-IIExporterhttps://github.com/pgpool/pgpool2_exporter示例清单pgpool-deploy-metrics.yaml用于在Pgpool-IIPod中部署Pgpool-II容器和Pgpool-IIExporter容器。规范:容器:-名称:pgpool图像:pgpool/pgpool...-名称:pgpool-stats图像:pgpool/pgpool2_exporter...下载示例清单pgpool-deploy-metrics.yaml。$curl-LOhttps://raw.githubusercontent.com/pgpool/pgpool2_on_k8s/master/pgpool-deploy-metrics.yaml然后,配置Pgpool-II和Pgpool-IIExporter。以下是Pgpool-IIExporter容器中用于连接Pgpool-II的环境变量的设置。env:-name:POSTGRES_USERNAMEvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:username-name:POSTGRES_PASSWORDvalueFrom:secretKeyRef:name:mypostgres-postgres-secretkey:password-name:PGPOOL_SERVICE"localhost"值:"PGPOOL_SERVICE_PORT值:"9999"配置Pgpool-II和Pgpool-IIExporter后,部署Pgpool-IIPod.kubectlapply-fpgpool-configmap.yamlkubectlapply-fpgpool-deploy-metrics.yaml