资讯动态

calico(IPIP模式)同节点+跨节点工作原理(k8s进阶之路-calico工作原理)

发布时间:2026/10/15 4:03:30 来源:尧图企业网站定制
一、前言在 Kubernetes 集群里Pod 之间的通信是最基础也最关键的能力。不同 CNI 插件实现方式差异很大Flannel VXLAN同节点通信走cni0网桥跨节点走flannel.1VXLAN 隧道Calico IPIP同节点通信不经过任何网桥直接用内核路由转发跨节点才用tunl0做 IPIP 封装主要介绍k8s中calico的工作原理包括同节点pods通信跨节点pods通信将结合生产实例案例带大家梳理calico全流程的流量走向。二、同节点pods之前相互通信1.veth pair虚拟网线每个 Pod 创建时Calico 在宿主机上创建一个 veth 端通过veth pair虚拟网线连接pods内部的eth0接口。说白了可以理解为有一根网线一段插在pods里面一段插在宿主机上。架构图如下我们结合上面的架构图在真实环境看下1.pods内部的eth0接口2.查看路由信息3.查看宿主机的cali*接口信息2.同节点两个pods之前相互通信Calico 同节点 Pod 通信就像两个房间Pod之间拉了一根网线veth pair中间不用经过任何大厅网桥直接对着门牌号veth接口/32 路由走就行。用 veth pair 把 Pod 接入宿主机网络栈用内核路由表直接转发不走网桥不做隧道封装。区别于 FlannelCalico 不做二层桥接直接用三层路由路径更短。三、跨节点pods通信两个 Pod 不在同一台机器上就像两个人不在同一个小区。快递数据包要先套一个大信封IPIP 外层写上「从哪个小区送到哪个小区」节点物理 IP送到对方小区后拆掉大信封再按门牌号Pod IP送到具体房间。1.calico的封装模式calico主要有IPIP、VXLAN、BGP无封装三种封装模式。IPIP封装模式一种网络协议IP in IP把 IP 包套在另一个 IP 包里。pods跨节点传输的时候需要把pods地址封装在内层物理机地址封装在外层。2.tunl0隧道tunl0是Linux 内核实现 IPIP 协议时自动创建的一个虚拟网络接口。它不是物理网卡而是一个「逻辑接口」专门负责发包时给包加外层 IP 头封装收包时剥掉外层 IP 头解封装IPIP 是协议tunl0 是这个协议在 Linux 上的「实现载体」。3.跨节点通信结合架构图来看真实环境环境说明PodA IP:10.244.39.135 节点node-12PodB IP:10.244.1.80 节点node-2现在pods A要跨节点访问podB。1.在 node-12 上Pod A 里发起访问比如ping PodBkubectl -n 名称空间 exec -it podA -- ping 10.244.1.80源 IP10.244.39.135Pod A目的 IP10.244.1.80Pod B包从 Pod A 的eth0发出通过 veth pair 到达宿主机侧caliXXXX2.node-12查看路由ip route get 10.244.1.80去 Pod B必须先走 node-12 的 tunl03.node12的tunl0隧道封装原始包内层 IP 头src10.244.39.135 dst10.244.1.80进入tunl0后内核加一层新的 IP 头外层 IP 头src172.24.0.12 dst172.24.0.2 内层 IP 头src10.244.39.135 dst10.244.1.804.物理网络传输封装后的 IPIP 包从 node-12 的 bond0 发出走物理网络从172.24.0.12到172.24.0.2。这一段中间的路由器、交换机只认外层 IP节点 IP不认内层 Pod IP。node12上使用tcpdump抓包测试抓 bond0 上所有「协议号是 4IPIP」且「外层源或目的 IP 是 node-12 或 node-2」的包。tcpdump -i bond0 -nn proto 4 and host 172.24.0.12 and host 172.24.0.25.node-2 收包tunl0解封装IPIP物理网络 │ IPIP 包外层 172.24.0.12 → 172.24.0.2 │ 内层 10.244.39.135 → 10.244.1.80 ▼ node-2 bond0 收到包 │ ▼ 内核发现协议号4IPIP→ 交给 tunl0 │ ▼ node-2 tunl0 剥掉外层 IP 头解封装 │ ▼ 剩下内层包10.244.39.135 → 10.244.1.80 │ ▼ 内核查路由 → dev caliba88b8e327e │ ▼ veth pair → Pod B6.内核查路由[rootnode-2 ~]# ip route get 10.244.1.80 10.244.1.80 dev caliba88b8e327e src 172.17.0.1 uid 0 cache7.通过veth接口传到pods内本文来自csdn作者JasonChen 陈杰。当你的能力还驾驭不了你的生活的时候你就应该沉下心来历练。问问自己想要怎样的人生。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