You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过本地客户端访问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. 验证配置并测试连接

  1. 应用Terraform配置:
terraform apply
  1. 查看LoadBalancer状态,确认外部IP已分配:
kubectl get service postgres-db-lb -n ${var.kube_namespace}
  1. 用pgAdmin或psql测试连接:
psql -h <LoadBalancer外部IP> -U ${var.postgresql_username} -d postgres

内容的提问来源于stack exchange,提问作者PassionateDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:15:49