图解 Kubernetes Pod 是如何获取 IP 地址?
↓推荐关注↓
转自:网络
在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。
在 Kubernetes 中有多种网络设置方法,以及 container runtime 的各种选项。这篇文章将使用 Flannel 作为 network provider,并使用 Containered 作为 container runtime。
背景概念
注意:这只是配置容器之间网络的方法之一。
CNI(容器网络接口)项目包含一个为 Linux 容器提供基于通用插件网络解决方案的规则。它由各种插件组成,这些插件在配置 Pod 网络时执行不同的功能。CNI 插件是遵循 CNI 规范的可执行文件。
为节点子网分配 Pod IP 地址
如果要求所有 Pod 具有 IP 地址,那么就要确保整个集群中的所有 Pod 的 IP 地址是唯一的。这可以通过为每个节点分配一个唯一的子网来实现,即从子网中为 Pod 分配节点 IP 地址。
nodeipam
传递给 kube-controller-manager 的 --controllers
命令行标志时,它将为每个节点分配来自集群 CIDR(集群网络的 IP 范围)的专用子网(podCIDR)。由于这些 podCIDR 是不相交的子网,因此它可以为每个 Pod 分配唯一的 IP 地址。podCIDR
可以使用以下命令列出节点的名称:Kubelet、Container Runtime 和 CNI 插件交互
当在节点上调度 Pod 时,一启动 Pod 就会发生很多事情。这里我们仅关注与 Pod 配置网络有关的动态。一旦在节点上调度了 Pod,将配置网络并启动应用程序容器。
/etc/cni/net.d/<config-file>
。集群管理员需要在每个节点上交付 CNI 插件。CNI 插件的位置也是可配置的,默认值为 /opt/cni/bin
。[plugins."io.containerd.grpc.v1.cri".cni]
指定 CNI 配置和 CNI 插件的路径。/etc/cni/net.d/10-flannel.conflist
。Flanneld 创建一个 vxlan 设备,从 apiserver 获取网络元数据,并监控 Pod 上的更新。创建 Pod 时,它将在整个集群中为所有 Pod 分配路由,这些路由允许 Pod 通过 IP 地址相互连接。"name": "cni0"
在配置文件中,然后为每个 Pod 创建 veth pair,其一端在容器的网络命名空间中,另一端连接到主机网络上的 Linux Bridge。使用 Bridge CNI 插件,主机上的所有容器都连接到主机网络上的 Linux Bridge。dataDir
指定的目录中/var/lib/cni/networks/<network-name=cni0>/<ip>
。/var/lib/cni/networks/<network-name=cni0>/<ip>
文件包含 IP 分配到的容器 ID。总结
Kube-controller-manager 为每个节点分配一个 podCIDR。从 podCIDR 中的子网值为节点上的 Pod 分配了 IP 地址。由于所有节点上的 podCIDR 是不相交的子网,因此它允许为每个 pod 分配唯一的IP地址。
- EOF -
看完本文有收获?请分享给更多人
推荐关注「Linux 爱好者」,提升Linux技能
点赞和在看就是最大的支持❤️
微信扫码关注该文公众号作者