全景剖析阿里雲容器網路資料鏈路(五):Terway ENI-Trunking

語言: CN / TW / HK

本系列文章由余凱執筆創作,聯合作者:阿里雲容器服務 謝石 對本文亦有貢獻

近幾年,企業基礎設施雲原生化的趨勢越來越強烈,從最開始的IaaS化到現在的微服務化,客戶的顆粒度精細化和可觀測性的需求更加強烈。容器網路為了滿足客戶更高效能和更高的密度,也一直在高速的發展和演進中,這必然對客戶對雲原生網路的可觀測性帶來了極高的門檻和挑戰。為了提高雲原生網路的可觀測性,同時便於客戶和前後線同學增加對業務鏈路的可讀性,ACK產研和AES聯合共建,合作開發ack net-exporter和雲原生網路資料面可觀測性系列,幫助客戶和前後線同學瞭解雲原生網路架構體系,簡化對雲原生網路的可觀測性的門檻,優化客戶運維和售後同學處理疑難問題的體驗 ,提高雲原生網路的鏈路的穩定性。

鳥瞰容器網路,整個容器網路可以分為三個部分:Pod網段,Service網段和Node網段。這三個網路要實現互聯互通和訪問控制,那麼實現的技術原理是什麼?整個鏈路又是什麼,限制又是什麼呢?Flannel, Terway有啥區別?不同模式下網路效能如何?這些,需要客戶在下搭建容器之前,就要依據自己的業務場景進行選擇,而搭建完畢後,相關的架構又是無法轉變,所以客戶需要對每種架構特點要有充分了解。比如下圖是個簡圖,Pod網路既要實現同一個ECS的Pod間的網路互通和控制,又要實現不同ECS Pod間的訪問, Pod訪問SVC 的後端可能在同一個ECS 也可能是其他ECS,這些在不同模式下,資料鏈轉發模式是不同的,從業務側表現結果也是不一樣的。

1.png

本文是[全景剖析容器網路資料鏈路]第五部分部分,主要介紹Kubernetes Terway ENI-Trunking模式下,資料面鏈路的轉轉發鏈路,一是通過了解不同場景下的資料面轉發鏈路,從而探知客戶在不同的場景下訪問結果表現的原因,幫助客戶進一步優化業務架構;另一方面,通過深入瞭解轉發鏈路,從而在遇到容器網路抖動時候,客戶運維以及阿里雲同學可以知道在哪些鏈路點進行部署觀測手動,從而進一步定界問題方向和原因。

系列一:全景剖析阿里雲容器網路資料鏈路(一)—— Flannel

系列二:全景剖析阿里雲容器網路資料鏈路(二)—— Terway ENI

系列三:全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP

系列四:全景剖析阿里雲容器網路資料鏈路(四)—— Terway IPVLAN+EBPF

系列六:全景剖析阿里雲容器網路資料鏈路(六)—— ASM Istio (To be continued)

Terway ENI-Trunking 模式架構設計

彈性網絡卡中繼Trunk ENI是一種可以繫結到專有網路VPC型別ECS例項上的虛擬網絡卡。相比彈性網絡卡ENI,Trunk ENI的例項資源密度明顯提升。啟用Terway Trunk ENI功能後,指定的Pod將使用Trunk ENI資源。為Pod開啟自定義配置是可選功能,預設情況下建立的Pod,未開啟Terway Trunk ENI功能,使用的是共享ENI上的IP地址。只有當您主動宣告為指定Pod開啟自定義配置後,相應的Pod才能使用Pod自定義配置能力,Terway才可以同時使用共享ENI以及Trunk ENI為Pod分配IP。兩種模式共享節點最大Pod數量配額,總部署密度和開啟前一致。

金融、電信,政府等行業對資料資訊保安有著非常嚴格的資料安全要求,通常,重要的核心資料會放在自建的機房內,並且對訪問此資料的客戶端有嚴格的白名單控制,通常會限制具體的IP訪問源。業務架構上雲時,往往是通過專線,VPN等打通自建機房和雲上資源打通,由於傳統容器中PodIP 是不固定的,NetworkPolicy 只能在叢集內生效,這對客戶的白名單設定有了非常大的挑戰。ENI 在 Trunk 模式下,可以配置獨立的安全組、vSwitch能力,帶來更為細化的網路配置能力,提供極具競爭力的容器網路解決方案。

2.png

在trunking的名稱空間內可以看到相關的pod資訊和節點資訊,其中pod應用的IP 的網路我們稍後會詳細說明

