Kubernetes網絡是Kubernetes中一個核心概念。簡而言之,Kubernetes網絡模型可以確定叢集上所有Kubernetes pod都能進行通信。此外,在Kubernetes網絡模型的基礎上,Kubernetes還有其他核心概念,即Kubernetes Services和Kubernetes Ingress。
本文将使用系統模型的方法探索Kubernetes網絡。我們将開發一個簡單的模型來了解容器與容器間的通信以及Pod之間的通信。
毫無疑問,網絡是一個極為廣泛且複雜的領域,它需要多年的理論積累以及實踐才能精通。在本文中,我們将在概念層面對網絡進行梳理,暫時不涉及實作層面的細節。

理想的網絡模型
上圖将網絡描述為Network Graph,該網絡由一組節點以及節點之間的連結組成。如果當且僅當節點之間存在聯系時,一個節點才可以與另一個節點交換資訊。
消息交換架構
一個節點,即源節點,通過将消息放入目标的輸入隊列,與另一個節點,即目标交換消息。消息交換由源節點觀察到的Send Event,Send·M和在目标節點觀察到的相應的Receive Event,Recv·M表示。
消息交換行為
網絡中的節點要麼是Process,要麼是Switch。Process會産生和消耗消息,Switch根據其轉發資訊庫(FIB)處理消息。
S1和S2的轉發資訊庫(FIB)
上圖描述了Switch的轉發資訊庫(FIB)S1和S2。在收到消息時,每台Switch都會查詢其轉發資訊庫,以決定是發送(deliver)、轉發(forward)還是丢棄(discard)該消息。
Switch:
将資訊的請求頭,即源位址、源端口、目标位址和目标端口與其轉發資訊庫相比對、 執行相關操作,預設為棄置(discard)
Kubernetes網絡模型是一個描述性的網絡模型,也就是說,任何滿足Kubernetes網絡模型規範的網絡都是Kubernetes網絡。
然而,Kubernetes并沒有規定如何實作網絡模型。事實上,現在市面上有許多替代的實作,稱為網絡插件。
本節将用一組關于消息交換的限制條件來描述Kubernetes網絡模型。
限制條件:網絡可尋址實體
Kubernetes網絡模型定義了3個可尋址實體:K8S pod、K8S 節點以及K8S Service,每個實體都會配置設定到一個不同的IP位址。
然而,網絡模型不對這些IP位址做任何進一步的聲明。例如,Kubernetes網絡模型不對從這些IP位址中提取的IP位址空間做任何進一步的聲明。
限制條件:容器間通信
Kubernetes網絡模型要求在Pod P上下文中執行的容器C1可以通過localhost與在P上下文中執行的其他容器C2進行通信。
限制條件:Pod到Pod
Kubernetes網絡模型要求在Pod P1上下文中執行的容器C1可以通過P2的位址與在P2上下文中執行的其他容器C2進行通信。
限制條件:Process到Pod
Kubernetes網絡模型要求托管在節點N上的一個Process,稱為Daemon D,可以通過P的位址與托管在N上的Pod P上下文中執行的任何容器C進行通信。 K8s-Node(N) ∧ K8s-Daemon(D) ∧ K8s-Pod(P) ∧ K8s-
本節用Kubernetes Network Graph這個理想的模型來描述Kubernetes網絡模型。
下圖描述了本節内容中的用例:Kubernetes叢集K1由2個節點組成。每個節點托管2個Pod。每個Pod執行2個容器,一個容器監聽8080端口,一個容器監聽9090端口。此外,每個節點托管1個Daemon。
我們可以将Kubernetes叢集網絡模組化為一個具有一組節點和一組連結的Graph。
節點
每個K8S容器C映射到網絡Process C
每個Daemon D映射到網絡Process C
每個K8s Pod P映射到網絡Switch P, Pod的Switch
每個K8S節點N 映射到網絡 Switch N,節點的Switch:
連結
每個容器C會被連結到其Pod Switch P
每個Daemon D會被連結到其節點Switch N
每個Pod Switch P會被連結到其節點Switch N
每個節點Switch N1會被連結到其他各節點Switch N2
在Pod Switch的轉發資訊庫
P2的轉發資訊庫
在節點Switch的轉發資訊庫
轉發資訊庫 N2
Node to Pod Forwarding Rule K8s-Node(N) ∧ K8s-Pod(P): host(N, P) ∧ addr(P, a) ⟹ [* * a * Forward(P)] in FIB[N]
Node to Node Forwalding Rule K8s-Node(N₁) ∧ K8s-Node(N₂) ∧ K8s-Pod(P): N₁ ≠ N₂ ∧ host(N₂, P) ∧ addr(P, a) ⟹ [* * a * Forward(N₂)] in FIB[N₁]
本節将通過一些例子,按照Kubernetes叢集網絡K1中的消息生命(Life of a Message)來進行講解。
容器到容器
容器C1.1需要與容器C1.2進行通信:
C1.1在P1的上下文中執行
C1.2在P1的上下文中執行
C₁.₁通過127.0.0.1:9090到C₁.₂
節點内Pod到Pod通信
容器C 1.1需要與C 3.1進行通信:
C 1.1在N1節點上的P1上下文中執行
C 3.1在N1節點上的P3上下文中執行
C 1.1通過10.1.1.2:8080到C 3.1
節點間Pod到Pod通信
容器C 1.1需要與容器C 2.1進行通信:
C1.1是在N1節點上托管的P1的上下文中執行的
C2.1在節點N2上的P2上下文中執行
C1.1通過10.1.2.1:8080到C2.1
Daemon到Pod通信
Daemon D1需要與容器 C 1.1通信:
D1托管在節點N1上
C 1.1在Pod P1的上下文中執行,該Pod托管在節點N1上
D1通過10.1.1.1:8080到C 1.1
Kubernetes網絡模型是一個允許性的網絡模型,也就是說,任何滿足Kubernetes網絡模型限制的網絡都是一個有效的Kubernetes網絡。
将Kubernetes網絡模型映射到Network Graph,使我們能夠在概念層面上對網絡進行推理,并且跳過了在實作層面上推理所需的一系列細節。
在後續的文章中,我們将使用這個Network Graph來讨論Kubernetes服務、Kubernetes Ingress和Kubernetes政策。