淺談kubernetes的域名解析

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容