Kubernetes Pod DNS 配置
一、概述
Kubernetes 提供多种 DNS 策略(dnsPolicy
),同时 kubelet 参数也影响最终的 DNS 行为。
二、dnsPolicy 策略说明
dnsPolicy | 含义说明 |
---|---|
Default | 使用宿主机的 DNS 配置(kubelet 的 --resolv-conf ) |
ClusterFirst | 优先使用集群 DNS(如 CoreDNS),仅在无法解析时退回宿主机 DNS(默认策略) |
ClusterFirstWithHostNet | 与 ClusterFirst 类似,但适用于 hostNetwork: true 的 Pod,需要显式设置 |
None | 不自动配置 DNS,需用户通过 dnsConfig 自定义 |
三、kubelet 与 DNS 的关系
Kubelet 决定了 Pod 的 DNS 配置来源:
kubelet 参数 | 含义 |
---|---|
--cluster-dns=<IP> | 指定 CoreDNS 的 ClusterIP,供 ClusterFirst* 策略使用 |
--cluster-domain | 设置集群内服务搜索域(默认是 cluster.local ) |
--resolv-conf=<file> | 指定当 dnsPolicy: Default 时使用的宿主机 DNS 配置(默认是 /etc/resolv.conf ) |
kubelet 构造行为:
dnsPolicy | /etc/resolv.conf 来源 |
---|---|
Default | 拷贝 --resolv-conf 文件 |
ClusterFirst | 使用 --cluster-dns + --cluster-domain 构造 |
ClusterFirstWithHostNet | 同上,但用于 hostNetwork: true 的场景 |
None + dnsConfig | 用户手动定义 |
四、ndots 配置解释
在 /etc/resolv.conf
中常见如下配置:
options ndots:5
含义:
如果一个域名中
.
的数量 < ndots,则认为它是 不完整的域名,需要加上search
域后再尝试解析。
举例:
-
配置:
search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5
-
执行
ping my-service
,尝试解析的顺序为:my-service.default.svc.cluster.local my-service.svc.cluster.local my-service.cluster.local
注意事项:
-
ndots
值大时,公网域名解析会多次失败(浪费时间) -
访问公网域名建议写为
curl www.google.com.
(末尾加.
)
五、特殊场景说明
1. Pod 使用 hostNetwork: true
时 DNS 问题
-
默认降级为
dnsPolicy: Default
,即使用宿主机 DNS,可能无法解析*.svc.cluster.local
-
解决方案:
hostNetwork: true dnsPolicy: ClusterFirstWithHostNet
强制构造 Pod 的 DNS 为集群 DNS
六、实用排查命令
-
查看 Pod 实际 DNS 配置:
kubectl exec <pod> -- cat /etc/resolv.conf
-
查看 CoreDNS 是否正常:
kubectl get svc -n kube-system kube-dns kubectl logs -n kube-system -l k8s-app=kube-dns
-
验证域名解析是否正确:
kubectl exec <pod> -- nslookup my-service.default.svc.cluster.local
七、最佳实践建议
场景 | 建议配置 |
---|---|
常规集群服务解析 | 默认使用 ClusterFirst |
边车 / Agent 使用 hostNetwork | 使用 ClusterFirstWithHostNet |
容器只需访问公网(不需要访问 Service) | 可以用 dnsPolicy: Default |
完全自定义 DNS 配置 | 设置 dnsPolicy: None 并配置 dnsConfig |
八、配置示例
示例:hostNetwork + 使用集群 DNS
apiVersion: v1
kind: Pod
metadata:name: example
spec:hostNetwork: truednsPolicy: ClusterFirstWithHostNetcontainers:- name: nginximage: nginx
九、参考链接
-
Kubernetes 官方文档:DNS for Services and Pods | Kubernetes
-
CoreDNS 文档:CoreDNS: DNS and Service Discovery