5分钟了解k8s pod通信原理--图文篇
k8s 里的pod 互相访问,从实现原理上来说无非有2种。一种是同节点的pod访问,一个是跨节点的pod的访问,这个实现细节经常会在面试环节问到,相信大多人知其然不知其所以然,本文就用图解下相关原理。
环境信息:
- 节点 A 物理 IP:192.168.1.10,Pod 1(IP:10.244.1.1,属于子网 10.244.1.0/24),Pod 2(IP:10.244.1.2,属于子网 10.244.1.0/24);
- 节点 B 物理 IP:192.168.1.11,Pod 3(IP:10.244.2.3,属于子网 10.244.2.0/24)。
一、k8s 网络模型
1.1 k8s集群网络模型示意图
k8s的网络模型可以抽象为三层,底层是物理网卡和物理网络(大二层居多),中间层是借助CNI插件实现的数据转发和处理层,最上层是容器网络接口。
容器IP地址的规划和分配,通常是由网络插件(Flannel和Calico)负责的。本篇假设地址段为10.244.0.0/16。Node节点的IP地址和路由,通常是数据中心DHCP服务器和三层路由器负责的。
用来分配给pod的子网信息、路由条目(Calico)一般会存放在哪呢?
Flannel和Calico都会把它们存储在k8s控制面的etcd数据库中,这个数据库本来是分布式的,不需要额外部署。它们可以通过集群的ApiServer去访问。
1.2 Flannel和Calico的核心组件对比
Flannel 和 Calico 是 k8s 中最常用的两种 CNI 插件,用于实现 Pod 间的网络通信,但两者在设计理念、核心组件和实现原理上有显著差异。
Flannel 设计理念偏向 “简单易用”,组件轻量化;Calico 则追求 “高性能与强功能”,组件更复杂,支持网络策略等高级特性。
1.3 K8s 中实现原理对比
两者均遵循 K8s“每个 Pod 独立 IP、直接通信” 的网络模型,但在网络拓扑、跨节点通信、网络策略等核心功能的实现上差异显著。
下面是两者网络模型与 IP 分配的区别:
1.Flannel:
- 采用 “集中式子网分配”:集群初始化时,Flannel 会划分一个大的集群网段(如 10.244.0.0/16),由 flanneld 为每个节点分配一个子网(如节点 1 分配 10.244.1.0/24,节点 2 分配 10.244.2.0/24)。
- Pod IP 从所在节点的子网中分配,由容器运行时(如 containerd)通过 CNI 接口调用 Flannel 插件完成。
<