如何通过本地客户端访问Azure Kubernetes中的PostgresCluster
解决Azure Kubernetes集群内PostgreSQL HA集群通过LoadBalancer无法外部访问的问题
问题诊断
连接失败大概率由以下原因导致:
- Service的Selector标签未匹配Bitnami PostgreSQL HA的Pod标签
- PostgreSQL默认仅监听集群内部地址,未开放外部访问端口
- Azure网络安全组(NSG)未放行5432端口的外部流量
- PostgreSQL的pg_hba.conf未授权外部客户端IP访问
分步解决方案
1. 修正LoadBalancer Service的Selector
Bitnami PostgreSQL HA的主节点Pod带有专属标签,当前Service的Selector无法精准匹配到提供服务的主节点。修改Terraform配置:
resource "kubernetes_manifest" "postgresql-loadbalancer" { manifest = { "apiVersion" = "v1" "kind" = "Service" "metadata" = { "name" = "postgres-db-lb" "namespace" = "${var.kube_namespace}" } "spec" = { "selector" = { "app.kubernetes.io/name" = "postgresql-ha" "app.kubernetes.io/component" = "primary" # 新增:指定主节点标签 } "type" = "LoadBalancer" "ports" = [{ "port" = 5432 # 改为数字类型,避免字符串解析问题 "targetPort" = 5432 }] } } }
2. 配置PostgreSQL开放外部访问
修改Helm Release配置,让PostgreSQL监听所有地址,并通过pg_hba授权外部访问:
resource "helm_release" "postgres-cluster" { name = "postgres-cluster" repository = "https://charts.bitnami.com/bitnami" chart = "postgresql-ha" namespace = var.kube_namespace set { name = "global.postgresql.username" value = var.postgresql_username } set { name = "global.postgresql.password" value = var.postgresql_password } # 新增:让主节点监听所有地址 set { name = "primary.extraEnvVars[0].name" value = "POSTGRESQL_LISTEN_ADDRESSES" } set { name = "primary.extraEnvVars[0].value" value = "*" } # 新增:允许外部IP访问(生产环境建议替换为特定IP段) set { name = "primary.pgHbaConfiguration" value = "host all all 0.0.0.0/0 scram-sha-256" } }
生产环境请勿使用
0.0.0.0/0,替换为你的本地客户端IP段,比如192.168.1.0/24
3. 检查Azure网络安全组(NSG)
- 找到Kubernetes集群节点对应的NSG
- 添加入站规则:允许来自本地客户端IP的5432端口流量
- 确保规则优先级高于默认拒绝规则
4. 验证配置并测试连接
- 应用Terraform配置:
terraform apply
- 查看LoadBalancer状态,确认外部IP已分配:
kubectl get service postgres-db-lb -n ${var.kube_namespace}
- 用pgAdmin或psql测试连接:
psql -h <LoadBalancer外部IP> -U ${var.postgresql_username} -d postgres
内容的提问来源于stack exchange,提问作者PassionateDeveloper
相关产品推荐
相关产品推荐

