Cilium 支持的两种 Masquerading 模式

110 阅读6分钟

Cilium Masquerading 模式选择与切换

Cilium 的 Masquerading(地址伪装)除了 IPTables 模式,还有 eBPF 模式,两种模式核心功能都是实现地址转换,但在性能、依赖和灵活性上有显著区别。

一、Cilium 支持的两种 Masquerading 模式

Cilium 仅提供两种 Masquerading 实现,核心差异源于底层技术(传统 IPTables vs 高性能 eBPF),具体对比如下:

对比维度IPTables 模式(当前使用)eBPF 模式(推荐高性能场景)
底层技术依赖 Linux 内核原生 IPTables 框架(基于 netfilter 钩子)基于 eBPF 程序(直接附着在网络设备或内核路径上)
性能表现规则数量多时性能下降(线性匹配规则)高性能,规则匹配为哈希表查找,无规则数量依赖
依赖组件需确保主机 IPTables 工具正常(如 iptables、ip6tables)依赖 Linux 内核 eBPF 特性(内核版本 ≥ 5.8 更优)
功能灵活性仅支持基础地址伪装,扩展功能依赖 IPTables 规则自定义支持更精细控制(如按 Pod 标签、端口过滤伪装),易集成 Cilium 策略
适用场景小规模集群、旧内核环境(< 5.4)、需兼容传统 IPTables 规则中大规模集群、高性能网络场景(如高并发 Pod 通信)
配置开启方式默认或配置 masqueradeMode: iptables配置 masqueradeMode: ebpf

二、关键区别解析

1. 性能:eBPF 模式碾压性优势
  • IPTables 模式:所有出站流量需经过 IPTables 的 NAT 表规则链,规则越多(如集群 Pod 数量多),匹配耗时越长,可能成为网络瓶颈。

  • eBPF 模式:eBPF 程序直接在内核态处理地址转换,规则通过哈希表存储,匹配速度与规则数量无关,即使集群有上万 Pod,性能也基本无损耗。

2. 依赖与兼容性:IPTables 更通用,eBPF 需内核支持
  • IPTables 模式:几乎所有 Linux 主机都默认支持,无需额外内核配置,适合内核版本较低(如 4.19 及以下)或需兼容现有 IPTables 规则的场景。

  • eBPF 模式:要求 Linux 内核支持 eBPF 相关特性(如 BPF_TYPE_CGROUP_SKB、BPF_PROG_TYPE_XDP 等),推荐内核版本 ≥ 5.4(5.8+ 功能更完整),低内核版本可能无法启用或功能受限。

3. 功能扩展性:eBPF 模式更贴合 Cilium 原生能力
  • IPTables 模式:地址伪装规则独立于 Cilium 策略,若需精细化控制(如特定 Pod 不伪装、特定端口不伪装),需手动编写 IPTables 规则,维护成本高。

  • eBPF 模式:可直接关联 Cilium Network Policy(网络策略),通过标签(如 app: backend)定义伪装范围,无需手动操作底层规则,与 Cilium 生态无缝集成。

三、如何选择?

  1. 选 IPTables 模式

    1. 集群规模小(Pod 数量 < 1000),对性能要求不高。
    2. 主机内核版本低(< 5.4),无法支持 eBPF 完整特性。
    3. 需兼容现有 IPTables 规则,避免冲突。
  2. 选 eBPF 模式

    1. 集群规模大(Pod 数量 ≥ 1000),或有高并发网络需求(如微服务频繁跨节点通信)。

    2. 主机内核版本 ≥ 5.4(推荐 5.8+),支持 eBPF 特性。

    3. 希望通过 Cilium 策略精细化控制地址伪装,减少手动运维。

Cilium Masquerading 模式切换的操作步骤文档

包括 eBPF 模式的内核兼容性检查、配置修改和验证命令

Cilium 从 IPTables 切换到 eBPF 的操作步骤及注意事项

以下是 Cilium Masquerading 模式(从 IPTables 切换到 eBPF)的完整操作步骤,包括内核兼容性检查、配置修改、验证及回滚方案:

一、前提:检查 eBPF 模式兼容性

eBPF 模式依赖 Linux 内核特性,需先确认主机内核是否支持。

1. 检查内核版本

推荐内核版本 ≥ 5.4(5.8+ 功能更完善):

