一、为什么选择Calico?从场景说起

在Kubernetes集群中,网络插件如同血管般重要。
某次生产事故让我深刻理解Calico的价值:某金融系统要求跨数据中心互联(混合云架构),同时需实现不同业务单元的严格隔离。
当Flannel和Weave因性能瓶颈和路由能力不足而失败时,Calico的BGP模式直接解决了跨节点路由公告问题,而其网络策略实现了基于身份的动态管控。

典型应用场景

  1. 混合云/跨数据中心网络拓扑
  2. 需要精细控制网络流量的企业级环境(如PCI-DSS合规场景)
  3. 对网络性能有极高要求的AI训练集群

二、手把手部署Calico网络插件

(技术栈:Kubernetes v1.25 + Calico v3.24.1)

步骤拆解

kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml

# 定制安装配置文件(重点参数说明)
cat <<EOF | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  # 开启BGP模式
  calicoNetwork:
    bgp: Enabled
  # 设置IP池(需符合实际网络规划)
  ipPools:
  - cidr: 192.168.0.0/16
    blockSize: 26
    natOutgoing: true
EOF

# 验证安装(关键检查点)
calicoctl get nodes -o wide  # 必须显示所有节点的BGP状态
kubectl get pods -n calico-system  # 所有组件应为Running

三、BGP模式实战:让集群学会"说话"

BGP基础配置示例

# bgppeer.yaml(建立与物理路由器的对等连接)
apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: edge-router-peer
spec:
  peerIP: 10.20.30.40      # 物理路由器IP
  asNumber: 64512          # 自治系统号(需与网络团队确认)
  nodeSelector: all()      # 所有节点建立对等连接

高级路由控制案例

# bgpfilter.yaml(实现跨集群路由过滤)
apiVersion: projectcalico.org/v3
kind: BGPFilter
metadata:
  name: prod-filter
spec:
  exportV4:
    - action: Accept
      matchOperator: In
      cidr: 172.16.0.0/16  # 仅允许该网段路由广播
    - action: Reject        # 阻止其他路由泄露

排坑日志
某次配置后节点出现BGP not established错误,最终发现是物理防火墙阻止了TCP 179端口。
建议使用calicoctl node status实时检查对等连接状态。


四、网络策略:打造钢铁防线

基础隔离示例

# frontend-policy.yaml
apiVersion: projectcalico.org/v3
kind: NetworkPolicy
metadata:
  name: frontend-access
spec:
  selector: role == 'frontend'
  ingress:
    - action: Allow
      protocol: TCP
      source:
        selector: role == 'backend'  # 仅允许后端访问
      destination:
        ports: [80, 443]
  egress:
    - action: Deny                   # 禁止外联敏感端口
      protocol: TCP
      destination:
        ports: [3306]

跨命名空间管控

# cross-ns-policy.yaml
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
  name: ns-isolation
spec:
  namespaceSelector: env == 'prod'
  ingress:
    - action: Allow
      source:
        namespaceSelector: env == 'prod'  # 仅允许生产环境内部通信

五、技术选型对比:为什么是Calico?

BGP模式优势

  • 直接利用现有网络设备,避免Overlay的性能损耗
  • 支持细粒度路由策略(如AS-Path过滤)
  • 便于网络可视化(通过BGP路由表)

潜在缺陷

  • 需要网络运维团队协同配置
  • 默认安装无法实现跨子网通信(需显式配置IP池)
  • 策略过多可能影响iptables性能(可切换到eBPF数据面)

六、生产环境注意事项

  1. 版本兼容性矩阵
    Calico版本必须严格对应Kubernetes版本(如v3.24支持k8s 1.23-1.25)

  2. IP地址规划黄金法则

    推荐BlockSize公式:log₂(预期最大节点数 × 每个节点Pod数) + 1
    
  3. 性能优化配置

    # felixconfiguration.yaml(调整连接追踪参数)
    apiVersion: projectcalico.org/v3
    kind: FelixConfiguration
    metadata:
      name: default
    spec:
      bpfEnabled: true              # 启用eBPF模式
      iptablesNATOutgoing: false    # 禁用SNAT
      conntrackMaxPerCore: 2000000  # 提升连接跟踪数