3.png 4.png 5.png

Pod內有隻有指向eth0的預設路由,說明Pod訪問任何地址段都是從eth0為統一的出入口

6.png

那麼Pod是如何ECS OS進行通訊呢?在OS層面,我們一看到calicxxxx的網絡卡,可以看到是附屬於eth1的,對於節點和Pod的通訊連線,這個類似於《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 ,此處不再進行過多說明。通過OS Linux Routing 我們可以看到,所有目的是 Pod IP 的流量都會被轉發到Pod對應的calico虛擬往卡上,到這裡為止,ECS OS 和Pod的網路名稱空間已經建立好完整的出入鏈路配置了。

7.png 8.png

讓我們把目光聚焦ENI Trunking本身。ENI Truning 是如何實現Pod的交換機和安全組的配置呢?Terway增加一種名為PodNetworking的自定義資源來描述網路配置。您可以建立多個PodNetworking,來規劃不同網路平面。建立PodNetworking資源後,Terway將同步網路配置資訊,只有status成為Ready後,該網路資源才能對Pod生效。如下圖所示,型別為Elastic,只要namespce的標籤的符合tryunking:zoneb, 就給pod使用指定的安全組和交換機。

9.png

建立Pod時,Pod將通過標籤去匹配PodNetworking。如果Pod沒有匹配到任何PodNetworking,則Pod將使用預設的共享ENI上的IP。如果Pod有匹配到PodNetworking,則將使用PodNetworking中定義的配置分配ENI。關於Pod標籤的相關內容,請參見標籤。

Terway會為這類Pod建立相應的名為PodENI的自定義資源,用於跟蹤Pod所使用的資源,該資源由Terway管理,您不可修改該資源。如下trunking 名稱空間下的centos-59cdc5c9c4-l5vf9 pod匹配了相應的podnetworking設定,被分配了相應的memeber ENI、對應的Trunking ENI,安全組,交換機和被繫結的ECS例項,這樣就實現了Pod維度的交換機,安全組的配置和管理。

10.png

通過ECS的控制檯,我們也可以清楚的看到memenber ENI和Trunking ENI 之間的關係,相應的安全組交換機等等資訊。

11.png 12.png

通過上面的配置,我們瞭解如何去給每個Pod單獨配置交換機,安全組等資訊,讓每個pod在通過Trunking ENI出ECS後,可以自動走到對應的配置Member ENI 上,讓這些配置生效。那麼所有的配置其實落到宿主機上都是通過相關的策略實現的,Trunking ENi網絡卡是如何知道把對應Pod的流量轉發到正確的對應的Member ENI上的呢?這其實通過的vlan來實現的。在tc層面可以看到VLAN ID。所以在egress或者ingress的階段會打上或者去除VLAN ID。

13.png

故Terway ENI-Trunking 模式總體可以歸納為:

  • 彈性網絡卡中繼Trunk ENI是一種可以繫結到專有網路VPC型別ECS例項上的虛擬網絡卡。相比彈性網絡卡ENI,Trunk ENI的例項資源密度明顯提升

  • Terway Trunk ENI支援為每個Pod配置固定IP、獨立的虛擬交換機、安全組,能提供精細化流量管理、流量隔離、網路策略配置和IP管理能力。

  • 使用Terway外掛,您需要選擇較高規格和較新型別的ECS神龍機型,即5代或者6代的8核以上機型,且機型要支援Trunk ENI。更多資訊,請參見例項規格族。

  • 單節點所支援的最大Pod數取決於該節點的彈性網絡卡(ENI)數。共享ENI支援的最大Pod數=(ECS支援的ENI數-1)×單個ENI支援的私有IP數。

  • Pod安全組規則不會應用到同節點Pod間流量及同節點上節點與Pod間流量。如果您需要限制,可以通過NetworkPolicy進行配置。

  • Pod和對應MemeberENI流量對應是通過VLAN  ID 來實現的。

Terway ENI-Trunking 模式容器網路資料鏈路剖析

可以看到由於可以實現Pod維度的安全組,交換機設定,那麼巨集觀上不同鏈路訪問必然更加趨於複雜,我們可以將Terway ENI-TRunking模式下的網路鏈路大體分為以Pod IP對外提供服務和以SVC對外提供服務兩個大的SOP場景,進一步細分,可以歸納為10個不同的小的SOP場景。

14.png

