Kubernetes Headless Service & StatefulSet
1. 现象
- Service 类型为 Headless(
clusterIP: None
) - Endpoint 已列出所有 Pod IP
- Pod 状态 Ready 1/1
- 但仍无法解析
web-0.nginx.default.svc.cluster.local
2. 根因
CoreDNS 默认 不会 为每个 Pod 生成
<pod-name>.<svc-name>.<ns>.svc.cluster.local
记录,除非显式开启 endpoint_pod_names
插件。
3. 启用步骤
-
查看当前配置
kubectl -n kube-system get cm coredns -o yaml | grep -A5 endpoints
若没有
endpoint_pod_names
字样即未开启。 -
编辑 ConfigMap
kubectl -n kube-system edit cm coredns
-
在
kubernetes
插件段增加一行
修改前kubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpa }
修改后
kubernetes cluster.local in-addr.arpa ip6.arpa {endpoint_pod_names # ← 新增pods insecurefallthrough in-addr.arpa ip6.arpa }
-
重启 CoreDNS 使配置生效
kubectl -n kube-system rollout restart deployment/coredns
-
验证单 Pod 域名
kubectl run tmp --image=busybox:1.28 -it --rm -- \nslookup web-0.nginx.default.svc.cluster.local
应返回 web-0 对应 Pod IP。
4. 结果
查询域名 | 返回内容 | 条件 |
---|---|---|
nginx.default.svc.cluster.local |
全部 Pod IP 列表 | 默认支持 |
web-0.nginx.default.svc.cluster.local |
单个 Pod IP | 需 endpoint_pod_names |
5. 一句话总结
“Headless + StatefulSet 拼对域名却 NXDOMAIN” → 100% 缺
endpoint_pod_names
;
给 CoreDNS 加上它、重启,单 Pod DNS 立即生效。