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的上下文中執行

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

------------恢復內容結束------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM