首頁>技術>

理解 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.Netfliter

  Netfliter是Linux核心支援的一種鉤子方法(Hook),它允許核心其他模組註冊各種回撥方法,這些回撥方法可以截獲網路包,並且可以改變他們的目的地和路由。

4.Iptables

  它是使用者空間程式,透過它可以去設定Netfilter的路由規則,該程式可以檢查,修改,轉發,重定向或者丟棄IP網路包。換句話說,Iptables是Netfilter使用者空間的介面。Kube-Proxy透過Iptables可以間接地操作Netfilter裡頭的路由規則。

  該圖簡化展示了使用者空間當中的Iptables,核心當中的Netfilter以及底層硬體網絡卡之間的層次關係。使用者程式,比如Kube-Proxy可以透過使用者空間的Iptables去操作核心當中的Netfilter的路由規則,而Netfilter可以截獲底層的IP網路包,並修改他們的路由。

6
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python基本概念和基本資料型別