Coredns 解析流程:
1、K8s集群内部服务解析-----》直接请求 coredns 服务ip;
K8s 集群以外的域名解析-------》会coredns configmap中找到forward配置或proxy配置的上游dns ip-----》如果没有proxy配置,只有forward转发的/etc/resolv.conf这个配置里有记录,不过并没有看到明确dns ip地址,这句意思是转发到pod内部的/etc/resolv.conf配置文件,即:解析不到的域名会在pod中的/etc/resolv.conf中寻找解析的dns(如下图)-------》而coredns的po又无法进入查看,我们可以docker inspect coredns容器id看看能否发现线索------》会发现有一行挂载路径是/var/lib/container/**container id**/resolv.conf的文件,cat这行文件其实就是宿主机的resolv.conf------》我们顺着container id,docker ps | grep 以下会发现这个id是coredns的POD volume,这里有一个概念,在k8s里pod和POD会共享数据卷和网络,所以这个文件也是coredns容器内部的解析配置,docker在启动容器时会将容器宿主机上resolv.conf配置加载到容器内部,这也是为什么配置文件里看不到挂载本地resolv.conf文件的原因-----》所以forward . /etc/resolv.conf这个配置可以理解为,找不到的域名解析最终会请求到容器所在的宿主机resolv.conf配置里,如果宿主机里也没有的话,那这条记录就解析失败了
这里有两个注意点:
busybox镜像不建议做nslookup 测试域名,或者若用就用2022-10-30后的最新版,旧版本存在解析失败的bug
如果启动coredns后想暂时停止dns外部域名解析:注释pod所在宿主机的resolv.conf中的记录没用,因为配置已经被加载到容器中,并且不会像 coredns的configmap中的配置那样被热加载。
描述的有点糙,有不对的地方请交流。