AWS Lambda同VPC下无法通过DNS访问EKS集群服务问题排查
问题解答
能否通过Lambda访问EKS服务?是否必须用负载均衡器?
可以直接访问,不需要使用负载均衡器。负载均衡器是对外暴露服务的方案,同VPC内的资源可直接通过集群内部的Service地址访问,只需配置正确的DNS解析或直接使用IP。
问题根源:DNS解析失败
Lambda无法解析my-service.cluster-name.svc.cluster.local的核心原因是:
- EKS集群的内部域名(
svc.cluster.local域)仅由集群内的CoreDNS服务负责解析,而Lambda所在VPC默认使用AWS Route 53 Resolver作为DNS服务器,该Resolver没有EKS内部域名的解析记录。 - 集群内Pod能正常解析是因为它们的DNS配置默认指向了CoreDNS的ClusterIP(通常是
10.xx.0.10),而Lambda没有这个配置。
遗漏的配置及解决方法
以下是几种可行的解决方案,按生产实用性排序:
1. 配置VPC DNS条件转发到EKS CoreDNS(推荐生产环境)
这是最可靠的方案,让VPC的DNS服务器将EKS内部域名的查询转发到CoreDNS:
- 步骤1:获取CoreDNS的ClusterIP
在EKS集群内执行命令:
记录输出中的kubectl get svc kube-dns -n kube-systemCLUSTER-IP(例如10.100.0.10)。 - 步骤2:创建Route 53 Resolver条件转发规则
- 进入AWS控制台的Route 53服务,选择「Resolver」→「规则」→「创建规则」。
- 规则类型选择「转发」,域名填写你的EKS内部域(比如
cluster-name.svc.cluster.local,或更泛的svc.cluster.local)。 - 目标DNS服务器填写刚才获取的CoreDNS ClusterIP,若有多个CoreDNS实例可添加多个。
- 选择Lambda所在的VPC,完成创建。
- 步骤3:验证安全组连通性
确保:- Lambda的安全组允许出站访问到EKS Pod CIDR段的53/UDP、53/TCP(DNS)和80/TCP端口。
- EKS节点或CoreDNS Pod的安全组允许来自Lambda安全组的53端口访问。
2. 直接使用Service的ClusterIP访问(测试/临时场景)
跳过DNS解析,直接用Service的ClusterIP调用:
- 先获取Service的ClusterIP:
kubectl get svc my-service - 修改Lambda的请求地址为
http://<service-cluster-ip>/api/list。
缺点:如果Service重启或重建导致ClusterIP变化,需要手动更新Lambda代码。
3. 调整Lambda的DNS配置(不推荐生产)
修改Lambda的容器DNS配置,将DNS服务器指向CoreDNS的ClusterIP。但Lambda本身不支持直接配置DNS服务器,需通过自定义运行时或容器镜像实现,维护成本高,不推荐用于生产环境。
额外检查项
- 确认Lambda所在的私有子网路由表包含指向EKS Pod CIDR段的路由(通常由EKS VPC CNI自动配置,或通过节点的路由表),确保Lambda能访问到CoreDNS的Pod。
- 确认VPC的「DNS解析」和「DNS主机名」选项已开启(VPC控制台→编辑DNS属性),否则VPC内的资源无法正常使用DNS服务。
内容的提问来源于stack exchange,提问作者Erwan Charollet
相关产品推荐
相关产品推荐

