Kubernetes 网络模型的核心要求之一是每个 Pod 都应该有自己的 IP 地址,并且集群中的每个 Pod 都应该能够使用这个 IP 地址与其进行通信。有多个网络提供商(flannel、calico、canal 等)实现了这种网络模型。
在 kubernetes 中设置网络有多种方法,容器运行时也有多种选项。在这篇文章中,我将使用 Flannel作为网络提供程序, 使用 Containerd作为容器运行时。
一、背景概念
1.容器网络:非常简短的概述
有一些非常好的帖子解释了容器网络的工作原理。对于上下文,我将在这里使用涉及 Linux 桥接网络和数据包封装的单一方法进行非常高层次的概述。在这里跳过细节。
2.同一主机上的容器
在同一主机上运行的容器可以通过其 IP 地址相互通信的方式之一是通过 Linux 桥。在 kubernetes(和 docker)世界中, 创建了veth(虚拟以太网)设备来实现此目的。该 veth 设备的一端插入容器网络命名空间,另一端连接到 主机网络上的Linux 桥。同一主机上的所有容器都将这一 veth 对的一端连接到 linux 网桥,并且它们可以通过网桥使用其 IP 地址相互通信。Linux 网桥还分配有一个 IP 地址,并充当从 pod 发往不同节点的出口流量的网关。
3.不同主机上的容器
在不同主机上运行的容器可以通过其 IP 地址相互通信的方法之一是使用数据包封装。Flannel 通过 vxlan支持此功能,它将原始数据包包装在 UDP 数据包中并将其发送到目的地。
在 kubernetes 集群中,flannel 在每个节点上创建一个 vxlan 设备和一些路由表条目。发往不同主机上的容器的每个数据包都会经过 vxlan 设备并封装在 UDP 数据包中。在目的地,检索封装的数据包并将数据包路由到目标 Pod。
注意:这只是配置容器之间网络的方式之一。
4.什么是 CRI?
CRI(容器运行时接口)是一个插件接口,允许 kubelet 使用不同的容器运行时。各种容器运行时都实现了 CRI API,这允许用户在其 kubernetes 安装中使用他们选择的容器运行时。
5.什么是CNI?
CNI 项目包含一个 规范,为 Linux 容器提供基于插件的通用网络解决方案。它还包含各种插件,在配置 Pod 网络时执行不同的功能。CNI 插件是遵循 CNI 规范的可执行文件,我们将在下面的帖子中讨论一些插件。
二、为 Pod IP 地址的节点分配子网
如果所有 Pod 都需要有一个 IP 地址,那么确保整个集群中的所有 Pod 都具有唯一的 IP 地址非常重要。这是通过为每个节点分配一个唯一的子网来实现的,从该子网为 Pod 分配该节点上的 IP 地址。
1.节点 IPAM 控制器
当nodeipam作为选项传递给 kube-controller-manager 的 –controllers命令行标志时,它会从集群 CIDR(集群网络的 IP 范围)为每个节点分配一个专用子网 (podCIDR)。由于这些 podCIDR 是不相交的子网,因此它允许为每个 pod 分配唯一的 IP 地址。
当 kubernetes 节点首次向集群注册时,会为其分配一个 podCIDR。要更改分配给集群中节点的 podCIDR,需要取消注册节点,然后重新注册节点,并将任何配置更改首先应用于 kubernetes 控制平面。podCIDR可以使用以下命令列出节点。
$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24