2. CNI 缓存架构全景:控制面与数据面缓存分离、etcd 缓存、本地缓存、内核 conntrack 缓存的关系
在 Kubernetes 网络栈中,CNI 插件的缓存体系并非单一组件,而是由控制面缓存与数据面缓存构成的分布式分层结构。理解各层缓存的关系与数据流向,是定位缓存命中故障的前提。
2.1 缓存分层总览
CNI 缓存从逻辑上分为三层:集群级持久缓存(etcd)、节点级本地缓存(CNI 插件本地状态)、内核级连接跟踪缓存(conntrack)。控制面与数据面在此架构中职责分离:控制面负责分配与记录网络资源,数据面负责快速转发与状态维护。
关键认知:控制面缓存(etcd + 本地缓存)保证一致性与持久性;数据面缓存(conntrack)保证性能与低延迟。两者分离设计避免了控制面写入压力影响数据面转发速率。
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 连接的超时时间,过长会占满表项 |
2.3 三层缓存的关系与数据流
当 Pod 发起网络连接时,数据流经过三层缓存的协作路径如下:
- Pod 创建阶段:kubelet 调用 CNI 插件,插件首先查询节点本地缓存获取可用 IP;若本地缓存未命中,则回退到 etcd 分配新 IP 并更新本地缓存。
- 连接建立阶段:Pod 发送数据包,内核网络栈查询 conntrack 缓存;若命中,直接进行 NAT 或转发;若未命中,则创建新连接条目并记录状态。
- 策略执行阶段:CNI 插件(如 Calico 的 Felix)通过本地缓存中的策略规则,在 iptables 或 eBPF 中安装规则,conntrack 负责跟踪连接状态以匹配规则。
缓存命中故障根因:本地缓存与 etcd 不一致(控制面问题)导致 IP 冲突;conntrack 表满(数据面问题)导致新连接被丢弃;两者叠加时表现为 Pod 间通信间歇性失败。
2.4 缓存对比总结
| 缓存层 | 位置 | 存储介质 | 一致性 | 性能特征 | 故障影响 |
|---|---|---|---|---|---|
| etcd | 集群级 | 磁盘 + 内存 | 强一致 | 读写延迟 ~1-10ms | IP 分配失败、策略不生效 |
| 本地缓存 | 节点级 | 文件系统 / 内存 | 最终一致 | 读写延迟 ~μs | Pod 启动慢、IP 冲突 |
| conntrack | 内核级 | 内核哈希表 | 无锁最终一致 | 查找延迟 ~ns | 连接超时、丢包 |