uname -r  # 输出示例:5.15.0-78-generic(符合要求)
2. 验证关键 eBPF 特性

执行以下命令,确保返回 yes 或非空值:

# 检查 cgroup2 支持(eBPF 依赖)
mount | grep cgroup2  # 需看到 /sys/fs/cgroup 挂载类型为 cgroup2

# 检查 BPF 系统调用支持
grep BPF_SYSCALL /boot/config-$(uname -r)  # 需输出 CONFIG_BPF_SYSCALL=y

# 检查 BPF 程序类型支持(至少包含以下项)
grep -E 'CONFIG_BPF_PROG_TYPE_(CGROUP_SKB|XDP|SCHED_CLS)' /boot/config-$(uname -r)
# 需输出:
# CONFIG_BPF_PROG_TYPE_CGROUP_SKB=y
# CONFIG_BPF_PROG_TYPE_XDP=y
# CONFIG_BPF_PROG_TYPE_SCHED_CLS=y

若不满足:需升级内核或保持 IPTables 模式(低内核可能导致 eBPF 模式功能异常)。

二、切换到 eBPF 模式

1. 修改 Cilium 配置(Helm 部署)

若通过 Helm 安装,修改 values.yaml 或直接通过 --set 调整:

helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --reuse-values \
  --set masqueradeMode=ebpf  # 核心配置:启用 eBPF 伪装模式
2. 修改 Cilium 配置(直接改 ConfigMap)

若未使用 Helm,编辑 Cilium 的 ConfigMap:

kubectl edit configmap cilium-config -n kube-system

找到 masquerade-mode 字段,修改为:

masquerade-mode: "ebpf"  # 原配置可能为 "iptables"

保存后重启 Cilium DaemonSet 使配置生效:

kubectl rollout restart daemonset/cilium -n kube-system

三、验证 eBPF 模式是否生效

1. 检查 Cilium 状态

执行 cilium-dbg status,确认 Masquerading 字段变为 eBPF

cilium-dbg status | grep Masquerading
# 预期输出:Masquerading:            eBPF [IPv4: Enabled, IPv6: Disabled]
2. 验证 eBPF 规则加载

检查 Cilium 加载的 eBPF 程序中是否包含伪装相关逻辑:

# 列出主机上的 eBPF 程序
bpftool prog list | grep -i "masquerade|nat"
# 若看到包含 "cilium_masquerade" 或 "nat" 的程序,说明加载成功
3. 测试 Pod 出站流量伪装

在 Pod 内访问外部 IP(如 curl 8.8.8.8),然后在主机上抓包验证源 IP 是否为主机 IP(而非 Pod IP):

# 在主机上抓包(替换 eth0 为实际出口网卡)
tcpdump -i eth0 host 8.8.8.8 -n
# 若源 IP 为主机 IP(而非 Pod 的 10.0.2.x),说明伪装生效

四、回滚到 IPTables 模式(若需)

若 eBPF 模式出现问题,可快速回滚:

  1. 恢复配置(Helm 方式):

helm upgrade cilium cilium/cilium \
  --namespace kube-system \
  --reuse-values \
  --set bpf.masquerade=true
  1. 恢复配置(ConfigMap 方式):

kubectl edit configmap cilium-config -n kube-system
# 将 masquerade-mode 改回 "iptables"
kubectl rollout restart daemonset/cilium -n kube-system
  1. 验证回滚:

cilium-dbg status | grep Masquerading
# 预期输出:Masquerading:            IPTables [IPv4: Enabled, IPv6: Disabled]

注意事项

  1. 性能监控:切换后建议观察集群网络延迟(如通过 Hubble),确认 eBPF 模式性能符合预期。

  2. 内核优化:若内核版本 ≥ 5.10,可开启 bpf-jit 编译加速 eBPF 程序(临时生效:echo 1 > /proc/sys/net/core/bpf_jit_enable,永久生效需修改 /etc/sysctl.conf)。

  3. 冲突规避:eBPF 模式会自动清理 IPTables 相关伪装规则,无需手动删除,但需确保无其他工具(如 firewalld)干扰 eBPF 程序加载。

如果切换过程中遇到问题(如 Pod 网络不通),可通过 cilium-dbg logs --level debug 查看详细日志定位原因。

ipv6 地址伪装目前为 beta(vxlan 也是 beta)

参考

  1. docs.cilium.io/en/stable/n…