------------恢復內容開始------------
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網路模型。
限制條件:網路可定址實體
Kubernetes網路模型定義了3個可定址實體:K8S pod、K8S 節點以及K8S Service,每個實體都會分配到一個不同的IP地址。
∧ (K8s-Pod(E₁) ∨ K8s-Node(E₁) ∨ K8s-Service(E₁))
∧ (K8s-Pod(E₂) ∨ K8s-Node(E₂) ∨ K8s-Service(E₂)):
addr(E₁, a) ∧ addr(E₂, a)₂
⟺ E₁ = E₂
然而,網路模型不對這些IP地址做任何進一步的宣告。例如,Kubernetes網路模型不對從這些IP地址中提取的IP地址空間做任何進一步的宣告。
限制條件:容器間通訊
Kubernetes網路模型要求在Pod P上下文中執行的容器C1可以通過localhost與在P上下文中執行的其他容器C2進行通訊。
K8s-Pod(P) ∧ K8s-Container(C₁, P) ∧ K8s-Container(C₂, P):
open(C₂, p)
⟹
Send(e, C₁, 127.0.0.1, _, 127.0.0.1, p)
⟹
Recv(e, C₂, 127.0.0.1, _, 127.0.0.1, p)
限制條件:Pod到Pod
Kubernetes網路模型要求在Pod P1上下文中執行的容器C1可以通過P2的地址與在P2上下文中執行的其他容器C2進行通訊。
∧ K8s-Pod(P₁) ∧ K8s-Container(C₁, P₁)
∧ K8s-Pod(P₂) ∧ K8s-Container(C2, P₂):
addr(P₁, sa) ∧ addr(P₁, ta) ∧ open(C₂, tp)
⟹
Send(e, C₁, sa, sp, ta, tp)
⟹
Recv(e, C₂, sa, sp, ta, tp)
限制條件:Process到Pod
Kubernetes網路模型要求託管在節點N上的一個Process,稱為Daemon D,可以通過P的地址與託管在N上的Pod P上下文中執行的任何容器C進行通訊。
K8s-Node(N) ∧ K8s-Daemon(D) ∧ K8s-Pod(P) ∧ K8s-
Container(C, P):
host(N, D) ∧ host(N, P) ∧ addr(P, a) ∧ open(C, p)
⟹
Send(e, D, _, _, a, p)
⟹
Recv(e, C, _, _, a, p)
Kubernetes網路作為Network Graph
本節用Kubernetes Network Graph這個理想的模型來描述Kubernetes網路模型。
下圖描述了本節內容中的用例:Kubernetes叢集K1由2個節點組成。每個節點託管2個Pod。每個Pod執行2個容器,一個容器監聽8080埠,一個容器監聽9090埠。此外,每個節點託管1個Daemon。
我們可以將Kubernetes叢集網路建模為一個具有一組節點和一組連結的Graph。
節點
每個K8S容器C對映到網路Process C
K8s-Pod(P) ∧ K8s-Container(C, P):
Process(C)
每個Daemon D對映到網路Process C
K8s-Daemon(D):
Process(D)
每個K8s Pod P對映到網路Switch P, Pod的Switch
K8s-Pod(P):
Switch(P)
每個K8S節點N 對映到網路 Switch N,節點的Switch:
K8s-Pod(N):
Switch(N)
連結
每個容器C會被連結到其Pod Switch P
K8s-Pod(P) ∧ K8s-Container(C, P):
link(C, P)
每個Daemon D會被連結到其節點Switch N
K8s-Node(N) ∧ K8s-Daemon(D):
host(N, D)
⟹
link(D, N)
每個Pod Switch P會被連結到其節點Switch N
K8s-Node(N) ∧ K8s-Pod(P):
host(N, P)
⟹
link(P, N)
每個節點Switch N1會被連結到其他各節點Switch N2
K8s-Node(N₁) ∧ K8s-Node(N₂):
N₁ ≠ N₂
⟹
link(N₁, N₂)
在Pod Switch的轉發資訊庫
P2的轉發資訊庫
1. Delivery on localhost
K8s-Pod(P) ∧ K8s-Container(C, P):
open(C, p)
⟹
[* * 127.0.0.1 p Deliver(C)] in FIB[P]
2. Delivery on Pod Address
K8s-Pod(P) ∧ K8s-Container(C, P):
addr(P, a) ∧ open(C, p)
⟹
[* * a p Deliver(C)] in FIB[P]
3. Local Forwarding Rule
K8s-Node(N) ∧ K8s-Pod(P):
host(N, P)
⟹
[* * * * Forward(N)] in FIB[P]
在節點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策略。
原文連結:
https://dominik-tornow.medium.com/kubernetes-networking-22ea81af44d0
------------恢復內容結束------------