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 地址。
然而,网络模型不对这些 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 进行通信。
Kubernetes 网络作为 Network Graph
本节用 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
示例
本节将通过一些例子,按照 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
本文转载自:RancherLabs(ID:RancherLabs)
原文链接:Kubernetes网络概念初探
评论 1 条评论