EKS Pod无法解析RDS DNS名称(IP可正常连接)求助
我之前碰到过和你几乎一模一样的场景!结合你的描述来看,核心问题应该是EKS Pod的DNS解析没有正确走VPC对等的DNS路由——虽然节点能正常解析RDS域名,但Pod的DNS配置或集群CoreDNS的转发逻辑出了偏差,导致解析慢甚至失败,进而引发连接池耗尽的问题。下面是我当时排查和解决的具体步骤:
- CoreDNS转发规则缺失:默认的EKS CoreDNS会把所有域名请求转发到节点的
/etc/resolv.conf,但对于RDS这类VPC内部的私有域名,需要单独配置转发到VPC的DNS服务器,否则可能走公网解析绕远路,甚至解析失败。 - VPC对等DNS解析未双向启用:你提到启用了RDS VPC作为接受方的DNS解析,但EKS所在VPC作为发起方的DNS解析也得开启,不然Pod的DNS请求没法正确转发到RDS VPC的DNS服务。
- Pod DNS策略异常:如果应用Pod的
dnsPolicy不是默认的ClusterFirst,可能会直接使用节点的DNS配置,和集群CoreDNS的转发逻辑冲突。
1. 调整CoreDNS配置,添加RDS域名转发
首先查看当前CoreDNS的ConfigMap:
kubectl get configmap coredns -n kube-system -o yaml
默认配置里没有针对RDS域名的特殊转发规则,我们需要添加一段,把rds.amazonaws.com(或者你的RDS自定义域名)的请求直接转发到EKS VPC的DNS服务器(通常是VPC CIDR段的第二个IP,比如VPC网段是10.0.0.0/16,DNS就是10.0.0.2)。
修改后的CoreDNS ConfigMap大概是这样:
apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system data: Corefile: | .:53 { errors health kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf cache 30 loop reload loadbalance } # 新增:转发RDS域名到VPC DNS rds.amazonaws.com:53 { forward . 10.0.0.2 # 替换成你的EKS VPC DNS地址 cache 30 }
保存后重启CorePods让配置生效:
kubectl rollout restart deployment coredns -n kube-system
2. 确认VPC对等DNS解析双向启用
登录AWS控制台,找到你的VPC对等连接:
- 对于EKS所在的VPC(发起方),勾选「允许DNS解析从远程VPC」
- 对于RDS所在的VPC(接受方),勾选「允许DNS解析到远程VPC」
只有双向都开启,Pod才能通过RDS的域名解析到它的私有IP,而不是公网IP。
3. 验证Pod内的DNS解析
在应用Pod里直接测试RDS域名的解析结果:
kubectl exec -it <你的应用Pod名称> -- nslookup <你的RDS端点>
如果返回的是RDS的私有IP,说明DNS配置没问题;如果是公网IP,那就是转发规则没生效,回到第一步检查CoreDNS配置。
4. 检查Pod的DNS策略
查看Pod的dnsPolicy是否为默认的ClusterFirst:
kubectl describe pod <你的应用Pod名称> | grep dnsPolicy
如果是Default,Pod会直接使用节点的DNS配置,可能导致解析路径异常。可以在Pod的Deployment/YAML里显式设置dnsPolicy: ClusterFirst。
当DNS解析慢或者失败时,应用会不断尝试建立连接,很快就会把连接池占满,所以解决DNS问题后,这个超时错误大概率会自动消失。如果之后还有连接池问题,可以调整应用的连接池参数(比如增大max pool size、缩短connection timeout),但核心还是先搞定DNS解析的根本问题。
内容的提问来源于stack exchange,提问作者shrimpy

