在现有 Kubernetes 集群中启用 Calico eBPF 数据平面
在现有 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 可以访问
kubernetesService 和 Endpoints
启用步骤
执行以下命令,Operator 将自动完成剩余配置:
kubectl patch installation.operator.tigera.io default --type merge -p \
'{"spec":{"calicoNetwork":{"linuxDataplane":"BPF", "bpfNetworkBootstrap":"Enabled", "kubeProxyManagement":"Enabled"}}}'
自动配置说明
执行后,Operator 将自动完成以下操作:
- 滚动更新 Calico 组件(无中断迁移)
- 自动配置 API Server 地址
- 禁用
kube-proxy以释放资源
⚠️ 注意:由于滚动更新的特性,部分节点会先进入 eBPF 模式,这可能导致短暂的 NodePort 流量中断。
后续优化
- 配置 DSR 模式 以获得最佳外部流量性能
方案二:手动启用(适用于所有兼容集群)
第一步:兼容性检查
支持的架构与平台
| 项目 | 支持情况 |
|---|---|
| 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),必须执行以下配置:
- 关闭 Calico 的 iptables 清理(避免与 kube-proxy 规则冲突):
kubectl patch felixconfiguration default --patch='{"spec": {"bpfKubeProxyIptablesCleanupEnabled": false}}'
- 修改健康检查端口(避免与 kube-proxy 默认 10256 端口冲突):
kubectl patch felixconfiguration default --patch='{"spec": {"bpfKubeProxyHealthzPort": 10258}}'
选择节点上未被占用的端口(如 10258),使用
ss -tlnp或netstat确认。
第四步: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"}}}' |
更多推荐




所有评论(0)