前言
上一篇《葉工好容2-云原生網(wǎng)絡(luò)》介紹了容器中的虛擬化網(wǎng)絡(luò),從底層講解了容器中的網(wǎng)絡(luò)是如何實(shí)現(xiàn)的。但虛擬化只解決了網(wǎng)絡(luò)上尋址的問(wèn)題,只能定位到IP,但成千上萬(wàn)個(gè)動(dòng)態(tài)的IP對(duì)于我們直接使用是沒(méi)有任何意義的,我們必須借助有意義的“標(biāo)識(shí)”信息做一次到IP的映射才可以,而常用的“標(biāo)識(shí)”就是域名。
DNS in linux
linux中影響域名轉(zhuǎn)發(fā)的常用配置文件有3個(gè),我們把它們稱作etc三兄弟,首先得搞懂它們?nèi)值艿年P(guān)系:
/etc/hosts,本地域名解析配置,域名與目的IP都維護(hù)在文件中。
/etc/resolv.conf,DNS服務(wù)器配置,定義DNS服務(wù)器的IP地址、本地域名、定義域名的搜索列表、對(duì)返回的域名進(jìn)行排序
/etc/host.conf 指定主機(jī)名查詢方式,也就是上面哥倆的管理員,出于性能考慮,一般是先走本地再走DNS。
所以/etc/host.conf是老大,他制定游戲規(guī)則; /etc/hosts是二哥,默認(rèn)他說(shuō)了算;/etc/resolv.conf是老三,話語(yǔ)權(quán)最小,但一般場(chǎng)景下干活最多的就是老三。
/etc/resolv.conf中會(huì)出現(xiàn)nameserver 127.0.0.1,那是因?yàn)樵跈C(jī)器上有運(yùn)行dnsmasq。
dnsmasq可以作為DNS轉(zhuǎn)發(fā)器,dnsmasq接收Client的DNS查詢請(qǐng)求,并回復(fù)DNS查詢結(jié)果。查詢的結(jié)果可以來(lái)自本地緩存和公共DNS服務(wù)器,如果本地緩存沒(méi)有記錄,dnsmasq會(huì)將請(qǐng)求轉(zhuǎn)發(fā)到公共的DNS服務(wù)器,并將公共的DNS解析的結(jié)果回復(fù)到請(qǐng)求的設(shè)備。
所以在機(jī)器上引入dnsmasq,是為了提高DNS服務(wù)的穩(wěn)定性,一旦網(wǎng)絡(luò)有問(wèn)題可以通過(guò)本地緩存,代價(jià)就是主機(jī)上多安裝一個(gè)東西。
DNS in k8s
k8s里跑業(yè)務(wù)的容器本質(zhì)還是運(yùn)行在linux中的,所以k8s中的dns和linux中的dns本質(zhì)上是一樣的,它們只有2個(gè)區(qū)別
區(qū)別1:k8s中pod和其所在的node都有dns映射,類似個(gè)套娃;非k8s的linux只需要考慮自己的dns。
區(qū)別2:非k8s之間只需要單純的域名調(diào)用,而k8s中還需要考慮集群內(nèi)通過(guò)k8s標(biāo)識(shí)的服務(wù)互通問(wèn)題。
k8s的DNS策略:
1、ClusterFirst:優(yōu)先使用集群內(nèi)的dns服務(wù)(kubeDNS、coreDNS),找不到的話再使用宿主機(jī)的dns服務(wù)。
2、ClusterFirstWithHostNet:宿主機(jī)與集群DNS服務(wù)共存模式,兩者都能用,但需要將hostNetwork打開(kāi)
3、Default:讓kubelet決定pod使用哪種DNS服務(wù),默認(rèn)使用宿主機(jī)的 /etc/resolv.conf 來(lái)進(jìn)行解析。
4、None:不使用集群的DNS,pod只聽(tīng)dnsConfig文件的描述,該內(nèi)容在創(chuàng)建pod時(shí)手動(dòng)設(shè)置
在k8s中,一個(gè)Pod如果要訪問(wèn)相同同 Namespace 下的 Service(比如 book-service),那么只需要 curl book-service。如果 Pod 和 Service 不在同一域名下,那么就需要在 Service Name 之后添加上 Service 所在的 Namespace(比如 beijing1),curl book-service.beijing1。是因?yàn)樵贑lusterFirst策略下,pod的/etc/resolv.conf中配置了集群DNS service的地址。所以,在該 Pod 內(nèi)請(qǐng)求的所有的域名解析都需要經(jīng)過(guò) DNS Service 進(jìn)行解析,不管是集群內(nèi)部域名還是外部域名。
k8s中/etc/resolv.conf,這里注意ndots的配置,地址中點(diǎn)號(hào)小于該配置被認(rèn)為是相對(duì)域名,按search順序查找,反之被認(rèn)為是絕對(duì)域名。ndots的大小是性能與便捷的平衡。
我們?cè)?jīng)有個(gè)案例,為了加速pod向集群外部域名訪問(wèn),將ndots默認(rèn)值5顯性的改成了2
dnsConfig:
options:
- name: ndots
value: "2"
DNS框架選擇
kubeDNS和coreDNS都是k8s中DNS服務(wù)器的可選方案,coreDNS除開(kāi)集群內(nèi)域名解析速率稍慢與kubeDNS,其它方面都更優(yōu)秀,也是k8s 1.9 版本后的默認(rèn)的 dns 解析文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-522594.html
通常用CoreDNS,運(yùn)行在master上,本質(zhì)是每個(gè)service都對(duì)應(yīng)一個(gè)clusterIP,pod通過(guò)service訪問(wèn)時(shí)會(huì)自動(dòng)拼接域名${service}.svc.<cluster_domain>,master中有這個(gè)域名到clusterIP的映射。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-522594.html
到了這里,關(guān)于葉工好容3-云原生DNS解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!