POD 並非有持久性,可能出於各種原因重新調度 POD,像是失敗的 liveness 或 readiness 檢查,如果此時與 POD 通訊會怎樣?當 POD 重啟時,可能具有不同的 IP 地址。這就是為什麼有 Service 的資源,Service 用於為 POD 提供一個固定、統一的存取功能和負載均衡,同時在集群內部使用 DNS 實現服務發現,解決客戶端發現容器的問題。Service 和 POD 的 IP 只在 Kubernetes 集群内相互存取,無法直接干預外部流量的請求。而 Kubernetes 提供了一些方法像是 hostPort、hostNetwork、NodePort 或 LoadBalancer 等,而另一種 Ingress 則是資源第七層的均衡負載。Service 藉由規則去定義策略,最重要的是還是會藉由標籤去實現。
Service 資源
上述描述的問題,是編排系統可能會遇到的問題。當 POD 在做伸縮的應用時或是重新調度,都有可能影響 IP,這會導致客戶端存取資源時會錯誤。為了解決此問題 kubernetes 提供了 Service 資源。前面也提到說 Service 還是會藉由標籤去實作,如下圖所示,同時 Service 也隱藏了真實處裡用戶請求的 POD。下圖的標籤選擇器有多個符合的後端,這會讓 Service 可以用負載均衡方式進行調度的處裡。

Service 會提供給 POD 的存取等級,這取決於服務的類型,當前有三種類型:
- ClusterIP
- 屬於集群內部,只有集群內部的資源可相互存取,默認選項
- NodePort
- 為節點提供一個可訪問的 IP 與 Port
- LoadBalancer
- 從雲提供商添加負載均衡器,將流量從服務轉發到服務中的節點
詳細可參考官網。實際上 Service 並非直接與 POD 通訊,其之間還有叫 Endpoints 的資源,它是由 IP 地址和 Port 组成的,Service 會擁有這個資源是透過標籤選擇器匹配的 POD 取得,這部分 K8s 幫我們自動實現了。
虛擬 IP 和 Service 代理
一個 Service 資源其實就是每個節點上的 Iptables 或 ipvs 規則,將到達 Service 的流量轉發至相對應的 Endpoints。而這如何將規則創建至 Iptables 或 ipvs 上呢?這就是 kube-proxy 的作用了,它會不斷監聽 API Server 中紀錄 Service 對應 POD 的資訊。
kube-proxy 將請求代理到相對應的 Endpoints 有三種方式,描述是官方內容
- userspace
- 多了用戶空間和內核空間之間切換
- iptables
- 使用
iptables處理流量具有較低的系統開銷,因為流量由 Linuxnetfilter處理,而無需在用戶空間和內核空間之間切換。這種方法也可能更可靠
- 使用
- ipvs
- 與
iptables模式下的kube-proxy相比,IPVS模式下的kube-proxy重定向通訊的延遲要短,並且在同步代理規則時具有更好的性能。與其他代理模式相比,IPVS模式還支持更高的網路流量吞吐量。
- 與
詳細的內容可參考官方解釋。