保姆级教程:从Flannel迁移到Calico,手把手教你配置K8s网络策略(含常见错误排查)
·
从Flannel到Calico的平滑迁移实战指南:原理、配置与网络策略进阶
在Kubernetes生态中,网络插件的选择直接影响集群性能和安全边界。当Flannel的简单性无法满足企业级网络策略需求时,Calico以其高性能数据平面和精细的网络安全模型成为自然演进的选择。本文将深入剖析两种插件的架构差异,提供零宕机迁移方案,并解锁Calico网络策略的完整能力链。
1. 迁移前的深度技术评估
Flannel与Calico代表了Kubernetes网络模型的两种哲学。Flannel作为典型的overlay网络方案,通过VXLAN封装实现跨节点Pod通信,其优势在于配置简单、对底层网络零要求。但这种 simplicity comes at a cost - 缺乏精细的流量控制能力,所有Pod默认全互通,这在多租户场景下埋下安全隐患。
Calico则采用纯三层路由方案,每个Pod获得可路由的IP地址,通过BGP协议在节点间同步路由表。其核心组件包括:
- Felix :负责节点本地路由和ACL规则的编程
- BIRD :轻量级BGP客户端,传播路由信息
- Typha :大规模部署时的数据存储代理
迁移前需要重点评估:
# 检查当前Flannel网络健康状况
kubectl get pods -n kube-system -l app=flannel
ip route show | grep flannel
性能对比矩阵 :
| 特性 | Flannel (VXLAN模式) | Calico (BGP模式) |
|---|---|---|
| 网络延迟 | ~15% overhead | 接近物理网络 |
| 吞吐量 | 受MTU限制 | 线速转发 |
| 策略执行点 | 仅节点边界 | 每个Pod粒度 |
| 跨云网络兼容性 | 优秀 | 依赖BGP对等 |
2. 无中断迁移操作手册
2.1 预迁移环境准备
首先建立迁移前后的网络连通性保障:
# 备份现有CNI配置
mkdir -p /opt/cni/backup
cp /etc/cni/net.d/* /opt/cni/backup/
# 临时启用双协议栈支持(需k8s 1.20+)
kubectl patch ds kube-proxy -n kube-system --patch '{
"spec": {
"template": {
"spec": {
"containers": [{
"name": "kube-proxy",
"env": [{
"name": "ENABLE_DUALSTACK",
"value": "true"
}]
}]
}
}
}
}'
2.2 Calico定制化安装
针对生产环境优化的calico.yaml关键配置:
# 禁用IPIP隧道(直接路由模式)
- name: CALICO_IPV4POOL_IPIP
value: "Never"
# 启用eBPF数据平面(需Linux 4.18+)
- name: FELIX_BPFENABLED
value: "true"
# 设置MTU探测(避免分片)
- name: FELIX_MTU
value: "1440"
部署命令需遵循特定顺序:
# 先安装CRD(避免资源竞争)
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
# 等待CRD就绪后再部署主组件
until kubectl get crd felixconfigurations.crd.projectcalico.org; do sleep 1; done
kubectl apply -f calico.yaml
注意:在BGP模式下,需确保节点间TCP 179端口互通。云环境可能需要配置安全组例外。
3. 网络策略实战进阶
3.1 零信任策略框架设计
基础隔离策略模板:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
策略组合模式 :
- 命名空间隔离 :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: cross-ns-allow
namespace: production
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
env: monitoring
- 服务微分段 :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-tier-policy
spec:
podSelector:
matchLabels:
tier: database
ingress:
- ports:
- port: 5432
from:
- podSelector:
matchLabels:
tier: application
3.2 策略验证工具链
使用calicoctl进行策略模拟测试:
# 安装calicoctl
curl -L https://github.com/projectcalico/calico/releases/download/v3.21.0/calicoctl-linux-amd64 -o /usr/local/bin/calicoctl
chmod +x /usr/local/bin/calicoctl
# 策略预检查
calicoctl apply --dry-run -f policy.yaml
# 生成流量图谱
calicoctl profile show --detailed
4. 生产环境故障排查体系
4.1 连通性诊断三板斧
诊断工具集 :
# 检查BGP对等状态
calicoctl node status
# 追踪跨节点路由
traceroute -n $(kubectl get pod -l app=target -o jsonpath='{.items[0].status.podIP}')
# 抓取Felix日志
kubectl logs -n kube-system -l k8s-app=calico-node -c calico-node | grep -i drop
常见错误代码对照表 :
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| BGP会话无法建立 | 节点间179端口阻塞 | 检查防火墙/安全组规则 |
| 策略未生效 | 命名空间标签不匹配 | 检查namespaceSelector范围 |
| Pod无法访问Service IP | kube-proxy未正确配置 | 验证iptables/nftables规则 |
4.2 性能调优参数
在大型集群中调整BGP配置:
apiVersion: projectcalico.org/v3
kind: BGPConfiguration
metadata:
name: default
spec:
logSeverityScreen: Info
nodeToNodeMeshEnabled: true
asNumber: 64512
serviceClusterIPs:
- cidr: 10.96.0.0/12
对于超过500节点的集群,建议启用路由反射器:
calicoctl create -f - <<EOF
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
name: route-reflector
spec:
nodeSelector: has(route-reflector)
peerSelector: has(route-reflector)
routeReflectorClusterID: 244.0.0.1
EOF
5. 迁移后的监控与优化
部署Calico专属监控面板:
# 安装Prometheus监控CRD
kubectl apply -f https://docs.projectcalico.org/manifests/calico-monitoring.yaml
# 关键监控指标告警规则示例
- alert: HighBGPFlaps
expr: sum(rate(bgp_session_state_changes_total[5m])) by (instance) > 3
for: 10m
labels:
severity: warning
annotations:
summary: "BGP session instability on {{ $labels.instance }}"
性能基准测试方法 :
# 安装网络性能测试工具
kubectl apply -f https://k8s.io/examples/application/cloud/network-perf.yaml
# 执行跨节点吞吐量测试
kubectl exec -it netperf-client -- netperf -H <server-pod-ip> -t TCP_STREAM
在完成所有验证后,可安全移除Flannel残留配置:
# 清理Flannel接口
ip link delete flannel.1
rm -rf /var/lib/cni/flannel
# 最终确认Calico网络状态
calicoctl get hep -o wide
更多推荐


所有评论(0)