1. 为什么需要离线部署Calico在企业内部部署Kubernetes集群时网络环境往往是最让人头疼的问题之一。特别是在一些安全要求较高的场景下服务器根本无法访问外网这时候像Calico这样的网络插件安装就会变得异常困难。我最近在一个金融客户的私有云环境中就遇到了这个问题——他们的服务器完全隔离在内部网络中连最基本的Docker镜像都无法拉取。Calico作为Kubernetes最流行的网络插件之一默认安装时需要从公共镜像仓库下载多个组件镜像。在没有外网访问权限的环境中这个简单的需求就变成了一个难以逾越的障碍。更麻烦的是Calico的版本还需要与Kubernetes版本严格匹配这就意味着我们需要一套完整的离线部署方案。2. 准备工作获取离线资源包2.1 确定版本兼容性在开始之前我们必须确认Calico 3.26.1与Kubernetes 1.27.3的兼容性。根据官方文档这个组合是完全支持的。我建议在项目官网的Release Notes中仔细检查版本对应关系避免后续出现兼容性问题。2.2 下载离线资源包我们需要从Calico的GitHub仓库获取离线安装包。具体步骤如下访问Calico的GitHub发布页面找到v3.26.1版本的发布包下载包含所有依赖的完整离线包通常命名为calico-v3.26.1.tgz这里有个小技巧如果你在受限网络环境中工作可以先用能上网的机器下载好所有资源然后通过内部文件共享服务传输到目标环境。我通常会准备一个包含以下内容的离线资源包所有必需的容器镜像tar格式部署配置文件calico.yaml必要的命令行工具如calicoctl3. 传输和解压离线包3.1 文件传输到目标服务器将下载好的离线包传输到Kubernetes主节点。根据你的环境可以选择以下方式之一使用scp命令从本地传输通过内部文件服务器下载使用U盘等物理介质拷贝我更喜欢用scp命令因为它简单直接scp calico-v3.26.1.tgz userk8s-master:/tmp/3.2 解压和整理文件解压离线包后你会看到以下关键文件calico/ ├── images/ │ ├── calico-cni.tar │ ├── calico-kube-controllers.tar │ ├── calico-node.tar ├── manifests/ │ ├── calico.yaml这里需要特别注意不同版本的Calico可能包含不同的镜像文件。一定要检查calico.yaml文件中引用的镜像名称确保离线包中包含所有必需的镜像。4. 导入容器镜像到本地仓库4.1 确认容器运行时环境大多数Kubernetes 1.27.3环境默认使用containerd作为容器运行时。我们可以通过以下命令确认ctr version4.2 导入Calico镜像containerd使用命名空间来隔离不同环境的镜像。Kubernetes的镜像都存放在k8s.io命名空间下。导入镜像的具体步骤如下ctr -n k8s.io images import calico/images/calico-cni.tar ctr -n k8s.io images import calico/images/calico-kube-controllers.tar ctr -n k8s.io images import calico/images/calico-node.tar导入完成后可以检查镜像是否成功加载ctr -n k8s.io images list | grep calico5. 部署和配置Calico5.1 调整calico.yaml配置在部署前我们需要根据实际环境调整calico.yaml文件。最常见的修改包括修改Pod CIDR范围确保与Kubernetes集群配置一致调整资源限制特别是内存限制配置IP池大小我建议使用以下命令快速检查需要修改的参数grep -E CALICO_IPV4POOL_CIDR|FELIX_IPV6SUPPORT calico/manifests/calico.yaml5.2 应用Calico配置一切准备就绪后就可以部署Calico了kubectl apply -f calico/manifests/calico.yaml部署完成后检查Calico组件是否正常运行kubectl get pods -n kube-system -l k8s-appcalico-node kubectl get pods -n kube-system -l k8s-appcalico-kube-controllers6. 验证和故障排查6.1 基本功能验证部署完成后我们需要验证Calico是否正常工作创建一个测试Podkubectl run test-pod --imagebusybox -- sleep 3600检查网络连通性kubectl exec test-pod -- ping 另一个Pod的IP6.2 常见问题解决在离线环境中部署Calico最常见的问题包括镜像导入失败检查containerd版本和镜像格式是否兼容节点间网络不通检查防火墙规则是否放行了Calico使用的端口默认是TCP 179IP地址冲突确保Pod CIDR不与现有网络重叠我在一次部署中就遇到了节点间网络不通的问题后来发现是防火墙阻止了BGP端口。解决方法很简单iptables -A INPUT -p tcp --dport 179 -j ACCEPT7. 高级配置和优化建议7.1 配置网络策略Calico最强大的功能之一是它的网络策略。在安全要求高的环境中我建议从一开始就配置基本的网络隔离策略。例如这个策略限制default命名空间中的所有Pod只能与特定标签的Pod通信apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: selector: all() types: - Ingress - Egress7.2 性能优化技巧在大规模集群中Calico的性能调优尤为重要。以下是我总结的几个关键参数调整IP池块大小ipam.blockSize启用端点切片EndpointSlices优化BGP配置如果使用BGP路由一个实际案例在某次部署中我们将IP池块大小从默认的2664个IP调整为23512个IP显著减少了IPAM分配的开销。8. 维护和升级策略8.1 监控Calico运行状态建议部署以下监控组件Calico提供的Prometheus监控指标集群级别的网络健康检查定期节点连通性测试可以使用这个命令检查Calico节点的健康状态calicoctl node status8.2 离线环境下的升级方案在离线环境中升级Calico需要特别注意提前下载新版本的离线包在测试环境验证兼容性采用滚动更新策略准备回滚方案我通常会在升级前执行以下步骤kubectl get tigerastatus calicoctl get hep -o wide这些准备工作可以确保升级过程更加平滑遇到问题时也能快速恢复。