對這11個場景的資料鏈路梳理合並,這些場景可以歸納為下面10類典型的場景:

  • 通節點訪問Pod(相同or不同安全組)

  • 同節點同安全組Trunk Pod互訪(含訪問SVC IP,源端和svc後端部署在同一節點)

  • 同節點不同安全組Trunk Pod互訪(含訪問SVC IP,源端和svc後端部署在同一節點)

  • 不同節點同安全組Trunk Pod互訪

  • 不同節點不同安全組Trunk Pod互訪

  • 叢集內源端訪問SVC IP(源端和SVC後端不同節點,相同安全組,含Local模式訪問external IP)

  • 叢集內源端訪問SVC IP(源端和SVC後端不同節點,不同安全組,含Local模式訪問external IP)

  • Cluster模式下,叢集內源端訪問SVC ExternalIP(源端和SVC後端不同節點,不同安全組)

  • Cluster模式下,叢集內源端訪問SVC ExternalIP(源端和SVC後端不同節點,相同安全組)

  • 叢集外訪問SVC IP

2.1 場景一:通節點訪問Pod(相同or不同安全組)

環境

15.png

cn-hongkong.10.0.4.22 節點上存在 nginx-6f545cb57c-kt7r8和 10.0.4.30

核心路由

nginx-6f545cb57c-kt7r8  IP地址 10.0.4.30  ,該容器在宿主機表現的PID是1734171,該容器網路名稱空間有指向容器eth0的預設路由

16.png 17.png

該容器eth0在ECS OS 內是通過ipvlan隧道的方式和ECS的附屬ENI eth1建立的隧道,同時附屬ENI eth1還有個虛擬的calxxx 網絡卡

18.png 19.png

在ECS OS內,有指向Pod IP,下一跳為為calixxxx的路由,通過前文可以知道calixxx網絡卡是和每個pod內的veth1組成的pair,所以,pod內訪問SVC的CIDR會有指向veth1的路由,不會走預設的eth0路由。故:calixx網絡卡在這裡的主要作用是用於:1. 節點訪問Pod 2. 當節點或者Pod訪問 SVC的CIDR時,會走ECS OS核心協議棧轉換,走到calixxx和veth1訪問pod。

20.png

trunking 名稱空間下的nginx-6f545cb57c-kt7r8  pod匹配了相應的podnetworking設定,被分配了相應的memeber ENI、對應的Trunking ENI,安全組,交換機和被繫結的ECS例項,這樣就實現了Pod維度的交換機,安全組的配置和管理。

21.png

在tc層面可以看到VLAN ID 1027,所以資料流量在egress或者ingress的階段會打上或者去除VLAN ID。

22.png

ENI的網絡卡所屬的安全組可以看到只允許了指定的IP可以訪問nginx pod的80 埠。

23.png

置於資料面流量在OS層面的流量轉發邏輯,這個類似於《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 ,不在這裡做過多的敘述。

小結

可以訪問到目的端

24.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS的ns中命中Ip rule 被轉發1、

  • 整個請求鏈路是 ECS1  OS -> calixxxx -> ECS1 Pod1

  • 因為是通過 os核心routing轉發,不經過 member eni,所以安全組不生效,此鏈路與pod所屬的member eni的安全組無關

2.2 場景二:同節點同安全組Trunk Pod互訪(含訪問SVC IP,源端和svc後端部署在同一節點)

環境

25.png

cn-hongkong.10.0.4.22 節點上存在 nginx-6f545cb57c-kt7r8,10.0.4.30和busybox-87ff8bd74-g8zs7,10.0.4.24。

核心路由

nginx-6f545cb57c-kt7r8  IP地址 10.0.4.30  ,該容器在宿主機表現的PID是1734171,該容器網路名稱空間有指向容器eth0的預設路由

26.png 27.png

該容器eth0在ECS OS 內是通過ipvlan隧道的方式和ECS的附屬ENI eth1建立的隧道,同時附屬ENI eth1還有個虛擬的calixxxx  網絡卡

28.png 29.png

在ECS OS內,有指向Pod IP,下一跳為為calixxxx的路由,通過前文可以知道calixxx網絡卡是和每個pod內的veth1組成的pair,所以,pod內訪問SVC的CIDR會有指向veth1的路由,不會走預設的eth0路由。故:calixx網絡卡在這裡的主要作用是用於:1. 節點訪問Pod 2. 當節點或者Pod訪問 SVC的CIDR時,會走ECS OS核心協議棧轉換,走到calixxx和veth1訪問pod。

30.png

