Kubernetes,也稱為 K8s,是一個開源的 編排系統,用於自動化部署、擴充和管理容器化應用程式。它的可移植性、靈活性和自動擴充能力使其成為一個被廣泛使用的系統。在所有突出的功能中,為服務和 Pod 建立 DNS 記錄的選項使其在其他軟體系統中脫穎而出。Kubernetes DNS 服務允許您使用一致的 DNS 名稱而不是 IP 地址來聯絡服務。
先決條件
為了充分利用本教學並更好地理解 Kubernetes DNS 服務,請確保您已溫習 Kubernetes 的基礎知識。閱讀 DNS 術語、組件和概念概述 也將有助於您更好地理解 DNS 概念。此外,Docker 生態系統概述 和 容器化技術的基礎知識 將會帶來極大的優勢。
什麼是 DNS 系統?
網域名稱系統 (DNS) 是一種將各種資訊與易於記憶的名稱(例如 IP 地址)連結起來的機制。使用 DNS 系統將請求名稱轉換為 IP 地址,使終端用戶能夠輕鬆到達其目標網域名稱。大多數 Kubernetes 叢集都包含一個預設配置的內部 DNS 服務,以提供輕量級的服務發現方法。即使在節點之間建立、刪除或轉移 Pod 和服務時,內建的服務發現也能簡化應用程式以識別 Kubernetes 叢集並與之進行通訊。
在 最近版本的 Kubernetes 中,Kubernetes DNS 服務的技術細節已發生變化。本教學旨在介紹 Kubernetes DNS 服務的 kube-dns 和 CoreDNS 實現。我們將詳細了解 Kubernetes DNS 記錄,並演示 Kubernetes DNS 的工作原理。
Kubernetes DNS 服務中包含什麼?
以前,在 1.11 版本發布之前,Kubernetes DNS 服務是基於 kube-dns 的。然而,安全和隱私仍然是一個嚴重的問題。後來,Kubernetes 社群在新的 1.11 版本中引入了 CoreDNS,以解決 kube-dns 的安全和穩定性問題。
無論您使用哪個軟體版本來處理 DNS 記錄,kube-dns 和 CoreDNS 的運作方式都類似:
- 會建立一個 kube-dns 服務以及一個或多個 Pod。
- The kube-dns 服務會監控 Kubernetes API 的服務和端點事件,並酌情更改其 DNS 條目。當您透過建立、編輯或刪除操作修改這些 Kubernetes 服務及其相關 Pod 時,這些事件會自動觸發。
- Kubelet 會將 kube-dns 服務的叢集 IP 分配給每個新 Pod 的 etc/resolv.conf nameserver 選項,以及合適的 search 設定,以允許更短的主機名稱:
|
1 2 3 |
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 記錄。Kubernetes 服務的完整 DNS A 記錄將如下所示:
service.namespace.svc.cluster.local
Pod 將具有此格式的記錄,這將代表 Pod’s 的真實 IP 地址:
10.32.0.125.namespace.pod.cluster.local
此外,會為 SRV 記錄是為 Kubernetes 服務的指定連接埠建立的:
|
1 |
_port-name._protocol.service.namespace.svc.cluster.local |
因此,得益於內建的基於 DNS 的服務發現機制,您的應用程式或微服務可以存取簡單且一致的主機名稱,以連接叢集上的其他服務或 Pod。
解析更短的主機名稱和搜尋網域
由於在 中設定的搜尋網域字尾,您並不總是需要使用整個主機名稱來存取另一個服務resolv.conf 檔案。如果您要聯絡同一個命名空間中的服務,您只需透過其名稱來呼叫它:
|
1 |
other-service |
新增 other-service 到查詢中(如果該服務位於不同的命名空間):
|
1 |
other-service.other-namespace |
如果您要存取 Pod,您至少需要使用以下內容:
|
1 |
pod-ip.other-namespace.pod |
只有 .svc 字尾會在預設的 中自動完成resolv.conf 檔案中。因此,必須指定設定直到 .pod。接下來,讓我們來探討我們目前所學到的兩種替代 Kubernetes DNS 實作的複雜之處。
Kubernetes DNS 實作
Kubernetes 1.11 版本提供了新的軟體來管理 kube-dns 服務,正如在前一節中所提到的。新更新背後的主要原因是要提高服務的效能和安全性。讓我們從頭開始介紹 kube-dns 整合。
-
kube-dns
在之前的 Kubernetes 1.11 版本中, kube-dns 服務在 kube-dns Pod 中運行三個容器,該 Pod 位於 kube-system 命名空間中。請看以下三個容器:
- kube-dns:運行 SkyDNS 並作為 DNS 查詢解析服務運作的容器。
- dnsmasq:SkyDNS 的回覆由 dnsmasq(一種常見的輕量級 DNS 解析器和快取)進行快取。
- sidecar:服務旁的容器,負責執行指標報告並對健康檢查做出回應。
由於 Dnsmasq 的安全性漏洞以及 SkyDNS 的擴充性效能問題,因而建立了 CoreDNS。
-
CoreDNS
作為新的 Kubernetes DNS 服務,CoreDNS 已在 Kubernetes 1.11 中升級為正式版(General Availability)。這意味著它已準備好用於生產環境,並將被許多安裝工具和託管 Kubernetes 提供商用作預設的叢集 DNS 服務。
CoreDNS 是一個靈活且可擴充的 DNS 伺服器,可作為 Kubernetes DNS 叢集。它執行了先前系統的所有功能。DNS 容器負責解析和快取 DNS 查詢。CoreDNS 在單個容器中回應健康檢查並提供指標。此外,它還解決了一些微小的缺陷,並提供了新的功能來解決效能和安全性問題:
- 已解決 stubDomains 的使用與外部服務之間的一些衝突。
- 透過隨機化某些條目的返回順序,CoreDNS 可以改善基於 DNS 的 輪詢負載平衡.
- 透過更有效地逐一查看在 中定義的每個搜尋網域字尾,resolv.conf,一個名為 autopath 的功能可以在解析外部主機名稱時提高 DNS 回應時間。
- 即使 Pod 不存在,kube-dns 10.32.0.125.namespace.pod.cluster.local 仍會始終解析為 10.32.0.125。CoreDNS 提供了 Pod 驗證模式,只有在具有正確 IP 地址和命名空間的 Pod 存在時才會進行解析。
若要進一步了解有關 Kubernetes endpoints, autopaths 以及 wildcards 的知識,請參閱關於 如何 Kubernetes啟用從其叢集讀取區域資料 的教學課程。
自訂功能
得益於 Kubernetes 的 自訂 DNS 服務,管理員可以利用這些服務來更改在 中定義的上游名稱伺服器或搜尋網域字尾。resolv.conf。最重要的是,還有一個附加功能,可以使用 dnsConfig 選項:

更新此設定將強制重寫 Pod 的 resolv.conf,從而使變更生效。上述設定將建立一個包含 nameserver 203.0.113.44 和 search custom.dns.local 行的檔案,這會直接轉換為一般的 resolv.conf 選項。
結論
在本教學中,我們已帶您了解 Kubernetes DNS 服務的基本概念及其在不同版本中的實作。我們也透過範例討論了 Kubernetes DNS 記錄。此外,我們還重點介紹了一些用於自訂 Pod 和解析 DNS 查詢的其他設定選項。這涵蓋了 Kubernetes DNS 服務的基礎知識,但您的學習不應止步於此。請查看Kubernetes 官方文件 以深入探索此主題。
若要進一步提升您的 DevOps 知識並深入了解 Kubernetes 精要,請查看我們 部落格:
- Helm 簡介:Kubernetes 的套件管理器
- 如何在 Ubuntu 20.04 上安裝與使用 Kubernetes
- 在含有 Ubuntu 18.04 的 Kubernetes 叢集上部署 PHP 應用程式
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。