#作者:鄧偉
文章目錄
- 一、Kubernetes 網絡模型概述
- 二、iptables 基礎知識
- 三、Kubernetes 中的 iptables 應用
- 四、查看和調試 iptables 規則
- 五、總結
在 Kubernetes 集群中,iptables 是一個核心組件, 用于實現服務發現和網絡策略。iptables 通過一系列規則來控制數據包在網絡中的流向,確保集群內部的服務能夠正確地路由到相應的 Pods。本文將深入探討 Kubernetes 中 iptables 的工作原理、配置方式及其重要性。
一、Kubernetes 網絡模型概述
在 Kubernetes 中,每個 Pod 都被分配了一個獨立的 IP 地址,并且這些 Pod 可以直接相互通信,而不需要進行 NAT 轉換。為了支持這一模型,Kubernetes 使用了多種網絡插件(如 Calico、Flannel 等)來管理網絡,同時利用 iptables 來實現服務發現和服務負載均衡。
如 calico架構圖:
二、iptables 基礎知識
iptables 是 Linux 內核提供的一個用戶空間工具,用于設置、維護和檢查 IP 包過濾規則表。它主要包括以下幾條鏈:
a.INPUT:處理目標是本機的數據包。
b.OUTPUT:處理從本機發出的數據包。
c.FORWARD:處理需要經過本機轉發的數據包。
d.PREROUTING:在路由之前處理數據包。
e.POSTROUTING:在路由之后處理數據包。
每條鏈都包含若干規則,當數據包到達時會依次匹配這些規則。如果某條規則匹配成功,則執行該規則指定的動作(如 ACCEPT、DROP、REDIRECT 等)。
如圖:
三、Kubernetes 中的 iptables 應用
- Service 和 ClusterIP
Kubernetes 中的 Service 提供了一種簡單的方式來訪問一組提供相同服務的 Pods。ClusterIP 類型的 Service 為后端 Pods 分配了一個虛擬 IP 地址(VIP),并使用 iptables 規則將流量導向實際的 Pods。
例如,假設有一個名為 my-service 的 Service,其 VIP 是 10.96.0.1,則會在節點上添加如下類似的 iptables 規則:
-A KUBE-SERVICES -d 10.96.0.1/32 -p tcp -m comment --comment "default/my-service: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3
這條規則表示所有發往 10.96.0.1:80 的 TCP 流量都會被重定向到 KUBE-SVC-NWV5X2332I4OT4T3 這個自定義鏈中進一步處理。實際場景如圖:
- Endpoint 和 DNAT
接下來,在對應的 KUBE-SVC-NWV5X2332I4OT4T3 鏈中,iptables 會根據權重隨機選擇一個 Endpoint(即具體的 Pod IP),并通過 DNAT(Destination Network Address Translation)將其轉換為目標 Pod 的 IP 地址:
-A KUBE-SVC-NWV5X2332I4OT4T3 -m statistic --mode random --probability 0.5000000000 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -j KUBE-SEP-X3P2623AGDHZCBTG
這里,KUBE-SEP-WNBA2IHDGP2BOBGZ 和 KUBE-SEP-X3P2623AGDHZCBTG 分別代表兩個不同的 Endpoint,iptables 會以 50% 的概率選擇其中一個作為目標地址。
- NodePort 和 ExternalTrafficPolicy
對于 NodePort 類型的 Service,除了上述 ClusterIP 的規則外,還會增加額外的規則以便從外部訪問。此外,如果設置了 ExternalTrafficPolicy: Local,iptables 將只允許本地運行的 Pods 接收來自外部的流量,避免跨節點轉發帶來的性能損耗。
四、查看和調試 iptables 規則
你可以使用以下命令查看當前節點上的 iptables 規則:
iptables-save | grep KUBE
或者針對特定鏈進行查看:
iptables -t nat -L KUBE-SERVICES
若遇到問題,可以借助 tcpdump 等工具抓包分析,結合 iptables 日志(需開啟相關選項)定位故障原因。
五、總結
iptables 在 Kubernetes 中扮演著至關重要的角色,它不僅實現了基本的服務發現功能,還支持復雜的網絡策略控制。理解 iptables 的工作機制有助于我們更好地管理和優化 Kubernetes 集群的網絡環境。隨著 Kubernetes 不斷演進,CNI 插件和其他網絡解決方案也在不斷改進,但 iptables 依然是理解和操作 Kubernetes 網絡不可或缺的知識點。