Kubernetes 網絡概念初探
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
1. Node to Pod Forwarding Rule
K8s-Node(N) ∧ K8s-Pod(P):
host(N, P) ∧ addr(P, a)
⟹
[* * a * Forward(P)] in FIB[N]
2. 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 的上下文中執行
C1.1 通過 127.0.0.1:9090 到 C1.2
節點內 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
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/gMwQn2Gvh9bYtexhb_FL2Q