trunking 名稱空間下的busybox-87ff8bd74-g8zs7 和 nginx-6f545cb57c-kt7r8  pod匹配了相應的podnetworking設定,被分配了相應的memeber ENI、對應的Trunking ENI,安全組,交換機和被繫結的ECS例項,這樣就實現了Pod維度的交換機,安全組的配置和管理。

31.png 32.png

在tc層面可以看到VLAN ID 1027,所以資料流量在egress或者ingress的階段會打上或者去除VLAN ID。

33.png

ENI的網絡卡所屬的安全組可以看到只允許了指定的IP可以訪問nginx pod的80 埠。

34.png

置於資料面流量在OS層面的流量轉發邏輯,這個類似於《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 ,不在這裡做過多的敘述。

小結

可以訪問到目的端

35.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 整個請求鏈路是ECS1 Pod1 eth0 -> cali1xxxxxx-> cali2xxxxxx -> ECS1 Pod2 eth0

  • pod屬於 同or不同 ENI,鏈路請求是一致的,不經過ENI

  • 因為是通過 os核心 routing 轉發,不經過 member eni,所以安全組不生效,此鏈路與pod所屬的member eni的安全組無關

  • 訪問Pod IP 和訪問 SVC IP(external ipor clusterip)的區別是:

訪問SVC IP, SVC 會在源端pod eth0和calixxx網絡卡捕捉到,在目的端pod的eth0和calixxx時捕捉不到

2.3 場景三:同節點不同安全組Trunk Pod互訪(含訪問SVC IP,源端和svc後端部署在同一節點)

環境

36.png

cn-hongkong.10.0.4.244 節點上存在 nginx-96bb9b7bb-wwrdm,10.0.5.35 和centos-648f9999bc-nxb6l,10.0.5.18。

核心路由

相關的Pod的容器網路名稱空間,路由等不在進行過多描述,詳情可以見前面兩小節。

通過podeni可以看到centos-648f9999bc-nxb6l 所分配的ENI,安全組sg,交換機vsw等.

37.png

通過安全組sg-j6ccrxxxx可以看到centos 的pod可以訪問外部所有的地址

38.png

同理,可以查看出服務端Pod的nginx-96bb9b7bb-wwrdm 的安全組 sg-j6ccrze8utxxxxx 是隻允許192.168.0.0/16 可以訪問

39.png 40.png

小結

可以訪問到目的端

41.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 整個請求鏈路是ECS1 Pod1 eth0 -> cali1xxxxxx-> cali2xxxxxx -> ECS1 Pod2 eth0

  • pod屬於 同or不同 ENI,鏈路請求是一致的,不經過ENI

  • 因為是通過 os核心 routing 轉發,不經過 member eni,所以安全組不生效,此鏈路與pod所屬的member eni的安全組無關

  • 訪問Pod IP 和訪問 SVC IP(external ipor clusterip)的區別是:

訪問SVC IP, SVC 會在源端pod eth0和calixxx網絡卡捕捉到,在目的端pod的eth0和calixxx時捕捉不到

2.4 場景四:不同節點同安全組Trunk Pod互訪

環境

42.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.22  節點上存在服務端 nginx-6f545cb57c-kt7r8  和IP 10.0.4.30

核心路由

相關的Pod的容器網路名稱空間,路由等不在進行過多描述,詳情可以見前面兩小節。通過podeni可以看到centos-59cdc5c9c4-l5vf9 所分配的ENI,安全組sg,交換機vsw等.

通過安全組sg-j6cf3sxrlbuwxxxxx可以看到centos和nginx的 的pod屬於同一個安全組 sg-j6cf3sxrlbuxxxxx。

43.png 44.png

小結

是否可以訪問取決於安全組配置

45.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 出ECS後,根據要訪問的pod和該pod ENI所屬vswitch,命中VPC路由規則或者直接VSW上的二層轉發;

  • 整個請求鏈路是 ECS1 Pod1 eth0 -> cali1xxx > Trunk eni ( ECS1) -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> > Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

  • 因為是通過os核心 routing 轉發,經過 member eni,因為member eni屬於同一個安全組,所以安全組內預設是互通的

2.5 場景五:不同節點不同安全組Trunk Pod互訪

環境

46.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.244   節點上存在服務端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

核心路由

相關的Pod的容器網路名稱空間,路由等不在進行過多描述,詳情可以見前面兩小節。通過podeni可以看到centos-59cdc5c9c4-l5vf9 所分配的ENI,安全組sg,交換機vsw等。

通過安全組sg-j6cf3sxrlbuwxxxxx可以看到centos 的pod可以訪問外部所有的地址

