浅谈kubernetes的域名解析

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 即可

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容