3. Calico 安装与基础配置:使用 Operator 方式安装 Calico,配置默认 IP 池与网络模式

3.1 安装方式选型:为什么选择 Operator

在生产级平台门户中,Calico 的安装方式直接影响后续的运维效率与策略一致性。对比三种主流安装方式,Operator 模式在声明式管理、自动升级、配置漂移防护方面具有明显优势。

安装方式 适用场景 升级方式 配置管理 平台集成度
Operator (推荐) 生产环境、GitOps 交付 自动滚动升级 CRD 声明式 高,原生适配 Kubernetes
Manifest (kubectl apply) 测试环境、快速验证 手动替换 YAML 静态 YAML 低,需额外工具管理
Helm Chart 已有 Helm 生态的团队 helm upgrade values.yaml 覆盖 中,依赖 Helm 版本
平台工程视角: Operator 模式将 Calico 的安装、升级、配置收敛为 Kubernetes 原生的 CRD 资源,便于平台门户通过 GitOps 或 Admission Webhook 统一管控网络基线,避免集群间配置漂移。

3.2 安装前提与集群环境检查

在安装 Operator 之前,必须确认集群满足以下前置条件。任何一项不满足都可能导致安装失败或网络异常。

  • Kubernetes 版本: v1.24+(推荐 v1.27+,以支持最新的 NetworkPolicy API)
  • CNI 冲突检查: 集群中不能存在其他 CNI 插件(如 Flannel、Weave),否则需先清理残留配置
  • etcd 或 kube-apiserver: 确保 API Server 稳定,etcd 集群健康
  • 节点内核参数: net.bridge.bridge-nf-call-iptables = 1 必须开启
  • Pod 网段预留: 默认 IP 池使用的 CIDR 不能与集群 Service CIDR、节点网络重叠
常见陷阱: 如果集群之前使用 Flannel,即使删除了 DaemonSet,/etc/cni/net.d/ 目录下仍可能残留 Flannel 配置文件。务必在所有节点执行 rm -f /etc/cni/net.d/10-flannel.conflist,否则 Calico 安装后 Pod 网络不通。

3.3 使用 Operator 安装 Calico

安装过程分为三步:部署 Operator 自身、创建 Installation 自定义资源、验证组件运行状态。

3.3.1 部署 Tigera Operator

# 安装 Operator 及其 RBAC、CRD
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.0/manifests/tigera-operator.yaml

# 确认 Operator Pod 运行正常
kubectl get pods -n tigera-operator
# 预期输出:tigera-operator-xxxxx   1/1   Running

3.3.2 创建 Installation 资源

Operator 通过 Installation CRD 驱动 Calico 组件的部署。以下是最小化配置,使用 VXLAN 封装模式并指定默认 IP 池。

cat <<EOF | kubectl apply -f -
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  calicoNetwork:
    # 选择 VXLAN 封装,跨子网通信无需额外路由
    encapsulation: VXLAN
    # 默认 IP 池 CIDR,需与集群 Pod CIDR 一致
    ipPools:
    - cidr: 10.244.0.0/16
      # 允许 IPIP 封装,VXLAN 模式下可关闭
      encapsulation: VXLAN
      natOutgoing: true
      nodeSelector: all()
    # 启用 IPv4,禁用 IPv6(如无需求)
    nodeAddressAutodetectionV4:
      firstFound: true
EOF

3.3.3 验证组件状态

# 等待所有 calico-* Pod 进入 Running
kubectl get pods -n calico-system

# 预期组件列表:
# calico-node-xxxxx          DaemonSet,每节点一个
# calico-kube-controllers   Deployment,策略控制器
# calico-typha-xxxxx        Deployment,可选的扩展组件

# 检查节点是否 Ready
kubectl get nodes -o wide

3.4 默认 IP 池配置详解

IP 池是 Calico 网络的核心抽象,决定了 Pod 如何获取 IP 地址以及流量如何封装。通过 Operator 安装后,默认 IP 池由 Installation.spec.calicoNetwork.ipPools 定义。

