运行Azure版K8s教程时GKE无法curl访问Pod端点原因咨询
问题根因定位
你遇到的问题和CoreDNS/KubeDNS、ServiceAccount权限完全无关,由两个操作错误导致:
- 你执行
kubectl get endpoints查询的服务名是hello-world-clusterip,但你实际部署的Service名称是hello-world-customdns,名称不匹配自然无法查询到对应端点,导致PODIP变量为空,curl命令执行失败。 - Kubernetes集群内的PodIP属于集群内部私有地址段,你如果是在集群外(比如本地终端)直接访问,三层网络本身就是不通的,和服务配置无关。
补充GKE DNS说明
当前GKE 1.14及以上版本默认已使用CoreDNS作为集群DNS组件,仅非常老旧的GKE版本才默认使用KubeDNS,无论使用哪一种DNS组件,都不会影响kubectl get endpoints的查询结果,也不会影响PodIP的直接连通性,DNS组件仅负责集群内的域名解析。
提示:你当前Deployment里配置的
dnsPolicy: None和自定义nameserver只会影响该Deployment下Pod自身的DNS解析行为,不影响本次的问题排查,如果你后续需要测试集群内部服务域名解析,需要修改该配置为默认的ClusterFirst。
修复操作步骤
- 修正端点查询命令,替换为你实际创建的服务名:
export PODIP=$(kubectl get endpoints hello-world-customdns -o jsonpath='{ .subsets[].addresses[].ip}')
如果部署了多个副本,该命令会返回所有Pod的IP,你可以调整jsonpath取第一个IP即可。
- 要测试Pod端口连通性,需要在集群内部环境执行curl,推荐使用临时测试Pod的方式:
kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- curl http://$PODIP:8080
- 如果需要从本地直接访问服务,可以使用port-forward端口转发:
kubectl port-forward service/hello-world-customdns 8080:80
执行后本地访问http://127.0.0.1:8080即可获取服务响应。
内容的提问来源于stack exchange,提问作者Davtho1983
相关产品推荐
相关产品推荐

