在 Kubernetes 集群部署中,网络插件的选择至关重要,它直接影响集群的通信效率、稳定性和扩展性。Calico 作为一款开源的容器网络解决方案,凭借其基于 BGP 协议的高性能特性和强大的网络策略能力,成为众多 K8s 集群的首选。本文将详细介绍 Calico 在 K8s 1.28.15 版本中的适配情况,包括核心模式、切换方法及选型建议。
一、Calico 概述
Calico 是一款基于 BGP(边界网关协议)实现容器间网络互联的解决方案,同时提供强大的网络策略(Network Policy)能力,可用于精细控制容器间的访问权限。对于 K8s 1.28.15 版本,经过验证,Calico 3.27.x 系列版本(推荐 3.27.3 及以上)能够完全兼容,满足集群网络的核心需求:
- 支持 Pod 网络跨节点通信
- 兼容 Service 资源的负载均衡机制
- 适配 Kubernetes 网络策略标准
- 可选支持 IPv4/IPv6 双栈
Calico 的核心优势包括:
- 高性能:基于 BGP 路由转发,无需额外隧道封装(部分模式除外),网络延迟低、吞吐量高
- 灵活的网络模式:支持 BGP 原生模式、IPIP 隧道模式、VXLAN 隧道模式等,适配不同网络环境
- 强大的网络策略:可基于 Pod 标签、命名空间、端口等维度定义精细化访问控制规则
- 高可靠性:支持故障自动切换、节点健康检查等机制,保障网络服务连续性
- 易于运维:提供丰富的命令行工具(calicoctl)和监控指标,方便管理和问题排查
二、Calico 核心模式解析(适配 K8s 1.28.15)
Calico 针对 K8s 1.28.15 集群提供三种核心部署模式,核心差异在于 Pod 间跨节点通信的实现方式,需根据集群网络拓扑和需求选择。
2.1 BGP 原生模式
工作原理
BGP 原生模式下,每个 K8s 节点上的 calico-node 组件作为 BGP 发言人,将本节点 Pod 的 CIDR 网段路由信息通过 BGP 协议同步到集群内其他节点及外部 BGP 路由器。Pod 跨节点通信时,数据包直接通过节点间路由表转发,无需隧道封装,实现原生三层网络互联。
适用场景
- 集群所有节点处于同一二层网络(如同一机房、同一 VLAN)
- 对网络性能要求高(如高性能计算、大数据处理等低延迟场景)
- 需要与集群外部网络通过 BGP 协议互联
优势与不足
- 优势:网络性能最优(无隧道封装损耗);架构简单,依赖标准 BGP 协议;支持与外部 BGP 网络无缝集成
- 不足:依赖节点间二层网络连通性,不适用于跨网段 / 跨机房部署;需要网络环境支持 BGP 协议
2.2 IPIP 隧道模式
工作原理
IPIP 隧道模式是一种叠加网络模式,每个节点会创建虚拟 tunl0 隧道接口。Pod 跨节点通信时,发送节点将 Pod 数据包封装在新的 IP 数据包中(外层 IP 为节点主机 IP),通过隧道发送到目标节点,目标节点解封装后转发至目标 Pod。
适用场景
- 集群节点跨网段部署(如不同 VLAN、不同机房)
- 网络环境不支持 BGP 协议
- 对跨节点通信性能要求中等(可接受轻微隧道封装损耗)
优势与不足
- 优势:不受节点网络拓扑限制,支持跨网段 / 跨机房部署;配置简单,开箱即用;兼容性强,适用于大多数私有网络环境
- 不足:存在隧道封装 / 解封装性能损耗(延迟略高于 BGP 模式);不支持与外部网络直接通过隧道互联
2.3 VXLAN 隧道模式
工作原理
VXLAN 隧道模式同样是叠加网络模式,采用 UDP 封装(默认端口 4789)。每个节点创建虚拟 vxlan.calico 接口,Pod 跨节点通信时,数据包被封装在 UDP 数据包中(外层 IP 为节点主机 IP),通过 VXLAN 接口发送,目标节点解封装后转发至目标 Pod。
适用场景
- 集群节点跨 NAT 部署(如不同云厂商 VPC、不同家庭网络)
- 云环境下的 K8s 集群(多数云厂商支持 VXLAN 协议)
- 节点数量较多的大规模集群(VXLAN 扩展性优于 IPIP)
优势与不足
- 优势:NAT 穿透能力强,适用于复杂跨网络场景;扩展性好,支持数千节点规模;与云环境兼容性好
- 不足:性能损耗高于 BGP 和 IPIP 模式(UDP 封装额外开销);需要网络环境放行 UDP 4789 端口
三、Calico 模式修改方法(适配 K8s 1.28.15)
Calico 模式修改的核心是调整 IPPool 资源配置,以下介绍两种常用方法(calicoctl 和 kubectl)。
3.1 calicoctl 方式
前提条件
-
已部署 Calico 3.27.x 版本
-
安装 calicoctl 工具: bash
运行
# 下载 calicoctl wget https://github.com/projectcalico/calico/releases/download/v3.27.3/calicoctl-linux-amd64 chmod +x calicoctl-linux-amd64 sudo mv calicoctl-linux-amd64 /usr/local/bin/calicoctl alias calicoctl='calicoctl --allow-version-mismatch' -
备份现有配置: bash
运行
calicoctl get ippool -o yaml > calico-ippool-backup.yaml calicoctl get bgpconfiguration default -o yaml > calico-bgpconfig-backup.yaml
模式切换示例
-
IPIP 模式 → BGP 原生模式:
bash
运行
# 修改 ipipMode 为 Never calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"Never"}}' # 验证 calicoctl get ippool default-ipv4-ippool -o yaml | grep ipipMode -
BGP 模式 → VXLAN 模式:
bash
运行
# 开启 VXLAN 并关闭 IPIP calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"ipipMode":"Never","vxlanMode":"Always"}}' # 配置 VXLAN 参数(可选) calicoctl patch bgpconfiguration default -p '{"spec":{"vxlanPort":4789,"vxlanSourceAddress":"HostIP"}}' # 重启 calico-node kubectl rollout restart daemonset calico-node -n kube-system
3.2 kubectl 方式(无需 calicoctl)
前提条件
-
确认 IPPool 名称(默认通常为
default-ipv4-ippool) -
备份配置: bash
运行
kubectl get ippool.projectcalico.org -o yaml > calico-ippool-backup.yaml
核心配置字段
Calico 网络模式通过 IPPool 资源的以下字段控制:
| 字段名 | 取值范围 | 说明 |
|---|---|---|
ipipMode |
Never/Always/CrossSubnet |
IPIP 隧道模式控制 |
vxlanMode |
Never/Always/CrossSubnet |
VXLAN 隧道模式控制 |
natOutgoing |
true/false |
是否对 Pod 访问外网流量做 SNAT(通常为 true) |
模式切换示例
-
切换为 BGP 原生模式:
bash
运行
# 关闭 IPIP 和 VXLAN 隧道 kubectl patch ippool.projectcalico.org default-ipv4-ippool \ --type merge \ -p '{"spec":{"ipipMode":"Never","vxlanMode":"Never"}}' -
切换为 IPIP 隧道模式:
bash
运行
# 强制开启 IPIP(所有跨节点通信走隧道) kubectl patch ippool.projectcalico.org default-ipv4-ippool \ --type merge \ -p '{"spec":{"ipipMode":"Always","vxlanMode":"Never"}}' # 或仅跨子网开启 IPIP(同子网不走隧道,更优性能) kubectl patch ippool.projectcalico.org default-ipv4-ippool \ --type merge \ -p '{"spec":{"ipipMode":"CrossSubnet","vxlanMode":"Never"}}' -
切换为 VXLAN 隧道模式:
bash
运行
# 强制开启 VXLAN kubectl patch ippool.projectcalico.org default-ipv4-ippool \ --type merge \ -p '{"spec":{"ipipMode":"Never","vxlanMode":"Always"}}' # 重启 calico-node 确保生效 kubectl rollout restart daemonset calico-node -n kube-system
3.3 模式修改注意事项
- 修改可能导致短暂网络中断,建议在业务低峰期执行
- 若通信异常,可重启相关 Pod 或通过备份配置回滚:
kubectl apply -f calico-ippool-backup.yaml - VXLAN 模式需确保节点间 UDP 4789 端口放行,IPIP 模式需放行 IP 协议号 94
- 大规模集群(节点数 > 100)修改后建议观察 5-10 分钟,确认网络稳定性
四、模式选型建议
选择 Calico 网络模式时,需结合集群网络环境、性能需求和规模综合判断:
| 场景特点 | 推荐模式 |
|---|---|
| 同一二层网络、高性能需求 | BGP 原生模式 |
| 跨网段、无 BGP 支持 | IPIP 隧道模式 |
| 跨 NAT、云环境、大规模集群 | VXLAN 隧道模式 |
| 核心业务 / 金融交易 / 实时计算 | BGP 原生模式 |
| 公有云 / 混合云 / 多租户隔离 | VXLAN 隧道模式 |
| 小规模跨子网集群 / 测试环境 | IPIP 隧道模式 |
| 超大规模集群(1000 + 节点) | BGP 原生模式 |
| IPv6 部署环境 | BGP 原生模式 |
避坑指南:
- 公有云环境避免使用 BGP 模式(底层路由不可控)
- 高性能需求场景避免使用 VXLAN 模式(延迟开销大)
- IPv6 环境避免使用 IPIP 模式(兼容性差)
- 大规模集群(>500 节点)避免使用 IPIP/VXLAN 模式(隧道开销累积)