Calico 网络插件原理与跨节点通信配置

一、Calico 核心原理

Calico 是一种基于三层路由的容器网络方案,其核心是通过 BGP(边界网关协议) 实现节点间路由自动分发,无需传统 Overlay 网络(如 VXLAN)的封装开销。关键组件如下:

  1. Felix
    运行在每个节点上的守护进程,负责:

    • 配置本地路由表(route
    • 管理 ACL 规则(通过 iptables/eBPF
    • 汇报节点状态至 etcd/Kubernetes API
  2. BIRD
    BGP 客户端,负责:

    • 与其他节点的 BIRD 交换路由信息
    • 将本节点 Pod CIDR 宣告至集群
  3. 数据平面工作流
    跨节点通信流程(以 Pod A → Pod B 为例):

    graph LR
    A[Pod A] -->|1. 查路由表| B[Node1 路由表]
    B -->|2. 下一跳为 Node2 IP| C[Node1 物理网卡]
    C -->|3. 通过底层网络| D[Node2 物理网卡]
    D -->|4. 查路由表| E[Pod B]
    

二、跨节点通信配置
步骤 1:安装 Calico

通过 Kubernetes Manifest 部署(以 v3.25 为例):

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

步骤 2:验证基础配置
  1. 检查节点路由表
    在任意节点执行:

    ip route show | grep calico
    # 示例输出:10.244.1.0/24 via 192.168.0.2 dev eth0 
    

    其中 10.244.1.0/24 是目标节点 Pod CIDR,192.168.0.2 是目标节点 IP。

  2. 确认 BGP 邻居状态

    calicoctl node status
    # 输出应显示所有节点的 BGP 会话为 "Established"
    

步骤 3:关键调优场景
场景 1:跨子网通信

当节点位于不同子网时,需配置 BGP 路由反射器(Route Reflector)

  1. 部署反射器(选择 3 个节点):
    apiVersion: projectcalico.org/v3
    kind: BGPConfiguration
    metadata:
      name: default
    spec:
      logSeverityScreen: Info
      nodeToNodeMeshEnabled: false  # 关闭全互联模式
      serviceClusterIPs:
      - cidr: 10.96.0.0/12
    

  2. 标记路由反射器节点:
    calicoctl patch node k8s-node-1 -p '{"spec": {"bgp": {"routeReflectorClusterID": "224.0.0.1"}}}'
    

场景 2:策略控制

通过 NetworkPolicy 实现跨节点 ACL:

apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: allow-cross-node
spec:
  selector: role == 'db'
  ingress:
    - action: Allow
      source:
        namespaceSelector: project == 'prod'
  egress:
    - action: Allow
      destination:
        ports: [5432]

三、性能优化建议
  1. 启用 eBPF 数据平面(需 Linux 4.18+ 内核)
    替换默认 iptables 以提升吞吐量:

    calicoctl patch kubecontrollers configuration --patch='{"spec": {"controllers": {"node": {"hostEndpoint": {"autoCreate": "Disabled"}}}}}'
    calicoctl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"linuxDataplane":"eBPF"}}}'
    

  2. MTU 配置
    避免物理网络 MTU 小于 Pod 网络:

    apiVersion: operator.tigera.io/v1
    kind: Installation
    metadata:
      name: default
    spec:
      calicoNetwork:
        mtu: 1440  # 根据底层网络调整
    

四、故障排查命令
问题类型 诊断命令
BGP 邻居异常 calicoctl node status
跨节点路由缺失 ip route get <目标PodIP>
策略未生效 calicoctl get networkpolicy -o yaml
数据包丢弃分析 calicoctl diags 收集日志

注意:Calico 默认使用 IP-in-IP 封装跨子网流量,可通过 ipipMode: Never 禁用(要求节点间二层可达)。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