3. Cilium 安装与部署:Helm 安装、kube-proxy 替换模式、CNI 配置检查

本章聚焦 Cilium 在生产环境中的标准部署流程。我们将使用 Helm 作为包管理工具,完成 Cilium 的安装与核心参数配置,重点讲解 kube-proxy 替换模式 的启用原理,并给出部署后的 CNI 配置验证方法。正确的安装与参数调优是后续蓝绿发布流量治理的基础。

3.1 环境准备与 Helm 仓库配置

在安装 Cilium 之前,请确保 Kubernetes 集群版本 ≥ 1.23,且节点内核支持 eBPF(推荐 Linux 5.10+)。使用 Helm 3 进行安装,首先添加 Cilium 官方 Helm 仓库:

helm repo add cilium https://helm.cilium.io/
helm repo update
版本锁定建议: 生产环境请固定 Chart 版本,避免自动升级导致行为变更。例如:helm install cilium cilium/cilium --version 1.15.0。

3.2 Helm 安装核心参数与 kube-proxy 替换模式

Cilium 最关键的部署决策是是否启用 kube-proxy 替换模式。启用后,Cilium 将完全接管集群的 Service 负载均衡、ClusterIP 转发、NodePort 和 ExternalTrafficPolicy 等逻辑,不再依赖 kube-proxy 组件。这能显著降低 iptables 规则数量,提升网络性能。

下表列出了安装时必须关注的核心 Helm 参数及其作用:

参数 默认值 说明
kubeProxyReplacement disabled 是否启用 kube-proxy 替换。推荐 strict 或 probe 模式
k8sServiceHost — Kubernetes API Server 地址(替换模式下必须指定)
k8sServicePort 6443 API Server 端口
cni.exclusive true 是否独占 CNI 配置,避免与其他 CNI 冲突
ipam.mode cluster-pool IP 分配模式,推荐 kubernetes 或 cluster-pool
rollOutCiliumPods false 升级时是否滚动重启 Cilium 代理,建议开启

以下是一个启用 strict kube-proxy 替换 的安装命令示例:

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set kubeProxyReplacement=strict \
  --set k8sServiceHost=192.168.1.100 \
  --set k8sServicePort=6443 \
  --set cni.exclusive=true \
  --set ipam.mode=kubernetes \
  --set rollOutCiliumPods=true
严格模式前提: 启用 kubeProxyReplacement=strict 前,必须确保集群中已移除 kube-proxy 组件(或将其 DaemonSet 缩容至 0),否则会出现网络规则冲突。

3.3 kube-proxy 替换模式架构示意

下图展示了启用 kube-proxy 替换模式后,Cilium Agent 如何直接通过 eBPF 程序处理 Service 流量,绕过传统的 iptables 和 kube-proxy 组件。

kube-proxy 替换模式架构 传统模式(未替换) Pod → Service ClusterIP ↓ iptables DNAT 规则链 ↓ kube-proxy 监听更新 延迟高 · 规则膨胀 · 性能瓶颈 Cilium 替换模式 Pod → Service ClusterIP ↓ eBPF 内核态直接转发 ↓ 无 iptables · 无 kube-proxy 低延迟 · 线性扩展 · 原生性能 迁移 遗留组件 kube-proxy DaemonSet iptables / ipvs 规则 conntrack 内核模块 需手动缩容或移除 Cilium 替换组件 Cilium Agent(eBPF 程序) Cilium Operator(Service 同步) Hubble(可观测性) 原生 eBPF 替代所有 iptables

3.4 CNI 配置检查与验证

安装完成后,必须验证 Cilium 是否正确接管了 CNI 配置。以下是标准检查步骤:

  1. 检查 Cilium Pod 运行状态
kubectl -n kube-system get pods -l k8s-app=cilium
# 预期输出:所有 Pod 均为 Running 状态
  1. 验证 CNI 配置文件
# 在任意节点上执行
cat /etc/cni/net.d/05-cilium.conf
# 应包含 "type": "cilium-cni" 且无其他 CNI 插件残留
  1. 检查 kube-proxy 是否已被替换
# 查看 Cilium Agent 状态
kubectl -n kube-system exec ds/cilium -- cilium status | grep -i "kube-proxy"
# 预期输出:KubeProxyReplacement: Strict  或  Probe
  1. 测试 Service 连通性
# 创建一个测试 Service 和 Pod
kubectl run test-pod --image=nginx --port=80
kubectl expose pod test-pod --port=80 --target-port=80
# 从集群内访问 ClusterIP,验证转发正常
kubectl run curl --image=curlimages/curl -it --rm -- sh -c "curl http://test-pod:80"
CNI 配置冲突排查: 如果节点上存在多个 CNI 配置文件(如 10-flannel.conflist),Cilium 可能无法正常工作。建议设置 cni.exclusive=true,或手动删除其他 CNI 配置并重启 kubelet。

3.5 部署后参数调优清单

安装完成后,建议根据集群规模调整以下参数,为蓝绿发布场景做准备:

参数 推荐值 调优理由
bpf.masquerade true 启用 eBPF 伪装,避免 iptables MASQUERADE 性能开销
ipv4.enabled true 确保 IPv4 协议栈开启
ipv6.enabled false 如未使用 IPv6,关闭以减少资源占用
hubble.enabled true 开启 Hubble 可观测性,便于蓝绿发布流量监控
hubble.relay.enabled true 启用 Hubble Relay 实现集群级流量聚合
nodeinit.enabled true 自动配置节点内核参数(如 net.ipv4.conf.all.rp_filter)
蓝绿发布预调优: 在后续章节中,我们将基于 bpf.masquerade=true 和 hubble.enabled=true 配置,实现蓝绿 Service 的零信任流量隔离与可视化。建议在安装阶段就开启这些特性,避免后期重建 Cilium。

3.6 安装后 CNI 配置拓扑

下图展示了 Cilium 安装完成后,CNI 配置在节点上的完整拓扑关系,以及各组件之间的数据流路径。

Cilium CNI 配置拓扑 Kubernetes 节点 1 Cilium Agent eBPF 程序加载 CNI 配置 /etc/cni/net.d/05-cilium.conf Pod 网络命名空间 veth pair + 路由 Hubble 观测端点 Kubernetes 节点 2 Cilium Agent eBPF 程序加载 CNI 配置 /etc/cni/net.d/05-cilium.conf Pod 网络命名空间 veth pair + 路由 Hubble 观测端点 Kubernetes 控制面 API Server Pod / Service 事件 Cilium Operator IPAM · 策略同步 Hubble Relay 集群流量聚合 VXLAN/DSR VXLAN/DSR
验证总结: 完成上述安装与检查后,Cilium 将以 kube-proxy 替换模式运行,CNI 配置独占节点,所有 Pod 网络流量均通过 eBPF 程序处理。此时集群已具备蓝绿发布所需的网络基础:高性能 Service 转发、可观测性数据采集、以及后续准入控制策略的执行能力。