求助:AWS Kubernetes集群中Pod无法连接同VPC内的Postgres RDS实例
排查K8s Pod无法访问同VPC内RDS的步骤
老哥,我之前处理过完全一样的场景,节点能连但Pod连不上,大概率是K8s网络层面的配置遗漏,咱们从最基础的测试开始排查:
1. 先在Pod内部做基础连通性验证
先别猜问题,直接在Pod里做测试,拿到具体报错:
- 进入Pod执行telnet测试:
kubectl exec -it <你的Pod名称> -- telnet <rds-endpoint> 5432,或者用nc更直观:kubectl exec -it <你的Pod名称> -- nc -zv <rds-endpoint> 5432,看是连接超时还是连接被拒绝,这俩指向的问题完全不同。 - 同时测试DNS解析:
kubectl exec -it <你的Pod名称> -- nslookup <rds-endpoint>,确认Pod能不能把RDS端点解析到正确的私有IP——要是解析出公网IP,那DNS配置肯定有问题。
2. 检查Kubernetes网络策略
很多时候是集群里的网络策略把Pod的出站流量给拦了:
- 先看当前命名空间的网络策略:
kubectl get networkpolicy -n <你的应用命名空间> - 如果有策略存在,先临时删除测试(别担心,测试完可以加回来):
kubectl delete networkpolicy <策略名称> -n <你的应用命名空间>,删完再试Pod连RDS。 - 要是用了Calico、Cilium这类CNI插件,哪怕你没手动创建策略,它们可能自带默认的拒绝规则,得去插件的配置里确认。
3. 重点:RDS安全组是否允许Pod的IP段访问
这是90%的人会踩的坑!你说RDS安全组允许的是K8s节点的EC2 IP,但Pod的IP属于集群的Pod CIDR,不是节点的EC2私有IP:
- 先查集群的Pod CIDR:EKS的话用
aws eks describe-cluster --name <集群名称> --query "cluster.resourcesVpcConfig.podCidr",或者通用方法kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'看每个节点的Pod子网 - 去RDS的安全组里,把整个Pod CIDR段添加到入站规则,允许5432端口的访问。节点能通是因为用的节点IP,但Pod访问VPC内资源默认是用自己的Pod IP(除非你特意配置了SNAT)。
4. 验证Pod的出口IP
有些集群配置了SNAT,Pod访问外部用节点IP,但访问VPC内部用Pod IP:
- 在Pod里查出口IP:
kubectl exec -it <你的Pod名称> -- curl ifconfig.me(或者用wget -qO- ifconfig.me) - 拿到这个IP后,去RDS安全组里看是否在允许列表里——如果是Pod IP,那必须加Pod CIDR;如果是节点IP,那回到网络策略或者CNI的排查。
5. 检查节点的iptables和流量捕获
如果前面都没问题,就去节点上看流量有没有被拦截:
- 在节点上执行
iptables-save | grep <RDS的私有IP>,看看有没有拒绝该IP的规则 - 用tcpdump抓流量:
tcpdump -i any host <RDS的私有IP> and port 5432,然后在Pod里发起连接,看节点上能不能抓到数据包——要是抓不到,说明CNI没把Pod的流量转发出去;要是抓到但没回应,那还是RDS安全组的问题。
6. 检查CNI插件状态
如果是EKS用VPC CNI,先确认插件正常:
- 看aws-node Pod状态:
kubectl get pods -n kube-system -l k8s-app=aws-node,确保所有Pod都是Running - 看插件日志:
kubectl logs -n kube-system <aws-node的Pod名称>,找有没有IP分配失败、网络配置错误的报错。
内容的提问来源于stack exchange,提问作者DevOps guy
相关产品推荐
相关产品推荐

