跳转到内容

Cilium 替换 Calico 方案与风险(深度模式) ​

目标机:192.168.60.128(master,单节点,Ubuntu 26.04,k8s v1.35.4,docker 29.7.2 + cri-dockerd) 环境:192.168.60.128(master,单节点,Ubuntu 26.04,k8s v1.35.4,docker 29.7.2 + cri-dockerd) 日期:2026-10-09


0. 结论:有必要吗? ​

以「学习 + 验证」为目的:值得做。理由:

  • 成本低:单节点测试机,镜像通道已实测可用,回滚只需恢复基础快照。
  • 能明显看到的东西(功能/可观测层面)真实存在,见下方优点清单。
  • 但要摆正性能预期:单节点上"性能提升"有限。因为所有 Pod 都在同一台机、不经封装,Calico 的 IPIP 开销根本用不上。 真正的性能收益出现在「多节点 + 大量 Service/NodePort」场景(kube-proxy 退化为纯 eBPF,绕开 iptables 逐包遍历)。 所以这次在你这台机上,收益主要是"能力/可观测/架构现代化",吞吐提升只会有几个百分点量级。

换完之后你能拿到的优点(按"能不能在这台机上看到"标注):

  1. 彻底移除 kube-proxy:Service/ClusterIP/NodePort 全部由 eBPF 处理(本机可见 ✔)
  2. iptables 规则数大幅下降(本机可见 ✔,我们会做前后对比)
  3. Hubble 全链路可观测:hubble observe 能看到每一次 L3/L4(甚至 L7)请求(本机可见 ✔)
  4. L7 网络策略:可按 HTTP 方法/路径做策略(Calico 需要额外组件)(本机可验证 ✔)
  5. 原生 NetworkPolicy + CiliumNetworkPolicy + Clusterwide 策略(本机可见 ✔)
  6. 更干净的 NodePort / LB / 大流量转发路径(本机可见 ✔)
  7. 内核 eBPF 数据面,无需 IPIP 隧道(本机可见:tunl0 消失 ✔)
  8. 后续可平滑用上:带宽管理、BGP、Gateway API、服务网格(ambient)(扩展方向)

1. 技术选型(已按你这台机实测校准) ​

项取值依据
Cilium 版本1.20.2(最新稳定)k8s 1.35 属其 e2e 保证范围(1.20 支持 1.33–1.36);1.19.8 亦可
内核要求≥5.10本机 7.0.0-22 ✔
数据面kubeProxyReplacement=true深度模式目标
可观测Hubble + Relay + UI深度模式目标
IPAMcluster-pool,Pod CIDR 10.244.0.0/16与 kube-controller-manager 现网参数对齐(修正现存不一致)
路由tunnel(VXLAN)(默认)单节点最稳;后续可切 native
设备devices=ens32避免 Cilium 误接管 docker0/cali
API 直连k8sServiceHost=192.168.60.128 / k8sServicePort=6443无 kube-proxy 后 Pod 访问 API 需要
安装方式cilium CLI(内置 helm,无需另装 helm)步骤最少

关键前置事实(实测):

  • 运行时 = docker 29.7.2 + cri-dockerd,CRI socket:unix:///var/run/cri-dockerd.sock
  • CNI 现状:/etc/cni/net.d/10-calico.conflist + calico-kubeconfig;二进制 /opt/cni/bin/calico, calico-ipam
  • Calico 以 DaemonSet(calico-node) + Deployment(calico-kube-controllers) 运行,宿主无清单文件
  • kube-proxy 是 systemd 服务(/usr/local/bin/kube-proxy),不是 DaemonSet → 深度模式要 disable 它
  • 服务网段 10.96.0.0/12,DNS 10.96.0.10,kubernetes svc 10.96.0.1
  • 现 Pod 网段 172.16.0.0/16(Calico IPPool);节点网卡 ens32=192.168.60.128,docker0=172.17.0.1/16
  • 内核 eBPF 就绪:CONFIG_BPF / BPF_SYSCALL / BPF_JIT 均 =y,bpf fs 已挂载,cgroup2 已挂载
  • 镜像与工具通道:quay.io 直连可达;github.com 直连可达;raw.githubusercontent.com 需走代理 192.168.60.1:12450
  • 基线 iptables:filter 276 行 + nat 82 行
  • 集群内无任何 NetworkPolicy(无需迁移策略)

2. 实施步骤(概览) ​

逐步命令与每条命令背后的原理,见 替换 Calico 全过程讲解。 这里只保留方案阶段独有的两项准备。

步骤做什么为什么
Step 0采集基线(只读)没有基线就无法证明改动效果,也无法出问题时对照
Step 1装 cilium CLI + 预拉镜像缩短变更窗口,避免安装时卡在 ImagePull
Step 2卸载 Calico清 K8s 对象 + 宿主 CNI 文件 + 内核残留(iptables/路由/隧道口)
Step 3停用 kube-proxy必须与 Step 4 紧邻执行,否则 ClusterIP 会分钟级失效
Step 4安装 Cilium(深度模式)见选型表里的参数取值
Step 5重建工作负载老 Pod 还带 Calico 时代的 172.16.x IP,Cilium 管不了
Step 6验证cilium status / connectivity test / netshoot 手测
Step 7前后对比iptables 行数、kube-proxy 状态、tunl0 是否消失

本次预拉的镜像 ​

bash
docker pull quay.io/cilium/cilium:v1.20.2
docker pull quay.io/cilium/operator-generic:v1.20.2
docker pull quay.io/cilium/hubble-relay:v1.20.2
docker pull quay.io/cilium/hubble-ui:v0.13.2 || true
docker pull quay.io/cilium/hubble-ui-backend:v0.13.2 || true

内网拉取用的代理变量 ​

bash
export https_proxy=http://192.168.60.1:12450 http_proxy=http://192.168.60.1:12450
export no_proxy=localhost,127.0.0.1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local

3. 风险与取舍 ​

#风险等级处置
1cri-dockerd(docker) 运行时:Cilium 主测目标是 containerd/CRI-O中最大不确定点。Step 6 的 cilium connectivity test 就是实测它;失败即回滚
2切换期间集群内网络短暂中断(registry 短暂不可用)中Step 2–4 连续执行,缩短窗口;接受测试机中断
3停 kube-proxy 后若 Cilium 起不来 → ClusterIP 全断高立即回滚基础快照
4Pod 网段 172.16→10.244,若有资产硬编码 172.16.x 需改低本机 /etc/hosts、CoreDNS 不受影响
5docker0(172.17/16) 干扰 Cilium 设备识别低已用 devices=ens32 规避
6cali-* iptables 残留影响计数/干净度低已提供清理脚本
7单节点上性能提升不明显—预期管理:本次看能力,不看吞吐

取舍:牺牲「零中断」换取「干净的、无 kube-proxy 的 eBPF 数据面」。测试机可接受。


4. 回滚方案 ​

  1. 首选:VMware 恢复基础快照(最快最干净)。
  2. 若不回滚:cilium uninstall → 用你的二进制安装器重装 Calico → 恢复 kube-proxy:
    bash
    systemctl enable --now kube-proxy

相关笔记 ​

基于 MIT 许可发布