pod在进行域名解析时需要向CoreDns的service kube-dns转发域名解析的请求,,来完成域名解析的过程。
这个过程中有几个与NDS解析相关的重要组件:
1、CoreDNS :这是一种新的DNS服务器,旨在与Linux和Docker容器等配合使用,kubernetes中就是一个pod
2、kube-dns :coreDNS的service ,coreDnsPod地址总是发生变化,kube-dns 解决pod的服务发现与负载均衡的问题
3、kube-proxy:service clusterIp与coreDns-pod的IP映射靠kube-proxy来维护的,kube-proxy的ipvs存储服务集群IP与podIP之间的映射关系
kubernetes分集群内部域名解析和集群外部域名解析,下面就具体谈谈
一、Kubernetes 中的域名解析分析
DNS 对域名的解析,依赖容器内 resolv 文件的配置,如下
cat /etc/resolv.conf
nameserver kube-dns-ip
search devops.svc.cluster.local. svc.cluster.local. cluster.local.
ndots 5
这个文件中,配置的 DNS Server,一般就是 K8S 中,kubedns 的 Service 的 ClusterIP,这个IP是虚拟IP。所以,所有域名的解析,其实都要经过 kube-dns 的虚拟IP进行解析,不论是 Kubernetes 内部域名还是外部的域名。Kubernetes 中,域名的全称,必须是 service-name.namespace.svc.cluster.local 这种模式
1、集群内部域名解析
在 Kubernetes 中,比如服务 a 访问服务 b,对于同一个 Namespace下,可以直接在 pod 中,通过 curl b 来访问。对于跨 Namespace 的情况,服务名后接对应 Namespace即可。比如 curl b.devops。那么,这里边会有几个问题:
①:服务名是什么?②:为什么同一个 Namespace 下,直接访问服务名即可?不同 Namespace 下,需要带上 Namespace 才行?③:为什么内部的域名可以做解析,原理是什么?
service-name.namespace.svc.cluster.local 这种模式下,服务名,就是Kubernetes中 Service 的名称,所以,当我们执行下面的命令时:
curl b
必须得有一个 Service 名称为 b,这是前提。
在容器内,会根据 /etc/resolve.conf 进行解析流程。选择 nameserver kube-dns-ip 进行解析,然后,用字符串 “b”,依次带入 /etc/resolve.conf 中的 search 域,进行DNS查找,分别是:
b.devops.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local ,直到找到为止。
2、集群外部域名解析
访问外部域名走 search 域吗?得看情况,要看采用的是绝对域名解析还是非绝对域名解析,可以说,大多数情况下采用的是非绝对域名解析。
首先科普下什么是绝对域名解析和非绝对域名解析
a、非绝对域名解析:会按照 /etc/resolv.conf 中的 search 域,走一遍追加匹配,直到找到为止
b、绝对域名解析:不会追加search域而是直接进行DNS查找
那什么时候用绝对域名解析什么时候用非绝对域名解析呢?
resolv.conf文件有一个配置 ndots:
例如ndots:5
如果查询的域名包含的点“.”,不到5个,那么进行DNS查找,将使用非绝对域名
如果你查询的域名包含点数大于等于5,那么DNS查询,默认会使用绝对域名进行查询。
二、Kubernetes 中4种 DNS 策略
1、None
表示空的DNS设置
这种方式一般用于想要自定义 DNS 配置的场景,而且,往往需要和 dnsConfig 配合一起使用达到自定义 DNS 的目的。
2、Default
让 kubelet 来决定使用何种 DNS 策略。而 kubelet 默认的方式,就是使用宿主机的 /etc/resolv.conf(可能这就是有人说使用宿主机的DNS策略的方式吧),但是,kubelet 是可以灵活来配置使用什么文件来进行DNS策略的,我们完全可以使用 kubelet 的参数:–resolv-conf=/etc/resolv.conf 来决定你的DNS解析文件地址。
3、ClusterFirst
这种方式,表示 POD 内的 DNS 使用集群中配置的 DNS 服务,简单来说,就是使用 Kubernetes 中 kubedns 或 coredns 服务进行域名解析。如果解析不成功,才会使用宿主机的 DNS 配置进行解析。
4、ClusterFirstWithHostNet
在某些场景下,我们的 POD 是用 HOST 模式启动的(HOST模式,是共享宿主机网络的),一旦用 HOST 模式,表示这个 POD 中的所有容器,都要使用宿主机的 /etc/resolv.conf 配置进行DNS查询,但如果你想使用了 HOST 模式,还继续使用 Kubernetes 的DNS服务,那就将 dnsPolicy 设置为 ClusterFirstWithHostNet。
这几种DNS策略,需要在Pod,或者Deployment、RC等资源中,设置 dnsPolicy 即可