47.png 48.png

同理,可以查看出服務端Pod的nginx-96bb9b7bb-wwrdm 的安全組 sg-j6ccrze8utxxxxx 是隻允許192.168.0.0/16 可以訪問

49.png 50.png

小結

是否可以訪問取決於安全組配置

51.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 整個請求鏈路是ECS1 Pod1 eth0 -> cali1xxx > Trunk eni ( ECS1) -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> > Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

  • 因為是通過os核心routing轉發,流量會經過member eni, 是否可以訪問成功,安全組配置對此有著決定性的作用。

2.6 場景六:叢集內源端訪問SVC IP(源端和SVC後端不同節點,相同安全組,含Local模式訪問external IP)

環境

52.png 53.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27cn-hongkong.10.0.4.22  節點上存在服務端 nginx-6f545cb57c-kt7r8  和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92  External IP是 8.210.162.178

核心路由

ENI-Trunking相比較ENIIP來說,只是在VPC側增加了對應的Truning和Member ENI,在OS內並無區別,此處可以參考《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 2.4 小節

小結

是否可以訪問取決於安全組配置

54.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 出ECS後,根據要訪問的pod和該pod ENI所屬vswitch,命中VPC路由規則或者直接VSW上的二層轉發;

  • 整個請求鏈路是

去方向:ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

回方向:ECS2 Pod1 eth0 -> Trunk eni ( ECS2) cali2 xxx -> Pod2 member eni -> vpc route rule(如有) -> Pod1 member eni -> Trunk eni ( ECS1) -> cali1xxx -> ECS1 Pod1 eth0

  • 經過ipvs規則fnat轉化, 資料包是以源pod IP 從ECS eth0 出,請求目的pod IP。(訪問SVC clusterIP,以及Local模式下訪問External IP)

  • 這個經過的ENI有 ECS1 的eth0, Pod1 member eni,Pod2 member eni。所以這三個網絡卡的安全組的配置都會影響資料鏈路的連通性

2.7 場景七:叢集內源端訪問SVC IP(源端和SVC後端不同節點,不同安全組,含Local模式訪問external IP)

環境

55.png 56.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27cn-hongkong.10.0.4.244   節點上存在服務端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

nginx 的svc的ClusterIP是 192.168.31.83  External IP是 47.243.87.204

核心路由

ENI-Trunking相比較ENIIP來說,只是在VPC側增加了對應的Truning和Member ENI,在OS內並無區別,此處可以參考《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 2.4 小節

小結

是否可以訪問取決於安全組配置

57.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 出ECS後,根據要訪問的pod和該pod ENI所屬vswitch,命中VPC路由規則或者直接VSW上的二層轉發;

  • 整個請求鏈路是

去方向:ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

回方向:ECS2 Pod1 eth0 -> Trunk eni ( ECS2) cali2 xxx -> Pod2 member eni -> vpc route rule(如有) -> Pod1 member eni -> Trunk eni ( ECS1) -> cali1xxx -> ECS1 Pod1 eth0

  • 經過ipvs規則fnat轉化, 資料包是以源pod IP 從ECS eth0 出,請求目的pod IP。(訪問SVC clusterIP,以及Local模式下訪問External IP)

  • 這個經過的ENI有 ECS1 的eth0, Pod1 member eni,Pod2 member eni。所以這三個網絡卡的安全組的配置都會影響資料鏈路的連通性。需要保證 安全組互相放通Pod和ECS的響應IP

2.8 場景八:Cluster模式下,叢集內源端訪問SVC ExternalIP(源端和SVC後端不同節點,不同安全組)

環境

58.png 59.png 60.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27cn-hongkong.10.0.4.244   節點上存在服務端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

nginx 的svc的ClusterIP是 192.168.31.83  External IP是 47.243.87.204, ExternalTrafficPolicy 是 Cluster模式

核心路由

ENI-Trunking相比較ENIIP來說,只是在VPC側增加了對應的Truning和Member ENI,在OS內並無區別,此處可以參考《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 2.5 小節

小結

是否可以訪問取決於安全組配置

61.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 出ECS後,根據要訪問的pod和該pod ENI所屬vswitch,命中VPC路由規則或者直接VSW上的二層轉發;

  • 整個請求鏈路是ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 ->  vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

  • 經過ipvs規則fnat轉化, 資料包是以源pod IP 從ECS eth0 出,請求目的pod IP。(訪問SVC clusterIP,以及Local模式下訪問External IP)

  • 這個經過的ENI有 ECS1 的eth0,Pod2 member eni。所以這兩個網絡卡的安全組的配置都會影響資料鏈路的連通性。需要保證 安全組互相放通Pod和ECS的響應IP

