使用Tigera Operator在Kubernetes集群中部署Calico的实践指南
1. 为什么选择Tigera Operator部署Calico在Kubernetes集群中部署网络插件时Calico凭借其出色的网络性能和灵活的策略管理能力已经成为众多企业的首选方案。而Tigera Operator则是Calico官方推荐的部署方式相比传统的手动YAML部署Operator模式带来了三大核心优势第一是生命周期管理自动化。Operator会持续监控Calico组件的运行状态自动处理节点故障、版本升级等复杂操作。我去年在升级一个生产集群时就深刻体会到Operator的便利——只需要修改Installation CRD中的版本号Operator就会自动完成所有组件的滚动更新完全不需要人工干预每个Deployment的镜像版本。第二是配置声明化。所有网络参数都通过CustomResourceDefinition(CRD)来定义比如IP池配置、数据平面模式等。这种模式特别适合GitOps工作流你可以把CRD文件提交到Git仓库实现配置的版本控制和审计。下面是一个典型的Installation CRD示例apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: calicoNetwork: ipPools: - cidr: 10.244.0.0/16 encapsulation: VXLAN natOutgoing: true第三是异常自愈能力。当Calico组件异常崩溃时Operator能自动检测并重启相关Pod。这个特性在节点资源不足的场景下特别有用我曾经遇到过一个集群因为内存压力导致calico-node不断被OOM KillOperator通过指数退避策略不断尝试恢复最终在节点扩容后自动恢复正常。2. 部署前的环境准备在开始安装之前需要确保你的Kubernetes集群满足以下基本要求集群版本兼容性方面Calico v3.26需要Kubernetes 1.21版本。这里有个容易踩的坑如果你使用kubeadm初始化集群时没有指定--pod-network-cidr参数后续Calico会无法自动分配IP地址。正确的初始化命令应该是kubeadm init --pod-network-cidr10.244.0.0/16节点资源要求上每个节点至少需要2核CPU2GB内存10GB磁盘空间对于网络环境要求需要特别注意确保节点间TCP 179端口BGP、5473端口Typha畅通如果使用VXLAN模式需要开放UDP 4789端口控制平面需要能访问k8s API Server在私有化部署场景中镜像仓库准备是个关键步骤。由于默认的docker.io在国内访问不稳定建议提前将以下镜像同步到私有仓库quay.io/tigera/operator:v1.30.0quay.io/calico/node:v3.26.0quay.io/calico/kube-controllers:v3.26.0可以通过这个命令快速测试节点间的网络连通性kubectl run net-test --imagealpine --restartNever -- ping 8.8.8.83. 分步安装Tigera Operator3.1 安装CRD资源首先需要安装Operator依赖的CustomResourceDefinitions。这里有个性能优化点由于CRD文件较大约300KB建议使用kubectl create而非apply避免触发APIServer的请求限制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/operator-crds.yaml验证CRD是否注册成功kubectl get crd | grep tigera.io应该能看到installations.operator.tigera.io等关键CRD。3.2 部署Operator本体接下来部署Operator控制器这里推荐使用NodeSelector将Operator固定在master节点curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml # 编辑文件添加nodeSelector sed -i /spec:/a \ nodeSelector:\n node-role.kubernetes.io/control-plane: tigera-operator.yaml kubectl create -f tigera-operator.yaml检查Operator运行状态kubectl get pods -n tigera-operator正常情况应该看到READY 1/1的状态。4. 定制化Calico安装配置4.1 基础网络配置创建custom-resources.yaml文件这是Calico的核心配置文件。生产环境中需要特别关注这几个参数apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: registry: registry.internal.com # 私有仓库地址 calicoNetwork: ipPools: - cidr: 10.244.0.0/16 blockSize: 26 encapsulation: VXLANCrossSubnet # 混合模式 natOutgoing: Enabled nodeAddressAutodetection: interface: eth0|en.* # 匹配节点网卡IP池规划建议每个Pod默认消耗1个IPblockSize决定每个节点分配的IP块大小计算公式总IP数 节点数 × (2^(32-blockSize) - 2)例如blockSize26时每个节点获得64-262个可用IP4.2 高级功能配置如果需要启用网络策略日志功能可以添加如下配置apiVersion: operator.tigera.io/v1 kind: LogCollector metadata: name: default spec: collectProcessPath: true logSeverity: Info对于大规模集群超过50节点建议启用Typha做连接代理apiVersion: operator.tigera.io/v1 kind: Installation metadata: name: default spec: typha: enabled: true replicas: 3 # 根据集群规模调整应用配置后可以通过以下命令监控安装进度watch kubectl get tigerastatus5. 安装后的验证与排错5.1 基础功能验证首先检查所有Pod是否正常运行kubectl get pods -n calico-system关键组件包括calico-node每个节点一个DaemonSetcalico-kube-controllers集群单例如果启用Typha会有多个typha实例测试跨节点网络连通性kubectl run test-1 --imagenginx --restartNever kubectl run test-2 --imagenginx --restartNever kubectl exec test-1 -- curl -I test-25.2 常见问题排查问题1Pod无法获取IP地址检查calico-node日志kubectl logs -n calico-system -l k8s-appcalico-node确认IP池配置正确kubectl get ippool -o yaml问题2节点间网络不通检查路由表ip route show测试直接节点连通性ping node-ip验证防火墙规则iptables-save | grep calico问题3Operator无法创建资源检查Operator日志kubectl logs -n tigera-operator -l k8s-apptigera-operator验证RBAC权限kubectl auth can-i create installations.operator.tigera.io6. 生产环境最佳实践6.1 性能调优建议对于高负载集群建议调整以下参数apiVersion: operator.tigera.io/v1 kind: Installation spec: calicoNetwork: linuxDataplane: BPF # 使用eBPF数据平面 bpf: enabled: true logLevel: Info资源限制配置示例apiVersion: operator.tigera.io/v1 kind: Installation spec: node: resources: requests: cpu: 250m memory: 256Mi limits: cpu: 1000m memory: 1024Mi6.2 版本升级策略Calico支持N-1版本兼容升级时建议遵循先升级Operator再修改Installation中的版本号监控滚动更新进度具体命令kubectl patch installation default --type merge -p {spec:{variant:Calico,version:v3.26.0}}升级过程中可以通过以下命令观察状态watch kubectl get tigerastatus6.3 监控与告警建议为以下指标配置告警calico_node_ready值应为1felix_resyncs_total突然增长可能有问题bgp_session_stateBGP会话状态示例Prometheus告警规则- alert: CalicoNodeDown expr: calico_node_ready 0 for: 5m labels: severity: critical annotations: summary: Calico node down ({{ $labels.instance }})