2. CNI 缓存架构全景:控制面与数据面缓存分离、etcd 缓存、本地缓存、内核 conntrack 缓存的关系

在 Kubernetes 网络栈中,CNI 插件的缓存体系并非单一组件,而是由控制面缓存与数据面缓存构成的分布式分层结构。理解各层缓存的关系与数据流向,是定位缓存命中故障的前提。

2.1 缓存分层总览

CNI 缓存从逻辑上分为三层:集群级持久缓存(etcd)、节点级本地缓存(CNI 插件本地状态)、内核级连接跟踪缓存(conntrack)。控制面与数据面在此架构中职责分离:控制面负责分配与记录网络资源,数据面负责快速转发与状态维护。

关键认知:控制面缓存(etcd + 本地缓存)保证一致性与持久性;数据面缓存(conntrack)保证性能与低延迟。两者分离设计避免了控制面写入压力影响数据面转发速率。
CNI 缓存分层架构总览 CNI 缓存分层架构总览 控制面(Control Plane) etcd 集群 IPAM 分配记录 / 网络策略 节点本地缓存 CNI 插件状态 / 分配记录 数据面(Data Plane) 内核 conntrack 缓存 连接跟踪表 / NAT 状态 数据面缓存 无锁 / 高性能 状态同步

2.2 各层缓存详解

2.2.1 etcd 缓存:集群级持久状态

etcd 是 CNI 控制面的权威数据源。所有 IP 分配、网络策略、Pod 网络绑定关系均持久化存储于此。CNI 插件(如 Calico、Cilium)通过 Kubernetes API Server 间接读写 etcd,或直接通过 etcd API 操作。

特性 说明
存储内容 IP 池分配状态、Pod 网络接口绑定、网络策略规则、节点子网划分
访问模式 通过 API Server 或 etcd 客户端(如 Calico 的 etcdv3 后端)
一致性模型 强一致性(Raft 协议),保证集群内所有节点看到相同状态
性能瓶颈 高并发写入时延迟上升;Watch 事件过多导致 API Server 压力
常见故障点:etcd 的 watch 事件积压会导致 CNI 插件本地缓存更新延迟,造成 Pod 启动时 IP 分配冲突或网络策略未生效。建议监控 etcd 的 etcd_server_leader_changes_seen_total 与 etcd_network_client_grpc_sent_bytes_total 指标。

2.2.2 节点本地缓存:CNI 插件本地状态

每个节点上的 CNI 插件(如 calico-node、cilium-agent)维护一份本地缓存,用于加速 Pod 创建时的网络配置。本地缓存通常存储在文件系统(如 /var/lib/cni/networks/)或内存中。

  • 缓存内容:已分配 IP 列表、Pod 接口索引、路由表快照、策略规则副本。
  • 同步机制:通过 etcd Watch 或定时轮询与集群状态保持一致。
  • 失效场景:节点重启、CNI 插件重启、etcd 连接中断导致缓存过期。
优化建议:对于 Calico,可调整 FELIX_SYNCNODETIMEOUT 与 FELIX_IPINIPMTU 参数,减少本地缓存与 etcd 的同步频率;对于 Cilium,可启用 cilium-agent --kvstore-lease-ttl 控制缓存刷新间隔。

2.2.3 内核 conntrack 缓存:数据面连接跟踪

conntrack 是 Linux 内核网络栈中的连接跟踪模块,记录所有经过节点的网络连接状态(TCP/UDP/ICMP)。它是数据面缓存的核心,直接影响 NAT 转发、网络策略执行与 Pod 间通信性能。

参数 默认值 影响
nf_conntrack_max 262144(常见) 最大连接跟踪条目数,超出后新连接被丢弃
nf_conntrack_buckets 65536 哈希表桶数,影响查找性能
nf_conntrack_tcp_timeout_established 432000(5天) 已建立 TCP 连接的超时时间,过长会占满表项
内核 conntrack 缓存内部结构 内核 conntrack 缓存内部结构 conntrack 哈希表(nf_conntrack_buckets) 桶 0 链表头 桶 1 链表头 桶 2 链表头 …… 桶 N 链表头 连接条目 1 src:10.0.0.1:1234 dst:10.0.0.2:80 连接条目 2 src:10.0.0.3:5678 dst:10.0.0.4:443 超时时间 TCP: 5天 / UDP: 30s

2.3 三层缓存的关系与数据流

当 Pod 发起网络连接时,数据流经过三层缓存的协作路径如下:

  1. Pod 创建阶段:kubelet 调用 CNI 插件,插件首先查询节点本地缓存获取可用 IP;若本地缓存未命中,则回退到 etcd 分配新 IP 并更新本地缓存。
  2. 连接建立阶段:Pod 发送数据包,内核网络栈查询 conntrack 缓存;若命中,直接进行 NAT 或转发;若未命中,则创建新连接条目并记录状态。
  3. 策略执行阶段:CNI 插件(如 Calico 的 Felix)通过本地缓存中的策略规则,在 iptables 或 eBPF 中安装规则,conntrack 负责跟踪连接状态以匹配规则。
缓存命中故障根因:本地缓存与 etcd 不一致(控制面问题)导致 IP 冲突;conntrack 表满(数据面问题)导致新连接被丢弃;两者叠加时表现为 Pod 间通信间歇性失败。

2.4 缓存对比总结

缓存层 位置 存储介质 一致性 性能特征 故障影响
etcd 集群级 磁盘 + 内存 强一致 读写延迟 ~1-10ms IP 分配失败、策略不生效
本地缓存 节点级 文件系统 / 内存 最终一致 读写延迟 ~μs Pod 启动慢、IP 冲突
conntrack 内核级 内核哈希表 无锁最终一致 查找延迟 ~ns 连接超时、丢包