天天看點

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

作者:Mattias te Wierik

翻譯:Bach(才雲)

校對:星空下的文仔(才雲)、bot(才雲)

在 Kubernetes 叢集中,Service 是将運作在一組 Pods 上的應用程式公開為網絡服務的抽象方法。Service 可以充當服務發現機制,使我們能輕松地和上遊 Pod 通信,而無需知道各個 Pod 的确切 IP 位址。

在某些情況下,我們想檢索并連接配接到特定 Service 所有 Pod 的 IP 位址。當 Pod 是有狀态的(例如已部署的資料庫)時,各個 Pod 需要與其同屬執行個體進行通信。在這種情況下,Pod 如果想知道哪些其他成員是資料庫叢集的一部分時,Headless Service 可以派上用場。

什麼是 Headless Service?

部署 Service時,可以設定三種不同的

ServiceTypes

以指定所需的 Service 類型:

  • ClusterIP:僅在叢集内部 ip 位址上公開 Service,這也是預設的

    ServiceType

  • NodePort:允許通過節點上的靜态端口公開 Service。
  • LoadBalancer:允許使用雲提供商的外部負載均衡器公開 Service 。

為避免請求在單個 IP 位址後面進行負載均衡,當不需要單個 IP 位址時,我們可以通過指定 Cluster IP(

spec.clusterIP

)的值為

"None"

來建立 Headless Service。Kubernetes 不會為該 Service 配置設定任何 IP 位址。這種 Service 就稱為 Headless Services。

DNS 解析和 Headless Service

部署 Service 時,Kubernetes 會為其配置設定一個 DNS 名稱。叢集中的其他元件可以使用此名稱與 DNS 和上遊 Pod 通信。DNS 名稱遵循以下命名約定:

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

在 IP 位址上使用可讀名稱後,其他元件就不需要配置設定給 Service 實際 IP 位址。使用正确的 Pod 選擇(selector)配置 Headless Service 時,Kubernetes 将為上遊標明的 Pod 建立正确端點記錄和 DNS 配置。

對于将連接配接到 Headless Service 的每個已連接配接 Pod,也會配置 A 或 AAAA 記錄。這樣就可以對 Headless Service 執行 DNS 查詢,以解析所連接配接 Pod 的所有 IP 位址。

如何實踐?

假設存在以下問題:Kubernetes 叢集中運作着一組有狀态的三個 MongoDB Pod。這三個 Pod 共同構成一個 MongoDB 副本集,這是一個高度可用的資料集。

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

為了能夠将控制台應用程式連接配接到 MongoDB 副本集,我們使用 MongoDB C# 驅動程式,同時需要顯式定義三個 Pod 的位址。

我們用 Headless Service 解決這個問題。假定 MongoDb Pod 都帶有

app=mongodb

标簽,該标簽可以在 Headless Service 中用于選擇 Pod。我們定義的 Headless Service 資源如下所示:

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

通過将

clusterIp

設定為

"none"

,我們告訴 Kubernetes 将此 Service 視為 Headless Service。由于我們定義了名稱和命名空間,是以可以推斷出 DNS 名稱。我們在叢集内部使用

mongodb-headless-service.infrastructure.svc.cluster.local

mongodb-headless-service.infrastructure

作為位址與 Service 進行通信。

接下來讓我們來執行 DNS 查詢,以檢索連接配接 Pod 的 IP 位址。

Dns.GetHostAddresses

方法位于

System.Net

命名空間中,可幫助我們執行該 DNS 查詢并傳回 IP 位址數組。它需要一個主機名或 IP 位址。最後,我們可以使用 MongoDB 建立連接配接字元串(connection string)。代碼如下:

dns提供商主機名_在 Kubernetes 中使用 DNS 和 Headless Service 發現運作中的 Pod

通過該解決方案,我們可以動态建立連接配接字元串,其主要優點是,在必須擴充資料庫叢集時,我們不必手動更改連接配接字元串。

注意:MongoDB 确實通過 DNS 實作了類似的服務發現過程,隻需定義 Headless Service 的 DNS 名稱即可,這樣我們就不必自己生成連接配接字元串。

原文連結:

在 Kubernetess 中使用 DNS 和 Headless Service 發現運作中的 Pod​mp.weixin.qq.com