2.9 場景九:Cluster模式下,叢集內源端訪問SVC ExternalIP(源端和SVC後端不同節點,相同安全組)

環境

62.png 63.png 64.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27cn-hongkong.10.0.4.22  節點上存在服務端 nginx-6f545cb57c-kt7r8  和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92  External IP是 8.210.162.178 ExternalTrafficPolicy為Cluster

核心路由

ENI-Trunking相比較ENIIP來說,只是在VPC側增加了對應的Truning和Member ENI,在OS內並無區別,此處可以參考《全景剖析阿里雲容器網路資料鏈路(三)—— Terway ENIIP》 2.5 小節

小結

是否可以訪問取決於安全組配置

65.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 整個鏈路不會和請求不會經過pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被轉發

  • 出ECS後,根據要訪問的pod和該pod ENI所屬vswitch,命中VPC路由規則或者直接VSW上的二層轉發;

  • 整個請求鏈路是ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 ->  vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

  • 經過ipvs規則fnat轉化, 資料包是以源pod IP 從ECS eth0 出,請求目的pod IP。(訪問SVC clusterIP,以及Local模式下訪問External IP)

  • 這個經過的ENI有 ECS1 的eth0,Pod2 member eni。所以這兩個網絡卡的安全組的配置都會影響資料鏈路的連通性。需要保證 安全組互相放通Pod和ECS的響應IP

2.10 場景十:叢集外訪問SVC IP

環境

66.png 67.png 68.png

cn-hongkong.10.0.4.20 節點上存在客戶端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27cn-hongkong.10.0.4.22  節點上存在服務端 nginx-6f545cb57c-kt7r8  和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92  External IP是 8.210.162.178 ExternalTrafficPolicy為Cluster

SLB相關配置

在SLB控制檯,可以看到 lb-j6cmv8aaojf7nqdai2a6a 虛擬伺服器組的後端伺服器組是兩個後端nginx pod 的的ENI eni-j6cgrqqrtvcwhhcyuc28, eni-j6c54tyfku5855euh3db 和 eni-j6cf7e4qnfx22mmvblj0,這幾個ENI 都是member ENI

69.png 70.png

小結

是否可以訪問取決於安全組配置

71.png

資料鏈路轉發示意圖

  • 會經過calicao網絡卡,每個非hostnetwork的pod會和calicao網絡卡形成veth pair,用於和其他pod或node進行通訊

  • 資料鏈路:client ->  SLB  -> Pod Member ENI + Pod Port  -> Trunking ENI ->  ECS1 Pod1 eth0

  • ExternalTrafficPolicy 為Local或Cluster模式下, SLB只會將 pod分配的member ENI掛在到SLB的虛擬伺服器組

  • SLB轉發請求只會轉發到目標member ENI上,然後通過vlan傳送到Trunk ENI,再由Trunk ENI 轉發到 POD

總結

本篇文章主要聚焦ACK 在Terway ENI-Trunking模式下,不同SOP場景下的資料鏈路轉發路徑。伴隨著客戶對業務網路的更精細化的管理需求,引入了Pod維度交換機和安全組配置設定,在Terway ENI-Trunking模式下,一共可以分為10個SOP場景,並對這些場景技術實現原理,雲產品配置等一一梳理並總結,這對我們遇到Terway ENI-Trunking架構下的鏈路抖動、最優化配置,鏈路原理等提供了初步指引方向。在Terway ENI-Trunking模式下,利用veth pair來聯通宿主機和pod的網路空間,pod的地址是來源於彈性網絡卡的輔助IP地址,並且節點上需要配置策略路由來保證輔助IP的流量經過它所屬的彈性網絡卡,通過此種方式可以實現ENI多Pod共享,大大提升了Pod的部署密度,同時利用tc egress/ingress 在資料流輸入ECS時候,打上或者去除VLAN tag,以便實現資料流量能真正的走到屬於他的Member ENI網絡卡,從而實現精細化的管理。目前微服務越來越盛行,採用sidecar的方式,讓每個pod都可以成為一個網路節點,從而實現pod中不同的流量實現不同的網路行為和可觀測性,下一系列我們將進入到Terway ENIIP模式的全景解析最後一章——《全景剖析阿里雲容器網路資料鏈路(六)—— ASM Istio》。