Kubernetes Calico 最佳实践
下面是一份 最实用、工程级、能直接用在生产环境的《Kubernetes + Calico 最佳实践》,基于 Kubernetes ≥1.33 + Calico ≥3.27(含 eBPF 模式),包含网络设计、性能、安全、IPAM、Policy、Troubleshooting、监控、生产参数等内容。
这是企业级版本,不讲废话,只给可复制到生产环境的最佳实践。
🚀 Kubernetes + Calico 最佳实践(K8s 1.33 / Calico 3.27+)
Calico 支持多种网络模式,但要选正确:
🔥 最佳选型(强烈推荐)
Dataplane:eBPF(替代 iptables)
Overlay:VXLAN + eBPF NAT
IPAM:Calico IPAM
Routing:无 BGP(除非裸金属)
理由:
| 模式 | 性能 | 可观测性 | 兼容性 | 推荐 |
|---|---|---|---|---|
| VXLAN + eBPF | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 全云厂商支持 | ✓✓✓✓✓ |
| BGP 无封装 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 仅裸金属/自建 IDC | ✓✓✓✓ |
| IPIP | ⭐⭐⭐ | ⭐⭐ | 旧机器 | 不推荐 |
| 纯 iptables | ⭐ | ⭐⭐ | 兼容最广 | 不推荐 |
eBPF 对 K8s 1.33 完美支持
能替代 kube-proxy,并大幅提升性能。
使用官方 operator,让升级和管理更可控:
kubectl apply -f https://docs.projectcalico.org/archive/v3.27/manifests/calico.yaml
修改 ConfigMap:
apiVersion: operator.tigera.io/v1
kind: Installation
spec:
calicoNetwork:
linuxDataplane: "BPF"
mtu: 1450
encap: VXLAN
优势:
- 无 kube-proxy
- NAT/NodePort/LB 全走 BPF fast path
- 高 QPS 服务性能提升 30%–200%
避免使用 k8s podCIDR
必须使用 Calico IPAM(默认)
示例:
- frontend -> 10.10.0.0/16
- backend -> 10.20.0.0/16
- job/ci -> 10.30.0.0/16
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: frontend-pool
spec:
cidr: 10.10.0.0/16
ipipMode: Never
vxlanMode: Always
natOutgoing: true
避免把所有 Pod 都塞进同一个网段(难 debug 和隔离)。
VXLAN MTU 一般为:
原生 MTU 1500 -> VXLAN -> 1450
Calico 默认自动检测,但建议明确写:
mtu: 1450
eBPF 模式替代 kube-proxy
NodePort、ClusterIP NAT 都走 BPF fast path。
在跨节点访问不需要 SNAT 时:
spec:
calicoNetwork:
nodeAddressAutodetectionV4:
firstFound: true
linuxDataplane: "BPF"
autoDetectBackend: false
Pod ↔ Pod 最佳实践路径:
eBPF dataplane:
- 规则在 BPF maps
- conntrack 优化巨大
VXLAN overlay:
- 兼容所有云厂商
- 硬件 offload 高性能环境最快
最佳组合:
VXLAN + eBPF + 无 kube-proxy
Calico eBPF 模式可直接替代 kube-proxy:
linuxDataplane: BPF
ClusterIP 和 NodePort 都走 BPF,极大提高性能。
设置 conntrack:
net.netfilter.nf_conntrack_max=2621440
net.netfilter.nf_conntrack_buckets=655360
Calico 的 NP 能实现 Zero Trust。
在 Namespace 使用:
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: default-deny
spec:
selector: all()
types:
- Ingress
- Egress
示例:只允许 frontend -> backend
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
name: allow-frontend
namespace: backend
spec:
ingress:
- from:
- namespaceSelector:
matchLabels:
app: frontend
不能在同一个集群:
- 安装 Calico 后又安装 Flannel
- 原来有 CNI,不干净就装 Calico
-> 直接导致 Pod 无网络、路由混乱、CNM 冲突。
eBPF 模式下 kube-proxy 必须关闭。
调试最容易忽略:MTU。
仅推荐:
- 裸金属
- 自建机房
- 云厂商开启 VPC route table 支持 BGP 时
生产环境必须监控:
| 项目 | 说明 | | felix CPU | 规则过多会爆 | | BPF maps | 溢出会中断网络 | | VXLAN 封包 PPS | 常见瓶颈 | | conntrack | NodePort 高并发必须 | | IPPool 余量 | IP 用完 Pod 全挂
推荐工具:
- Prometheus + calico-exporter
- Grafana Calico Dashboard(官方)
ip route
ip -d link show vxlan.calico
kubectl get ippool
kubectl logs -n calico-system -l k8s-app=calico-node
| 分类 | 推荐配置 |
|---|---|
| Dataplane | eBPF |
| Overlay | VXLAN |
| 节点路由 | 无 BGP(云) / BGP(裸金属) |
| kube-proxy | 关闭 |
| MTU | 1450 |
| IPAM | Calico IPAM,多 IP pool |
| 策略 | Zero Trust(default deny + allow) |
| 加密 | WireGuard |
| 监控 | felix、ippool、vxlan、conntrack |