在现有 Kubernetes 集群中启用 Calico eBPF 数据平面

适用场景:已在运行中的集群,希望从标准 iptables 模式迁移至 eBPF 模式以获得更高性能和更低延迟。


方案选择

集群类型 推荐方案 说明
kubeadm / 自建集群 自动启用 通过 Tigera Operator 一键配置,自动处理 API Server 连接和 kube-proxy 禁用
EKS / AKS / OpenShift / kOps / MKE 等 手动启用 需手动配置 API Server 直连、禁用 kube-proxy 等步骤

⚠️ 重要前置步骤

如果您当前使用 IPVS 模式kube-proxy必须先切换为 iptables 模式,然后重启所有节点,再继续以下步骤。

方案一:自动启用(推荐用于 kubeadm 集群)

前置条件

  • 集群使用 kubeadm 或基于 kubeadm 的工具创建
  • 已使用 Tigera Operator 安装 Calico
  • kube-proxy 正在 kube-system 命名空间中运行
  • kube-proxy 未被 Helm、ArgoCD 等自动化工具管理
  • Tigera Operator 可以访问 kubernetes Service 和 Endpoints

启用步骤

执行以下命令,Operator 将自动完成剩余配置:

kubectl patch installation.operator.tigera.io default --type merge -p \
  '{"spec":{"calicoNetwork":{"linuxDataplane":"BPF", "bpfNetworkBootstrap":"Enabled", "kubeProxyManagement":"Enabled"}}}'

自动配置说明

执行后,Operator 将自动完成以下操作:

  1. 滚动更新 Calico 组件(无中断迁移)
  2. 自动配置 API Server 地址
  3. 禁用 kube-proxy 以释放资源

⚠️ 注意:由于滚动更新的特性,部分节点会先进入 eBPF 模式,这可能导致短暂的 NodePort 流量中断。

后续优化


方案二:手动启用(适用于所有兼容集群)

第一步:兼容性检查

