为何外部Docker容器无法发现Kind集群中的Postgres HA服务?
解决外部Docker容器访问kind集群中Postgres HA服务的配置问题
核心原因
kind集群内的Kubernetes服务并非直接作为Docker容器挂载在kind网络下,而是通过K8s内部的CNI网络组件、kube-proxy管理流量,所以docker network inspect kind看不到Postgres的pgpool服务是正常现象,需要额外配置暴露服务才能让外部Docker容器访问。
需要补充的配置步骤
修改Postgres HA服务的类型
默认bitnami/postgresql-ha的postgres-postgresql-ha-pgpool服务是ClusterIP类型,仅集群内部可访问。需改为NodePort或LoadBalancer类型:- 编辑服务:
kubectl edit service postgres-postgresql-ha-pgpool - 将
spec.type的值改为NodePort,保存退出后K8s会自动分配一个30000-32767区间的端口 - 查看分配的端口:
kubectl get service postgres-postgresql-ha-pgpool,找到PORT(S)列的5432:<端口>/TCP - 外部Docker容器可通过
kind-control-plane的IP加上该NodePort访问Postgres
- 编辑服务:
使用端口转发临时暴露服务(适合测试场景)
如果不想修改服务类型,可通过kubectl端口转发将pgpool端口映射到kind-control-plane容器:kubectl port-forward service/postgres-postgresql-ha-pgpool 5432:5432 --address 0.0.0.0之后外部Docker容器直接通过
kind-control-plane:5432即可访问Postgres配置Postgres的访问权限
bitnami/postgresql-ha默认可能限制仅集群内部IP访问,需允许kind网络网段的连接:- 查看kind网络的网段:
docker network inspect kind | grep Subnet,一般为172.18.0.0/16 - 编辑pgpool的配置映射:
kubectl edit configmap postgres-postgresql-ha-pgpool - 在
pg_hba.conf部分添加一行:host all all <kind网段> md5,比如host all all 172.18.0.0/16 md5 - 重启pgpool pod:
kubectl rollout restart statefulset postgres-postgresql-ha-pgpool
- 查看kind网络的网段:
验证网络连通性
在docker-compose的应用容器内,先pingkind-control-plane确认网络可达,再尝试连接Postgres服务。
内容的提问来源于stack exchange,提问作者himmip
相关产品推荐
相关产品推荐

