kubernetes - day17

September 7, 2020

POD 並非有持久性,可能出於各種原因重新調度 POD,像是失敗的 livenessreadiness 檢查,如果此時與 POD 通訊會怎樣?當 POD 重啟時,可能具有不同的 IP 地址。這就是為什麼有 Service 的資源,Service 用於為 POD 提供一個固定、統一的存取功能和負載均衡,同時在集群內部使用 DNS 實現服務發現,解決客戶端發現容器的問題。ServicePOD 的 IP 只在 Kubernetes 集群内相互存取,無法直接干預外部流量的請求。而 Kubernetes 提供了一些方法像是 hostPorthostNetworkNodePortLoadBalancer 等,而另一種 Ingress 則是資源第七層的均衡負載。Service 藉由規則去定義策略,最重要的是還是會藉由標籤去實現。

Service 資源

上述描述的問題,是編排系統可能會遇到的問題。當 POD 在做伸縮的應用時或是重新調度,都有可能影響 IP,這會導致客戶端存取資源時會錯誤。為了解決此問題 kubernetes 提供了 Service 資源。前面也提到說 Service 還是會藉由標籤去實作,如下圖所示,同時 Service 也隱藏了真實處裡用戶請求的 POD。下圖的標籤選擇器有多個符合的後端,這會讓 Service 可以用負載均衡方式進行調度的處裡。

Service 會提供給 POD 的存取等級,這取決於服務的類型,當前有三種類型:

詳細可參考官網。實際上 Service 並非直接與 POD 通訊,其之間還有叫 Endpoints 的資源,它是由 IP 地址和 Port 组成的,Service 會擁有這個資源是透過標籤選擇器匹配的 POD 取得,這部分 K8s 幫我們自動實現了。

虛擬 IP 和 Service 代理

一個 Service 資源其實就是每個節點上的 Iptablesipvs 規則,將到達 Service 的流量轉發至相對應的 Endpoints。而這如何將規則創建至 Iptablesipvs 上呢?這就是 kube-proxy 的作用了,它會不斷監聽 API Server 中紀錄 Service 對應 POD 的資訊。

kube-proxy 將請求代理到相對應的 Endpoints 有三種方式,描述是官方內容

詳細的內容可參考官方解釋。