KubeDNS

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 解析


本文访问量

本站总访问量

本站总访客数 人次