Kubernetes DNS服務簡介
Kubernetes DNS服務簡介
ofollow,noindex" target="_blank">原文
介紹
域名系統(DNS)是一種用於將各種型別的資訊(例如IP地址)與易於記憶的名稱相關聯的系統。 預設情況下,大多數Kubernetes群集會自動配置內部DNS服務,以便為服務發現提供輕量級機制。 內建的服務發現使應用程式更容易在Kubernetes叢集上相互查詢和通訊,即使在節點之間建立,刪除和移動pod和服務時也是如此。
最近版本的Kubernetes中Kubernetes DNS服務的實現細節已經改變。 在本文中,我們將介紹Kubernetes DNS服務的kube-dns和CoreDNS幾個不同的實現版本。 我們一起來看看它們的運作方式以及Kubernetes生成的DNS記錄。
如果你想在開始之前就更全面地瞭解DNS,請閱讀“DNS術語,元件和概念簡介 ”。 對於您可能不熟悉的任何Kubernetes主題,您可以閱讀“Kubernetes簡介 。”
Kubernetes DNS服務提供什麼?
在Kubernetes版本1.11之前,Kubernetes DNS服務基於kube-dns。 1.11版引入了CoreDNS來解決kube-dns的一些安全性和穩定性問題。
無論處理實際DNS記錄的軟體如何,兩種實現都以類似的方式工作:
- 建立名為kube-dns的服務和一個或多個pod。
- kube-dns服務監聽來自Kubernetes API的服務service和端點endpoint事件,並根據需要更新其DNS記錄。 建立,更新或刪除Kubernetes服務及其關聯的pod時會觸發這些事件。
- kubelet將每個新pod的/etc/resolv.conf名稱伺服器選項設定為kube-dns服務的叢集IP,並使用適當的搜尋選項以允許使用更短的主機名:
resolve.conf
nameserver 10.32.0.10 search namespace.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- 然後,在容器中執行的應用程式可以將主機名(例如example-service.namespace)解析為正確的群集IP地址。
Kubernetes DNS記錄示例
Kubernetes服務的完整DNS A記錄類似於以下示例:
service.namespace.svc.cluster.local
一個pod會有這種格式的記錄,反映了pod的實際IP地址:
10.32.0.125.namespace.pod.cluster.local
此外,為Kubernetes服務的命名埠建立SRV記錄:
_port-name._protocol.service.namespace.svc.cluster.local
所有這些的結果是內建的,基於DNS的服務發現機制,您的應用程式或微服務可以在其中定位一個簡單一致的主機名,並可以訪問群集上的其他服務或pod。
搜尋域和解析較短的主機名
由於resolv.conf
檔案中列出了搜尋域字尾,所以您通常不需要使用完整主機名來訪問其他服務。 如果要在同一名稱空間中定址其它服務,則只需使用服務名稱即可:
other-service
如果服務位於不同的名稱空間中,請將其新增:
other-service.other-namespace
如果您要定位pod,則至少需要像以下所示使用:
pod-ip.other-namespace.pod
正如我們在預設的resolv.conf檔案中看到的那樣,只有.svc字尾會自動完成,因此請確保指定.pod之前的所有內容。
現在我們已經瞭解了Kubernetes DNS服務的實際用途,讓我們來看看兩個不同實現的一些細節。
Kubernetes DNS實現細節
如上一節所述,Kubernetes 1.11版引入了處理kube-dns服務的新版本CoreDNS。 這樣做的動機是提高服務的效能和安全性。 我們先來看看原始的kube-dns實現。
kube-dns
Kubernetes 1.11之前的kube-dns服務由在kube-system名稱空間中的kube-dns pod中執行的三個容器組成。 這三個容器是:
- kube-dns:執行SkyDNS的容器,用於執行DNS查詢解析
- dnsmasq:流行的輕量級DNS解析器和快取,用於快取SkyDNS的響應
- sidecar:一個sidecar容器,用於處理指標報告並響應服務的執行狀況檢查
Dnsmasq中的安全漏洞以及SkyDNS的擴充套件效能問題導致了被CoreDNS所替換。
CoreDNS
從Kubernetes 1.11開始,新的Kubernetes DNS服務,CoreDNS已升級為GA。 這意味著它已準備好用於生產,並且將成為許多安裝工具和託管Kubernetes提供商的預設叢集DNS服務。
CoreDNS,用Go編寫且單一程序,它涵蓋了以前系統的所有功能: 單個容器解析並快取DNS查詢,響應執行狀況檢查並提供指標。
除了解決與效能和安全相關的問題之外,CoreDNS還修復了一些其他小錯誤並添加了一些新功能:
- 修復了使用stubDomains和外部服務之間不相容的一些問題
- CoreDNS可以通過隨機化返回某些記錄的順序來增強基於DNS的round-robin負載平衡
- autopath功能可以在解析外部主機名時提高DNS響應時間,方法是更好地遍歷resolv.conf中列出的每個搜尋域字尾
- 如果使用kube-dns的話,10.32.0.125.namespace.pod.cluster.local將始終解析為10.32.0.125,即使pod實際上不存在。 CoreDNS具有“已驗證的pod”模式,只有當存在具有正確IP且位於右側名稱空間的pod時,才會成功解析。
有關CoreDNS及其與kube-dns的不同之處的更多資訊,您可以閱讀Kubernetes CoreDNS GA公告 。
其他配置選項
kubernetes運營商通常希望自定義其pod和容器如何解析某些自定義域,或者需要調整上游名稱伺服器或搜尋resolv.conf中配置的域字尾。 您可以使用pod規範的dnsConfig選項執行此操作:
example_pod.yaml
yaml apiVersion: v1 kind: Pod metadata: namespace: example name: custom-dns spec: containers: - name: example image: nginx dnsPolicy: "None" dnsConfig: nameservers: - 203.0.113.44 searches: - custom.dns.local
更新此配置將重寫pod的resolv.conf以啟用更改。 配置直接對映到標準的resolv.conf選項,因此上面的配置將新增nameserver 203.0.113.44
和search custom.dns.local
這幾行。
結論
在本文中,我們介紹了Kubernetes DNS為開發人員提供了哪些服務的基礎知識,展示了service和pod的一些DNS記錄示例,討論了不同的Kubernetes版本上的不同實現,並突出顯示了一些可用於自定義pod解析DNS查詢的其他配置選項。