支持的架构与平台
项目 支持情况
CPU 架构 x86-64, arm64 (小端序)
Kubernetes 数据存储 Kubernetes API(不支持 etcd 数据存储
Linux 内核 Ubuntu 22.04;RHEL 8.4+ (内核 ≥ 4.18.0-305);或其他发行版内核 ≥ 5.10
底层网络 必须允许节点间 VXLAN 流量(eBPF 模式使用 VXLAN 转发 NodePort 流量)
支持的 Kubernetes 发行版
  • ✅ Generic / kubeadm
  • ✅ kOps
  • ✅ OpenShift
  • ✅ EKS
  • ✅ AKS(有限制:Azure CNI + Calico 网络策略可用,但无法禁用 kube-proxy)
  • ✅ RKE(推荐 RKE2,支持禁用 kube-proxy)
  • ✅ MKE
不支持的平台
  • ❌ GKE(与 GKE CNI 插件不兼容)
  • ❌ 混合节点集群(部分 eBPF 节点 + 部分标准数据平面/Windows 节点)
  • ❌ etcd 数据存储驱动
  • ❌ 其他 CPU 架构
功能限制
  • ❌ IPIP 隧道(eBPF 模式下请使用 VXLAN)
  • ❌ Floating IPs
  • ❌ SCTP 协议(策略和服务均不支持)
  • ❌ 无硬件卸载的 VLAN 流量
验证内核版本
uname -rv

预期输出示例

# Ubuntu 示例(内核 5.10,符合要求)
5.10.0-26-generic #28~20.04.1-Ubuntu SMP Fri Jan 27 14:30:10 UTC 2023

# RHEL 示例(内核 4.18.0-305,符合要求)
4.18.0-305.el8.x86_64 (mockbuild@x86-vm-08.build.eng.bos.redhat.com)

第二步:配置 Calico 直连 API Server

为什么需要这一步:eBPF 模式下 Calico 直接实现 Kubernetes Service 网络,替代 kube-proxy。因此需要 Calico 能够直接访问 API Server,而非通过 kube-proxy 转发。

确定 API Server 地址

根据您的集群类型选择正确的地址:

集群类型 API Server 地址 (KUBERNETES_SERVICE_HOST) 端口 (KUBERNETES_SERVICE_PORT) 说明
kubeadm (单控制平面) 控制平面节点稳定地址(DNS/静态 IP) 6443 避免使用动态 IP(如 EC2 私有 IP)
kubeadm (高可用) 负载均衡器地址 6443 前置 LB 的地址
kOps api.internal.<clustername> 443 kOps 自动创建的 LB FQDN
OpenShift api-int.<cluster_name>.<base_domain> 6443 OpenShift 要求的 DNS 记录
MKE proxy.local 6444 每个节点运行的反向代理
EKS / AKS 通过以下命令获取 LB FQDN 443 见下方获取方法

获取 EKS/AKS API Server 地址

kubectl cluster-info

输出示例:

Kubernetes master is running at https://60F939227672BC3D5A1B3EC9744B2B21.gr7.us-west-2.eks.amazonaws.com

提取主机名:60F939227672BC3D5A1B3EC9744B2B21.gr7.us-west-2.eks.amazonaws.com,端口:443

创建 ConfigMap

适用于 Operator 安装方式

tigera-operator 命名空间创建 ConfigMap:

cat <<EOF | kubectl apply -f -
kind: ConfigMap
apiVersion: v1
metadata:
  name: kubernetes-services-endpoint
  namespace: tigera-operator
data:
  KUBERNETES_SERVICE_HOST: '<API server host>'
  KUBERNETES_SERVICE_PORT: '<API server port>'
EOF
用 Manifest 清单文件方式安装如下:

kube-system如果您使用清单文件安装了 Calico,请使用上面确定的主机和端口在命名空间中创建以下配置映射:

kind: ConfigMap
apiVersion: v1
metadata:
  name: kubernetes-services-endpoint
  namespace: kube-system
data:
  KUBERNETES_SERVICE_HOST: '<API server host>'
  KUBERNETES_SERVICE_PORT: '<API server port>'

删除重启:

kubectl delete pod -n kube-system -l k8s-app=calico-node
kubectl delete pod -n kube-system -l k8s-app=calico-kube-controllers

验证配置生效

watch kubectl get pods -n calico-system

确认所有 Pod 重新启动并达到 Running 状态。

💡 提示:如果 Pod 未重启,可能是 ConfigMap 传播延迟(已知 Kubernetes Issue #30189)。可尝试重启 Operator:

kubectl delete pod -n tigera-operator -l name=tigera-operator

第三步:配置 kube-proxy

注意:eBPF 模式下 Calico 已替代 kube-proxy,同时运行两者会浪费资源并降低性能。

方案 A:禁用 kube-proxy(推荐)

适用于 kubeadm 等使用 DaemonSet 部署的集群

通过添加不匹配任何节点的 NodeSelector 来禁用:

kubectl patch ds -n kube-system kube-proxy -p \
  '{"spec":{"template":{"spec":{"nodeSelector":{"non-calico": "true"}}}}}'

恢复 kube-proxy(如需回滚):

kubectl patch ds -n kube-system kube-proxy --type merge -p \
  '{"spec":{"template":{"spec":{"nodeSelector":{"non-calico": null}}}}}'

OpenShift 集群

# 禁用
kubectl patch networks.operator.openshift.io cluster --type merge -p \
  '{"spec":{"deployKubeProxy": false}}'

# 恢复
kubectl patch networks.operator.openshift.io cluster --type merge -p \
  '{"spec":{"deployKubeProxy": true}}'

MKE 集群

通过 MKE 配置界面修改,添加:

kube_proxy_mode: disabled
kube_default_drop_masq_bits: true
方案 B:无法禁用 kube-proxy 时的冲突避免

如果 kube-proxy 由平台管理(如 AKS Azure CNI),必须执行以下配置:

  1. 关闭 Calico 的 iptables 清理(避免与 kube-proxy 规则冲突):
kubectl patch felixconfiguration default --patch='{"spec": {"bpfKubeProxyIptablesCleanupEnabled": false}}'
  1. 修改健康检查端口(避免与 kube-proxy 默认 10256 端口冲突):
kubectl patch felixconfiguration default --patch='{"spec": {"bpfKubeProxyHealthzPort": 10258}}'

选择节点上未被占用的端口(如 10258),使用 ss -tlnpnetstat 确认。


第四步:MKE 特殊配置(如适用)

仅适用于 MKE 集群,因 Docker Swarm 与 Calico VXLAN 端口冲突。

必须在启用 eBPF 前修改 VXLAN 端口

kubectl patch felixconfiguration default --type merge -p '{"spec":{"vxlanPort":4790}}'

验证配置生效

# 等待 calico-node Pod 重建 VXLAN 设备后执行
kubectl exec -n calico-system <calico-node-pod> -- ip -d link show vxlan.calico

确认输出显示 dstport 4790 且状态为 UP


第五步:启用 eBPF 模式

kubectl patch installation.operator.tigera.io default --type merge -p \
  '{"spec":{"calicoNetwork":{"linuxDataplane":"BPF"}}}'

迁移过程说明

  • Operator 执行滚动更新(理论上无中断)
  • 节点会逐个切换至 eBPF 模式
  • 切换期间 NodePort 流量可能短暂中断
  • 已有连接继续使用非 eBPF 路径,不会被中断,但无法享受 eBPF 性能优势

启用 DSR(直接服务器返回)模式

DSR 模式跳过网络中的一跳,降低外部流量(如 NodePort)的延迟和 CPU 开销。

前置要求

  • 底层网络允许节点使用彼此的 IP 发送流量
  • AWS:所有节点在同一子网,且禁用 Source/Dest Check
  • GCP:启用 IP 转发(自动禁用 Source/Dest Check)

启用命令

calicoctl patch felixconfiguration default --patch='{"spec": {"bpfExternalServiceMode": "DSR"}}'

恢复隧道模式

calicoctl patch felixconfiguration default --patch='{"spec": {"bpfExternalServiceMode": "Tunnel"}}'

⚠️ 注意:切换外部流量模式会中断进行中的连接。


回滚至标准 Linux 网络

如需恢复 iptables 模式,按以下步骤操作:

1. 切换数据平面模式

kubectl patch installation.operator.tigera.io default --type merge -p \
  '{"spec":{"calicoNetwork":{"linuxDataplane":"Iptables"}}}'

2. 恢复 kube-proxy

  • 自动配置:Operator 会自动重新部署 kube-proxy
  • 手动禁用:移除之前添加的 NodeSelector
kubectl patch ds -n kube-system kube-proxy --type merge -p \
  '{"spec":{"template":{"spec":{"nodeSelector":{"non-calico": null}}}}}'
  • MKE:修改配置 kube_proxy_mode: iptables

3. 监控应用状态

⚠️ 注意:禁用 eBPF 模式会中断现有连接,请监控工作负载确保连接重新建立。


快速参考:关键命令汇总

操作 命令
自动启用 eBPF kubectl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"linuxDataplane":"BPF", "bpfNetworkBootstrap":"Enabled", "kubeProxyManagement":"Enabled"}}}'
手动启用 eBPF kubectl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"linuxDataplane":"BPF"}}}'
禁用 kube-proxy kubectl patch ds -n kube-system kube-proxy -p '{"spec":{"template":{"spec":{"nodeSelector":{"non-calico": "true"}}}}}'
启用 DSR calicoctl patch felixconfiguration default --patch='{"spec": {"bpfExternalServiceMode": "DSR"}}'
回滚 iptables kubectl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"linuxDataplane":"Iptables"}}}'
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