Kubernetes网络概念初探

网络 通信技术
本文将使用系统模型的方法探索Kubernetes网络。我们将开发一个简单的模型来了解容器与容器间的通信以及Pod之间的通信。

Kubernetes网络是Kubernetes中一个核心概念。简而言之,Kubernetes网络模型可以确保集群上所有Kubernetes pod都能进行通信。此外,在Kubernetes网络模型的基础上,Kubernetes还有其他核心概念,即Kubernetes Services和Kubernetes Ingress。

[[393012]]

本文将使用系统模型的方法探索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地址。

 

  1. ∧ (K8s-Pod(E₁) ∨ K8s-Node(E₁) ∨ K8s-Service(E₁)) ∧ (K8s-Pod(E₂) ∨ K8s-Node(E₂) ∨ K8s-Service(E₂)): 
  2. addr(E₁, a) ∧ addr(E₂, a)₂ 
  3. ⟺ E₁ = E₂ 

然而,网络模型不对这些IP地址做任何进一步的声明。例如,Kubernetes网络模型不对从这些IP地址中提取的IP地址空间做任何进一步的声明。

限制条件:容器间通信

Kubernetes网络模型要求在Pod P上下文中执行的容器C1可以通过localhost与在P上下文中执行的其他容器C2进行通信。

 

  1. K8s-Pod(P) ∧ K8s-Container(C₁, P) ∧ K8s-Container(C₂, P): open(C₂, p) 
  2. ⟹ 
  3. Send(e, C₁, 127.0.0.1, _, 127.0.0.1, p) 
  4. ⟹ 
  5. Recv(e, C₂, 127.0.0.1, _, 127.0.0.1, p) 

限制条件:Pod到Pod

Kubernetes网络模型要求在Pod P1上下文中执行的容器C1可以通过P2的地址与在P2上下文中执行的其他容器C2进行通信。

 

  1. ∧ K8s-Pod(P₁) ∧ K8s-Container(C₁, P₁) ∧ K8s-Pod(P₂) ∧ K8s-Container(C2, P₂): 
  2. addr(P₁, sa) ∧ addr(P₁, ta) ∧ open(C₂, tp) 
  3. ⟹ 
  4. Send(e, C₁, sa, sp, ta, tp) 
  5. ⟹ 
  6. Recv(e, C₂, sa, sp, ta, tp) 

限制条件:Process到Pod

Kubernetes网络模型要求托管在节点N上的一个Process,称为Daemon D,可以通过P的地址与托管在N上的Pod P上下文中执行的任何容器C进行通信。

 

  1. Container(C, P): host(N, D) ∧ host(N, P) ∧ addr(P, a) ∧ open(C, p) 
  2. ⟹ 
  3. Send(e, D, _, _, a, p) 
  4. ⟹ 
  5. 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

  1. K8s-Pod(P) ∧ K8s-Container(C, P): Process(C) 

每个Daemon D映射到网络Process C

  1. K8s-Daemon(D): Process(D) 

每个K8s Pod P映射到网络Switch P, Pod的Switch

  1. K8s-Pod(P): Switch(P) 

每个K8S节点N 映射到网络 Switch N,节点的Switch:

  1. K8s-Pod(N): Switch(N) 

链接

每个容器C会被链接到其Pod Switch P

  1. K8s-Pod(P) ∧ K8s-Container(C, P): link(C, P) 

每个Daemon D会被链接到其节点Switch N

 

  1. K8s-Node(N) ∧ K8s-Daemon(D): host(N, D)  
  2. ⟹  
  3. link(D, N) 

每个Pod Switch P会被链接到其节点Switch N

 

  1. K8s-Node(N) ∧ K8s-Pod(P): host(N, P)  
  2. ⟹  
  3. link(P, N) 

每个节点Switch N1会被链接到其他各节点Switch N2

 

  1. K8s-Node(N₁) ∧ K8s-Node(N₂): N₁ ≠ N₂ 
  2. ⟹ 
  3. link(N₁, N₂) 

在Pod Switch的转发信息库

P2的转发信息库

 

  1. 1. Delivery on localhost K8s-Pod(P) ∧ K8s-Container(C, P): 
  2. open(C, p) 
  3. ⟹ 
  4. [* * 127.0.0.1 p Deliver(C)] in FIB[P] 
  5. 2. Delivery on Pod Address 
  6. K8s-Pod(P) ∧ K8s-Container(C, P): 
  7. addr(P, a) ∧ open(C, p) 
  8. ⟹ 
  9. [* * a p Deliver(C)] in FIB[P] 
  10. 3. Local Forwarding Rule 
  11. K8s-Node(N) ∧ K8s-Pod(P): 
  12. host(N, P) 
  13. ⟹ 
  14. [* * * * Forward(N)] in FIB[P] 

在节点Switch的转发信息库

转发信息库 N2

 

  1. {{{1. Node to Pod Forwarding Rule 
  2. K8s-Node(N) ∧ K8s-Pod(P): 
  3. host(N, P) ∧ addr(P, a) 
  4. ⟹ 
  5. [* * a * Forward(P)] in FIB[N] 
  6. 2. Node to Node Forwalding Rule 
  7. K8s-Node(N₁) ∧ K8s-Node(N₂) ∧ K8s-Pod(P): 
  8. N₁ ≠ N₂ ∧ host(N₂, P) ∧ addr(P, a) 
  9. ⟹ 
  10. [* * a * Forward(N₂)] in FIB[N₁] 
  11.  
  12. }}} 

示例

本节将通过一些例子,按照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策略。

责任编辑:未丽燕 来源: Dockone.io
相关推荐

2020-04-22 13:23:46

智能合约区块链比特币

2014-11-04 15:29:00

KubernetesDocker

2021-02-19 08:38:36

Kubernetes容器化分布式

2022-07-11 09:46:43

Kubernetes开源Linux

2020-05-21 07:00:00

软件定义网络SDN网络

2019-10-24 10:25:32

Kubernetes网络集群

2022-01-27 13:47:10

Kubernete命令Linux

2024-01-19 18:02:25

Kubernetes网络流量

2018-11-21 10:36:29

Kubernetes存储Docker

2023-08-29 07:40:24

Kubernetes容器Container

2020-04-12 22:23:45

Kubernetes容器网络

2020-07-08 09:36:03

Kubernetes容器开发

2020-09-23 14:20:07

Kubernetes容器网络模型

2021-11-22 08:50:20

Kubernetes网络策略云原生应用程序

2021-11-02 08:41:44

Kubernetes Nginx部开源

2022-05-02 18:45:33

Kubernetes网络模型

2012-10-31 11:15:59

2022-09-01 06:59:56

Kubernete云原生

2021-11-18 23:00:22

Kubernetes容器工具

2022-10-08 07:36:08

Kubernetes开源容器
点赞
收藏

51CTO技术栈公众号