calico VXLAN 模式有哪些
| 模式 | 同子网通信 | 跨子网通信 | 性能 | 网络要求 | 推荐场景 |
|---|---|---|---|---|---|
Never |
直接路由 | 直接路由* | 最优 | 节点间路由可达 | BGP 网络环境 |
Always |
VXLAN 封装 | VXLAN 封装 | 较好 | 节点 IP 可达 | 简单 Overlay 网络 |
CrossSubnet |
直接路由 | VXLAN 封装 | 最佳平衡 | 智能检测子网 | 大多数生产环境 |
1. Never - 禁用 IPIP
完全禁用 IPIP 隧道,使用纯路由模式。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Never # 禁用 IPIP 隧道
natOutgoing: true
特点:
-
不创建
tunl0隧道接口 -
依赖 BGP 或底层网络路由传播 Pod 路由
-
性能最优,无封装开销
-
要求节点在同一二层网络或网络设备支持 BGP
适用场景:
-
节点在同一子网
-
使用 BGP 与物理网络集成
-
对性能要求最高的环境
2. Always - 始终启用 IPIP
所有流量都经过 IPIP 隧道,无论节点是否在同一子网。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Always # 始终使用 IPIP 封装
natOutgoing: true
特点:
-
所有 Pod 间通信都进行 IPIP 封装
-
创建
tunl0隧道接口 -
对底层网络要求最低(只需要节点间 IP 可达)
-
有封装开销,性能稍差
适用场景:
-
节点分布在多个子网
-
底层网络不支持 BGP
-
公有云环境
-
简单的 Overlay 网络需求
3. CrossSubnet - 跨子网时启用 IPIP
智能混合模式 - 同子网无封装,跨子网使用 IPIP。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: CrossSubnet # 仅在跨子网时使用 IPIP
natOutgoing: true
特点:
-
同一子网内:直接路由,无封装
-
不同子网间:使用 IPIP 隧道封装
-
自动检测节点子网信息
-
性能和灵活性的最佳平衡
适用场景:
-
大多数生产环境的推荐选择
-
节点分布在多个子网
-
需要兼顾性能和跨子网通信
配置方法
方法一:安装时配置
在安装 Calico 时,直接创建配置正确的 IPPool:
# calico-ipip-crosssubnet.yaml
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: CrossSubnet
natOutgoing: true
---
# Calico 的其他安装资源(DaemonSet、ConfigMap 等)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: calico-node
namespace: kube-system
# ... 其他 Calico 安装配置
应用配置:
kubectl apply -f calico-ipip-crosssubnet.yaml
方法二:修改现有集群
对于已运行的集群,修改现有 IPPool:
-
备份当前配置:
calicoctl get ippool -o yaml > ippool-backup.yaml
-
编辑 IPPool:
calicoctl get ippool default-ipv4-ippool -o yaml > new-ippool.yaml
编辑 new-ippool.yaml:
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
# 注意:不要修改 metadata.uid 和 metadata.creationTimestamp
spec:
blockSize: 26
cidr: 192.168.0.0/16
ipipMode: CrossSubnet # 修改为所需模式
natOutgoing: true
nodeSelector: all()
vxlanMode: Never # 确保 VXLAN 被禁用
-
应用新配置:
calicoctl apply -f new-ippool.yaml
方法三:使用 calicoctl patch 命令
快速修改现有 IPPool:
# 修改为 CrossSubnet 模式
calicoctl patch ippool default-ipv4-ippool -p '{"spec": {"ipipMode": "CrossSubnet"}}'
# 修改为 Always 模式
calicoctl patch ippool default-ipv4-ippool -p '{"spec": {"ipipMode": "Always"}}'
# 修改为 Never 模式
calicoctl patch ippool default-ipv4-ippool -p '{"spec": {"ipipMode": "Never"}}'
验证配置
1. 检查 IPPool 状态
calicoctl get ippool -o wide
输出示例:
NAME CIDR NAT IPIPMODE VXLANMODE default-ipv4-ippool 192.168.0.0/16 true CrossSubnet Never
2. 检查隧道接口
# 检查 IPIP 隧道接口
ip addr show tunl0
# 检查接口状态
ip link show tunl0
3. 检查路由表
在不同子网的节点上检查路由:
# 查看 Pod 路由
ip route | grep 192.168
# 预期输出示例:
# 192.168.1.10 via 10.0.1.10 dev eth0 # 同子网,直接路由
# 192.168.2.20 dev tunl0 scope link # 跨子网,通过 IPIP 隧道
4. 网络连通性测试
# 在不同子网的节点上启动测试 Pod
kubectl run test-pod-1 --image=busybox --rm -it -- sh
# 在 Pod 中测试到其他 Pod 的连通性
# 使用 tcpdump 验证封装
tcpdump -i any -n proto 4 # 监听 IPIP 协议(协议号 4)
完整配置示例
场景:多子网数据中心
假设节点分布在 10.0.1.0/24 和 10.0.2.0/24 两个子网。
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
blockSize: 26
ipipMode: CrossSubnet
natOutgoing: true
nodeSelector: all()
场景:公有云单一子网
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Never # 节点在同一子网,禁用隧道
natOutgoing: true
场景:跨云混合部署
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Always # 节点在不同网络环境,始终使用隧道
natOutgoing: true
模式对比总结
| 模式 | 同子网通信 | 跨子网通信 | 性能 | 网络要求 | 推荐场景 |
|---|---|---|---|---|---|
Never |
直接路由 | 直接路由* | 最优 | 节点间路由可达 | 单一子网/BGP 环境 |
Always |
IPIP 封装 | IPIP 封装 | 较好 | 节点 IP 可达 | 简单 Overlay 网络 |
CrossSubnet |
直接路由 | IPIP 封装 | 最佳平衡 | 智能检测子网 | 多子网生产环境 |
*注:
Never模式下的跨子网通信需要底层网络支持 Pod CIDR 的路由传播。
故障排除
常见问题
-
IPIP 隧道无法建立
bash# 检查防火墙规则,确保允许 IPIP 协议(协议号 4) iptables -L | grep -i ipip # 检查隧道接口状态 ip link show tunl0 -
路由不正确
bash# 检查路由表 ip route show table all # 检查 Calico Felix 日志 kubectl logs -l k8s-app=calico-node -n kube-system -c calico-node -
网络策略阻塞
bash# 检查网络策略 calicoctl get networkpolicy -A
调试命令
# 查看 Calico 节点状态
calicoctl node status
# 查看 BGP 对等信息(如果使用 BGP)
calicoctl get bgppeer
# 查看端点和路由信息
calicoctl get workloadendpoint -A
calicoctl get block
选择指南
-
新建集群:从
CrossSubnet开始,它能在大多数场景下提供最佳平衡 -
单一子网:使用
Never获得最佳性能 -
复杂网络环境:使用
Always确保连通性 -
从 VXLAN 迁移:将
vxlanMode设为Never,ipipMode设为所需模式
记住,修改 IPIP 模式后,可能需要重启 Pod 或等待路由更新完全生效。
浙公网安备 33010602011771号