pod在進(jìn)行域名解析時(shí)需要向CoreDns的service kube-dns轉(zhuǎn)發(fā)域名解析的請(qǐng)求,,來(lái)完成域名解析的過(guò)程。
這個(gè)過(guò)程中有幾個(gè)與NDS解析相關(guān)的重要組件:
1、CoreDNS :這是一種新的DNS服務(wù)器,旨在與Linux和Docker容器等配合使用,kubernetes中就是一個(gè)pod
2、kube-dns :coreDNS的service ,coreDnsPod地址總是發(fā)生變化,kube-dns 解決pod的服務(wù)發(fā)現(xiàn)與負(fù)載均衡的問(wèn)題
3、kube-proxy:service clusterIp與coreDns-pod的IP映射靠kube-proxy來(lái)維護(hù)的,kube-proxy的ipvs存儲(chǔ)服務(wù)集群IP與podIP之間的映射關(guān)系
kubernetes分集群內(nèi)部域名解析和集群外部域名解析,下面就具體談?wù)?/p>
一、Kubernetes 中的域名解析分析
DNS 對(duì)域名的解析,依賴(lài)容器內(nèi) resolv 文件的配置,如下
cat /etc/resolv.conf
nameserver kube-dns-ip
search devops.svc.cluster.local. svc.cluster.local. cluster.local.
ndots 5
這個(gè)文件中,配置的 DNS Server,一般就是 K8S 中,kubedns 的 Service 的 ClusterIP,這個(gè)IP是虛擬IP。所以,所有域名的解析,其實(shí)都要經(jīng)過(guò) kube-dns 的虛擬IP進(jìn)行解析,不論是 Kubernetes 內(nèi)部域名還是外部的域名。Kubernetes 中,域名的全稱(chēng),必須是 service-name.namespace.svc.cluster.local 這種模式
1、集群內(nèi)部域名解析
在 Kubernetes 中,比如服務(wù) a 訪(fǎng)問(wèn)服務(wù) b,對(duì)于同一個(gè) Namespace下,可以直接在 pod 中,通過(guò) curl b 來(lái)訪(fǎng)問(wèn)。對(duì)于跨 Namespace 的情況,服務(wù)名后接對(duì)應(yīng) Namespace即可。比如 curl b.devops。那么,這里邊會(huì)有幾個(gè)問(wèn)題:
①:服務(wù)名是什么?②:為什么同一個(gè) Namespace 下,直接訪(fǎng)問(wèn)服務(wù)名即可?不同 Namespace 下,需要帶上 Namespace 才行?③:為什么內(nèi)部的域名可以做解析,原理是什么?
service-name.namespace.svc.cluster.local 這種模式下,服務(wù)名,就是Kubernetes中 Service 的名稱(chēng),所以,當(dāng)我們執(zhí)行下面的命令時(shí):
curl b
必須得有一個(gè) Service 名稱(chēng)為 b,這是前提。
在容器內(nèi),會(huì)根據(jù) /etc/resolve.conf 進(jìn)行解析流程。選擇 nameserver? kube-dns-ip 進(jìn)行解析,然后,用字符串 “b”,依次帶入 /etc/resolve.conf 中的 search 域,進(jìn)行DNS查找,分別是:
b.devops.svc.cluster.local -> b.svc.cluster.local -> b.cluster.local ,直到找到為止。
2、集群外部域名解析
訪(fǎng)問(wèn)外部域名走 search 域嗎?得看情況,要看采用的是絕對(duì)域名解析還是非絕對(duì)域名解析,可以說(shuō),大多數(shù)情況下采用的是非絕對(duì)域名解析。
首先科普下什么是絕對(duì)域名解析和非絕對(duì)域名解析
a、非絕對(duì)域名解析:會(huì)按照 /etc/resolv.conf 中的 search 域,走一遍追加匹配,直到找到為止
b、絕對(duì)域名解析:不會(huì)追加search域而是直接進(jìn)行DNS查找
那什么時(shí)候用絕對(duì)域名解析什么時(shí)候用非絕對(duì)域名解析呢?
resolv.conf文件有一個(gè)配置 ndots:
例如ndots:5
如果查詢(xún)的域名包含的點(diǎn)“.”,不到5個(gè),那么進(jìn)行DNS查找,將使用非絕對(duì)域名
如果你查詢(xún)的域名包含點(diǎn)數(shù)大于等于5,那么DNS查詢(xún),默認(rèn)會(huì)使用絕對(duì)域名進(jìn)行查詢(xún)。
二、Kubernetes 中4種 DNS 策略
1、None
表示空的DNS設(shè)置
這種方式一般用于想要自定義 DNS 配置的場(chǎng)景,而且,往往需要和 dnsConfig 配合一起使用達(dá)到自定義 DNS 的目的。
2、Default
讓 kubelet 來(lái)決定使用何種 DNS 策略。而 kubelet 默認(rèn)的方式,就是使用宿主機(jī)的 /etc/resolv.conf(可能這就是有人說(shuō)使用宿主機(jī)的DNS策略的方式吧),但是,kubelet 是可以靈活來(lái)配置使用什么文件來(lái)進(jìn)行DNS策略的,我們完全可以使用 kubelet 的參數(shù):–resolv-conf=/etc/resolv.conf 來(lái)決定你的DNS解析文件地址。
3、ClusterFirst
這種方式,表示 POD 內(nèi)的 DNS 使用集群中配置的 DNS 服務(wù),簡(jiǎn)單來(lái)說(shuō),就是使用 Kubernetes 中 kubedns 或 coredns 服務(wù)進(jìn)行域名解析。如果解析不成功,才會(huì)使用宿主機(jī)的 DNS 配置進(jìn)行解析。
4、ClusterFirstWithHostNet
在某些場(chǎng)景下,我們的 POD 是用 HOST 模式啟動(dòng)的(HOST模式,是共享宿主機(jī)網(wǎng)絡(luò)的),一旦用 HOST 模式,表示這個(gè) POD 中的所有容器,都要使用宿主機(jī)的 /etc/resolv.conf 配置進(jìn)行DNS查詢(xún),但如果你想使用了 HOST 模式,還繼續(xù)使用 Kubernetes 的DNS服務(wù),那就將 dnsPolicy 設(shè)置為 ClusterFirstWithHostNet。
這幾種DNS策略,需要在Pod,或者Deployment、RC等資源中,設(shè)置 dnsPolicy 即可