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 安装到网络模式生效的完整配置流程,以及各组件之间的依赖关系。
3.7 安装后验证与健康检查
完成安装后,执行以下验证步骤确保 Calico 网络功能正常,为后续准入策略集成奠定基础。
- 检查节点状态:
kubectl get nodes所有节点应为 Ready 状态 - 检查 Calico Pod:
kubectl get pods -n calico-system所有 Pod 应为 Running - 测试 Pod 网络连通性: 创建测试 Pod 并执行
ping跨节点 Pod IP - 验证 IP 池分配:
calicoctl get ippool确认默认池 CIDR 正确 - 检查 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 地址冲突。