参数 说明 推荐值 调优影响
cidr Pod IP 地址范围 与集群 PodCIDR 一致 错误配置导致 Pod 无法分配 IP
encapsulation 封装协议:VXLAN / IPIP / None VXLAN(跨子网) VXLAN 性能优于 IPIP,但需内核支持
natOutgoing 是否对出站流量做 SNAT true 关闭后 Pod 需通过 BGP 对外通信
nodeSelector 限制 IP 池生效的节点范围 all() 可用于隔离 GPU 节点或边缘节点
调优建议: 如果集群所有节点在同一二层网络,可将 encapsulation 设为 None(纯路由模式),消除封装开销,提升网络吞吐量约 10%-15%。但需确保节点间路由可达。

3.5 网络模式对比与选型

Calico 支持三种网络模式,选择取决于集群的网络拓扑与性能要求。以下对比帮助平台工程师做出决策。

模式 封装协议 跨子网通信 性能损耗 配置复杂度 推荐场景
VXLAN UDP 封装 支持 低(约 5%) 低 公有云、混合云、跨子网集群
IPIP IP 隧道 支持 中(约 10%) 低 传统 IDC、三层网络
None (Direct) 无封装 不支持(需 BGP) 无 高(需 BGP 配置) 同子网、高性能计算
平台门户集成建议: 在平台门户的网络配置页面中,将“网络模式”作为集群创建时的必选项,并默认推荐 VXLAN。对于需要低延迟的 AI 训练集群,可提供“Direct + BGP”高级选项,但需提示用户预先配置 BGP 对等体。

3.6 网络模式与 IP 池配置流程

下图展示了从 Operator 安装到网络模式生效的完整配置流程,以及各组件之间的依赖关系。

Calico Operator 安装与网络模式配置流程 Calico Operator 安装与网络模式配置流程 集群环境检查 部署 Tigera Operator 创建 Installation CR 配置默认 IP 池 选择网络模式 验证组件运行状态 安装完成 说明:IP 池配置与网络模式选择在 Installation CR 中同时完成,两者相互影响,需统一规划

3.7 安装后验证与健康检查

完成安装后,执行以下验证步骤确保 Calico 网络功能正常,为后续准入策略集成奠定基础。

  1. 检查节点状态: kubectl get nodes 所有节点应为 Ready 状态
  2. 检查 Calico Pod: kubectl get pods -n calico-system 所有 Pod 应为 Running
  3. 测试 Pod 网络连通性: 创建测试 Pod 并执行 ping 跨节点 Pod IP
  4. 验证 IP 池分配: calicoctl get ippool 确认默认池 CIDR 正确
  5. 检查 NetworkPolicy 生效: 应用一条简单的 deny-all 策略,验证流量被阻断
# 快速连通性测试
kubectl run test-a --image=busybox --restart=Never -- sleep 3600
kubectl run test-b --image=busybox --restart=Never -- sleep 3600

# 获取 Pod IP
kubectl get pods -o wide

# 进入 test-a 并 ping test-b 的 IP
kubectl exec test-a -- ping -c 3 <test-b-ip>
平台门户集成点: 安装完成后,平台门户应自动触发“网络健康检查”流水线,将上述验证步骤封装为自动化测试用例,结果写入集群状态仪表盘。如果连通性测试失败,门户应提供“一键回滚”按钮,快速恢复至安装前状态。

3.8 常见安装问题与排障

问题现象 可能原因 解决方案
calico-node CrashLoopBackOff 内核模块缺失或版本不兼容 检查 lsmod | grep ip_tables,升级内核至 5.10+
Pod 一直处于 ContainerCreating CNI 配置冲突或 IP 池耗尽 清理 /etc/cni/net.d/ 残留文件,检查 IP 池 CIDR 大小
跨节点 Pod 无法通信 VXLAN 端口未放行或 MTU 问题 确保节点间 UDP 4789 端口可达,调整 MTU 为 1450
Operator 安装后无响应 CRD 版本冲突或 API Server 过载 使用 kubectl get crd | grep tigera 检查 CRD 状态
关键提醒: 在生产环境中,不要在 Calico 安装后立即修改默认 IP 池的 CIDR。如果需要调整,必须通过 calicoctl 创建新的 IP 池并迁移工作负载,直接修改 Installation CR 可能导致已有 Pod IP 地址冲突。