返回部落格

Kubernetes DNS 服務:入門指南

Kubernetes DNS 服務:入門指南

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 設定,以允許更短的主機名稱:
  • 然後,容器化應用程式可以將類似 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 服務的指定連接埠建立的:

因此,得益於內建的基於 DNS 的服務發現機制,您的應用程式或微服務可以存取簡單且一致的主機名稱,以連接叢集上的其他服務或 Pod。

解析更短的主機名稱和搜尋網域

由於在 中設定的搜尋網域字尾,您並不總是需要使用整個主機名稱來存取另一個服務resolv.conf 檔案。如果您要聯絡同一個命名空間中的服務,您只需透過其名稱來呼叫它:

新增 other-service 到查詢中(如果該服務位於不同的命名空間):

如果您要存取 Pod,您至少需要使用以下內容:

只有 .svc 字尾會在預設的 中自動完成resolv.conf 檔案中。因此,必須指定設定直到 .pod。接下來,讓我們來探討我們目前所學到的兩種替代 Kubernetes DNS 實作的複雜之處。

Kubernetes DNS 實作

Kubernetes 1.11 版本提供了新的軟體來管理 kube-dns 服務,正如在前一節中所提到的。新更新背後的主要原因是要提高服務的效能和安全性。讓我們從頭開始介紹 kube-dns 整合。

  1. 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。

  1. 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 選項:

Kubernetes DNS Demo Pod Yaml

更新此設定將強制重寫 Pod 的 resolv.conf,從而使變更生效。上述設定將建立一個包含 nameserver 203.0.113.44search custom.dns.local 行的檔案,這會直接轉換為一般的 resolv.conf 選項。

結論

在本教學中,我們已帶您了解 Kubernetes DNS 服務的基本概念及其在不同版本中的實作。我們也透過範例討論了 Kubernetes DNS 記錄。此外,我們還重點介紹了一些用於自訂 Pod 和解析 DNS 查詢的其他設定選項。這涵蓋了 Kubernetes DNS 服務的基礎知識,但您的學習不應止步於此。請查看Kubernetes 官方文件 以深入探索此主題。

若要進一步提升您的 DevOps 知識並深入了解 Kubernetes 精要,請查看我們 部落格:

祝您運算愉快!

author

Pranay Kapgate

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的創意設計師,專注於透過傳統與創新行銷渠道建立一致的企業形象。他擅長將藝術願景與策略行銷相融合,創造具有影響力的品牌敘事。

留言

目前尚無留言。成為第一個留言的人吧。