我正在學習 Kubernetes 的無頭服務。
我毫無疑問地理解以下內容(如果我錯了,請糾正我):
- 無頭服務沒有集群 IP,
- 它用于與有狀態的應用程式通信
- 當客戶端應用程式容器/pod 通過無頭服務與資料庫 pod 通信時,將回傳 pod IP 地址而不是服務的 IP 地址。
我不太確定:
- 在我看來,互聯網上許多解釋無頭服務的文章都含糊其辭。因為我發現的只是直接說明:
如果您不需要負載均衡但想直接連接到 pod(例如資料庫),您可以使用無頭服務
但這究竟是什么意思?
因此,以下是我對 k8s 中無頭服務的想法以及兩個問題的示例
假設我在一個服務后面有 3 個 PostgreSQL 資料庫實體的副本,如果它是一個常規服務,我知道默認情況下對資料庫的請求將以回圈方式路由到三個資料庫 pod 之一。這確實是負載平衡。
問題一:
如果改用無頭服務,上面參考的陳述句是否意味著無頭服務將堅持三個資料庫 pod 之一,在 pod 死亡之前永遠不會改變?我問這個是因為如果不堅持使用三個 pod 之一,它仍然會進行負載平衡。有人可以澄清一下嗎?
問題2:
我覺得不管是常規服務還是無頭服務,客戶端應用程式只需要知道服務的DNS名稱就可以與k8s集群中的資料庫進行通信。不是這樣嗎?我的意思是使用無頭服務有什么意義呢?對我來說,只有當客戶端應用程式代碼真的需要知道它連接的 Pod 的 IP 地址時,無頭服務才有意義。因此,只要客戶端應用程式不需要知道 IP 地址,它就可以通過常規服務或無頭服務通過集群中的服務 DNS 名稱與資料庫進行通信,我在這里嗎?
uj5u.com熱心網友回復:
普通服務帶有負載均衡器(即使它是 ClusterIP 型別的服務)。該負載均衡器有一個 IP 地址。服務的集群內 DNS 名稱決議為負載均衡器的 IP 地址,然后轉發到選定的 Pod。
無頭服務沒有負載均衡器。Service 的 DNS 名稱決議為 Pod 本身的 IP 地址。
這意味著,對于無頭服務,基本上一切都取決于呼叫者。如果呼叫者進行 DNS 查找,選擇它給出的第一個地址,并在行程的生命周期內使用該地址,那么它不會在支持 Pod 之間回圈請求,并且它不會注意到該 Pod 是否消失。對于普通服務,只要呼叫者獲得服務(集群內部負載均衡器)的 IP 地址,這些問題就會自動處理。
除了 StatefulSet 需要將無頭服務作為其配置的一部分外,無頭服務并不專門與有狀態作業負載相關聯。一個單獨的 StatefulSet Pod 實際上將被賦予一個連接到該無頭服務的唯一主機名。不過,您可以讓普通服務和無頭服務都指向同一個 Pod,并且在您不關心(最初)聯系哪個副本的情況下,使用普通服務可能是有意義的。
uj5u.com熱心網友回復:
無頭服務將回傳通過選擇器關聯的所有Pod IP。順序并不穩定,因此如果客戶端重復 DNS 查詢并且只使用第一個回傳的 IP,這也會導致某種負載平衡。
關于你的第二個問題:這是正確的。一般來說,如果客戶端不需要知道所有實體并處理不穩定的 IP,那么常規服務會提供更多好處。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446653.html
標籤:Kubernetes Kubernetes-pod Kubernetes 服务
上一篇:GCP-獲取專案NATGW
