KubeDNS #
在 Linux 系统中,/etc/resolv.conf 是存储 DNS 服务器的文件, 普通 Pod 的 /etc/resolv.conf 文件应该存储的是 kube-dns 的 Service IP。
nameserver 10.99.0.2 # 这里存储的是 kube-dns 的 Service IP
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5
如何进入 kube-dns 容器进行抓包 #
DNS 容器往往不具备 bash,所以不能通过 docker exec 或者 kubectl exec 的方式进入容器抓包。
docker inspect --format "{{.State.Pid}}" dns_container_id
# 进入 container 的 network namespace
nsenter -n -t pid
# 对 53 端口进行抓包
tcpdump -i eth0 -N udp dst port 53
dnsPolicy #
ClusterFirst
(默认)
#
优先使用 kubedns
或者 coredns
进行域名解析。
如果解析不成功,才会使用宿主机的 DNS 配置进行解析。
ClusterFirstWithHostNet #
当一个 Pod 以 HOST 模式(和宿主机共享网络,hostNetwork: true
)启动时,这个 POD 中的所有容器都会使用宿主机的 /etc/resolv.conf 配置进行 DNS 查询。
但是如果在 Pod 中仍然还想继续使用 k8s 集群 的 DNS 服务时,就需要将 dnsPolicy 设置为 ClusterFirstWithHostNet。
Default #
让 kubelet 来决定 Pod 内的 DNS 使用哪种 DNS 策略。
kubelet 的默认方式,其实就是使用宿主机的 /etc/resolv.conf 来进行解析。
你可以通过设置 kubelet 的启动参数, --resolv-conf=/etc/resolv.conf
来决定该 DNS 服务使用的解析文件的地址
当我们部署集群 DNS 服务的时候,一般就需要将 dnsPolicy 设置成 Default,
而并非使用默认值 ClusterFirst
,否则该 DNS 服务的上游解析地址会变成它自身的 Service 的 ClusterIP(我解析我自己),导致域名无法解析。
None #
不会使用集群和宿主机的 DNS 策略,而是和 dnsConfig
配合一起使用,来自定义 DNS 配置,否则在提交修改时报错。
kube-dns 组成 #
kubedns #
依赖 client-go 中的 informer 机制监视 k8s 中的 Service 和 Endpoint 的变化,并将这些结构维护进内存来服务内部 DNS 解析请求。
dnsmasq #
区分 Domain 是集群内部还是外部,给外部域名提供上游解析,内部域名发往 10053 端口,并将解析结果缓存,提高解析效率。
sidecar #
对 kubedns 和 dnsmasq 进行健康检查和收集监控指标。
如何调试 DNS 解析 #
参考 k8smeetup:调试 DNS 解析
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。