Azure Kubernetes通过VPN访问集群Pod内部DNS主机名失败求助
解决方案:Azure VPN客户端访问AKS内部Service DNS问题
核心问题诊断
当前问题源于两个关键错误:
- CoreDNS配置逻辑错误:使用
Corefile.override完全替换了默认CoreDNS配置,移除了负责解析AKS内部cluster.local域名的kubernetes插件,导致集群Service的DNS记录无法被解析。 - VPN客户端DNS指向缺失:即使CoreDNS配置正确,VPN客户端未指向AKS内部DNS服务器,无法获取集群域名解析结果。
分步解决
1. 修复CoreDNS自定义配置
不要使用Corefile.override(会覆盖默认的集群域名解析规则),改用Corefile.custom仅追加外部域名转发规则,保留AKS原生的内部域名解析能力:
apiVersion: v1 kind: ConfigMap metadata: name: coredns-custom namespace: kube-system data: Corefile.custom: | # 仅转发非集群内部的域名到VNet解析器 .:53 { forward . <你的VNet解析器IP> { cache 30 loop reload loadbalance } }
应用配置后重启CoreDNS Pod生效:
kubectl rollout restart deployment coredns -n kube-system
2. 配置VPN客户端的DNS服务器
修改Azure VPN Gateway的点到站点VPN配置,将DNS服务器设置为AKS集群的CoreDNS服务IP(可通过以下命令获取):
kubectl get svc kube-dns -n kube-system
VPN客户端连接后会自动获取该DNS地址,从而能解析*.cluster.local域名。
3. 验证网络连通性
确保VPN客户端能访问AKS的Service/Pod CIDR:
- 检查VNet与AKS子网的路由表,确认无流量阻止规则。
- 若AKS启用了网络策略,需添加允许VPN客户端IP范围访问目标Service端口的规则。
- 先尝试ping Service的ClusterIP,若能通则网络正常,问题仅在DNS;若不通则排查路由/防火墙。
4. 进阶:Azure私有DNS托管集群域名(可选)
若需跨VNet访问AKS内部域名,可创建名为cluster.local的私有DNS区域并关联到AKS所在VNet,再配置CoreDNS的azure插件将集群Service/Pod记录同步到该区域。
验证操作
- 连接VPN后执行
nslookup ubuntu-1.default.svc.cluster.local,确认能解析到Service的ClusterIP。 - 执行
ping ubuntu-1.default.svc.cluster.local或访问对应端口,验证连通性。
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

