K8s-Calico 网络组件

在 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
模式切换示例
  1. 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
  2. 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)
模式切换示例
  1. 切换为 BGP 原生模式

    bash

    运行

    复制代码
    # 关闭 IPIP 和 VXLAN 隧道
    kubectl patch ippool.projectcalico.org default-ipv4-ippool \
      --type merge \
      -p '{"spec":{"ipipMode":"Never","vxlanMode":"Never"}}'
  2. 切换为 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"}}'
  3. 切换为 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 模式(隧道开销累积)
相关推荐
幽弥千月5 天前
k8s离线环境下部署【calico】网络插件
k8s
中杯可乐多加冰5 天前
深度解析openFuyao核心组件:从NUMA亲和调度看云原生算力释放新思路
华为·云原生·k8s·gpu算力·openfuyao
科技D人生5 天前
Kubernetes 学习总结(47)—— Kubernetes 持久化存储之 Volume、PV、PVC、StorageClass 到底怎么用?
云原生·容器·kubernetes·k8s·k8s 数据卷
新手小白*5 天前
Kubernetes 持久化存储与特殊容器
k8s
退役小学生呀8 天前
二十六、K8s集群备份恢复
linux·云原生·容器·kubernetes·k8s
悬弧10 天前
第2章:工作负载管理 - 可视化应用部署
kubernetes·k8s
fushan201210 天前
Windows 虚拟机配置与驱动安装记录
windows·k8s·vm·kubevirt
一只栖枝10 天前
K8s 认证级别怎么选?适配不同运维场景
云原生·容器·kubernetes·k8s·cka
虚伪的空想家10 天前
首发:TDengine3.3.6版本使用K8S部署
java·docker·容器·kubernetes·k8s·时序数据库·tdengine