理解 Kubernetes 的服務網路(Service Network)是理解和用好 Kubernetes 的關鍵,目前業界講解 Kubernetes 服務網路的資料不少,包括官方文件和其他網路資料,但是真正講解底層實現原理的資料卻很少,這使得很多人對 Kubernetes 的服務網路只是知其然,卻不知其所以然,達不到生產級應用的要求。
Kube-Proxy是實現服務網路關鍵底層元件。Service Descovery,包括Service到Pod的轉化路由,還有外部流量接入內部的Service,都是透過Kube-Proxy間接實現的。
接下來將深入剖析Kube-Proxy內部工作原理,這裡先從四個基礎的概念講起:
代理(Proxy)服務發現NetfliterIptables有了這些基礎概念鋪墊,接下來重點講解Kube-Proxy的三種工作模式:
使用者空間代理模式Iptables模式IPVS模式分析他們的內部實現機制,流程和優劣。
四個基礎概念1.代理(Proxy)所謂的代理伺服器,通常指的是在服務提供者和客戶請求之間引入的一箇中間角色。常見的代理有兩種:
前向代理(forward proxy)反向代理(reverse proxy)1.1前向代理
它是放置在企業網路的邊界上,可以讓企業內部人員統一、集中的去訪問外網。這樣不必為每個人員單獨設定外網連結,節省資源,還可以集中進行安全審計等功能。
這裡的箭頭指向企業外部的,網際網路在這裡是位於前面,所以叫前向代理。
1.2反向代理
反向代理指的是企業的外部客戶集中訪問企業內部的應用和服務。
我們知道企業內部應用和服務是比較多的,如果每個都對外暴露,一方面有安全問題,另外一方面需要申請很多的公網域名和IP等資源。
透過引入反向代理,可以遮蔽企業內部服務的複雜性,讓外部看到的是一個簡單單一的入口。
反向代理可以把外部訪問路由到內部各個具體的應用和服務,這個術語叫反向路由。同時反向代理還可以實現,安全監控,日誌記錄,限流熔斷等功能。
反向代理還有一種稱謂叫閘道器(gateway)。
注意這裡的箭頭的統一指向企業內部,表示這個代理是對向的統一入口,和前向代理剛好相反。
2.服務發現Kube-Proxy在K8S中扮演的是反向代理的角色,它主要實現服務發現和負載均衡兩大功能。
一般的反向代理會將流量路由到主機上,但是Kube-Proxy則是將流量路由到Pod上。更具體的講就是把ClusterIP轉化到PodIP。
它更加接近代理中的主機獨立程序代理,因為K8S會在每個Worker節點上都部署一個Kube-Proxy。
接下來我們進一步深入思考:K8S是如何將服務的ClusterIP轉化到具體的PodIP,並且將流量轉化到具體的Pod上的?實際上Kube-Proxy是間接透過Linux核心提供的兩種技術Netfliter和Iptables來實現IP地址轉化和路由的,他倆都是Linux核心底層的細節比較複雜,這裡不做太多延生。
3.NetfliterNetfliter是Linux核心支援的一種鉤子方法(Hook),它允許核心其他模組註冊各種回撥方法,這些回撥方法可以截獲網路包,並且可以改變他們的目的地和路由。
4.Iptables它是使用者空間程式,透過它可以去設定Netfilter的路由規則,該程式可以檢查,修改,轉發,重定向或者丟棄IP網路包。換句話說,Iptables是Netfilter使用者空間的介面。Kube-Proxy透過Iptables可以間接地操作Netfilter裡頭的路由規則。
該圖簡化展示了使用者空間當中的Iptables,核心當中的Netfilter以及底層硬體網絡卡之間的層次關係。使用者程式,比如Kube-Proxy可以透過使用者空間的Iptables去操作核心當中的Netfilter的路由規則,而Netfilter可以截獲底層的IP網路包,並修改他們的路由。