保姆级教程:在K8s 1.21集群上手动配置Calico v3.19.1网络(含IPIP模式关闭与镜像仓库替换)
从零构建生产级Calico网络Kubernetes 1.21集群网络配置实战指南当你完成Kubernetes集群的基础部署后看着kubectl get nodes返回的NotReady状态和coredns持续Pending的尴尬局面这意味着你的集群还缺少一个关键组件——容器网络接口(CNI)。在众多CNI插件中Calico以其出色的性能和灵活性成为生产环境的热门选择。本文将带你从零开始在Kubernetes 1.21集群上手动部署Calico v3.19.1涵盖私有镜像仓库配置、IPIP模式调优等实战细节最终让你的集群节点全部Ready为后续应用部署铺平道路。1. 环境准备与前置检查在开始Calico部署前我们需要确保基础环境就绪。首先确认你的Kubernetes 1.21集群使用的是containerd作为容器运行时这是当前官方推荐的生产级选择。通过以下命令检查节点状态正常情况应该显示所有节点为NotReadykubectl get nodes检查系统Pod状态coredns会处于Pending状态kubectl get pods -n kube-system网络接口检查应该只显示物理网卡和docker0接口如果曾经安装过Dockerip a关键准备工作清单确保各节点间网络互通特别是TCP 179端口BGP协议端口未被防火墙阻止确认节点主机名不重复且能正确解析准备至少2GB内存和2CPU的资源余量用于Calico组件运行记录下你计划使用的Pod CIDR范围默认10.244.0.0/16提示生产环境中建议提前规划好IP地址分配策略避免后期Pod CIDR耗尽的问题。2. 镜像获取与私有仓库配置Calico v3.19.1需要以下四个核心镜像calico/cni:v3.19.1calico/node:v3.19.1calico/pod2daemon-flexvol:v3.19.1calico/kube-controllers:v3.19.1如果你的环境可以访问Docker Hub可以直接使用官方镜像。但在企业内网环境中通常需要先将镜像推送到私有仓库# 从Docker Hub拉取镜像 docker pull calico/cni:v3.19.1 docker pull calico/node:v3.19.1 docker pull calico/pod2daemon-flexvol:v3.19.1 docker pull calico/kube-controllers:v3.19.1 # 重新标记镜像指向私有仓库 docker tag calico/cni:v3.19.1 private.registry/calico/cni:v3.19.1 docker tag calico/node:v3.19.1 private.registry/calico/node:v3.19.1 docker tag calico/pod2daemon-flexvol:v3.19.1 private.registry/calico/pod2daemon-flexvol:v3.19.1 docker tag calico/kube-controllers:v3.19.1 private.registry/calico/kube-controllers:v3.19.1 # 推送到私有仓库 docker push private.registry/calico/cni:v3.19.1 docker push private.registry/calico/node:v3.19.1 docker push private.registry/calico/pod2daemon-flexvol:v3.19.1 docker push private.registry/calico/kube-controllers:v3.19.1常见镜像问题排查如果使用私有SSL证书确保所有节点已正确配置证书信任containerd需要单独配置私有仓库认证位置通常在/etc/containerd/config.toml镜像拉取失败时检查kubelet日志获取详细错误信息3. Calico配置文件深度定制从官方获取基础配置文件wget https://docs.projectcalico.org/manifests/calico.yaml -O calico-v3.19.1.yaml接下来需要对配置文件进行几处关键修改1. 关闭IPIP模式IPIP是Calico的默认封装模式会在节点间创建隧道接口(tunl0)。虽然能跨不同子网工作但会带来约10%的性能损耗。在节点间网络直连的场景下建议关闭# 在calico-node DaemonSet的环境变量部分修改 - name: CALICO_IPV4POOL_IPIP value: Off # 从Always改为Off2. 调整Pod CIDR确保CALICO_IPV4POOL_CIDR与kube-controller-manager的--cluster-cidr参数一致- name: CALICO_IPV4POOL_CIDR value: 10.244.0.0/16 # 根据实际规划修改3. 私有镜像仓库配置替换所有image字段指向你的私有仓库containers: - name: calico-node image: private.registry/calico/node:v3.19.1 # 其他镜像同理修改4. Typha服务配置可选对于超过50个节点的大规模集群建议启用Typha服务减轻API服务器压力# 在ConfigMap部分修改 typha_service_name: calico-typha注意修改后的配置文件建议保存为版本化文件如calico-v3.19.1-custom.yaml方便后续审计和回滚。4. 部署与验证应用配置好的Calico清单kubectl apply -f calico-v3.19.1-custom.yaml部署后监控组件状态watch kubectl get pods -n kube-system预期会看到calico-node每个节点一个和calico-kube-controllers逐渐变为Running状态。约1-2分钟后检查节点状态应全部变为Readykubectl get nodes网络连通性验证创建测试Podkubectl run test-pod --imagebusybox -- sleep 3600检查Pod IP分配kubectl get pod test-pod -o wide跨节点ping测试需要部署多个Podkubectl exec test-pod -- ping 其他Pod的IP路由表检查 在节点上执行ip route应该能看到类似如下路由条目表示Calico的BGP路由正常工作10.244.1.0/26 via 192.168.1.2 dev eth0 proto bird5. 生产环境调优建议资源限制配置为避免Calico组件占用过多资源建议在Deployment和DaemonSet中添加资源限制resources: requests: cpu: 250m memory: 256Mi limits: cpu: 500m memory: 512Mi网络策略预配置Calico强大的网络策略功能需要提前规划建议初始部署时就配置基础的安全策略apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: default-deny spec: selector: all() types: - Ingress - Egress # 默认拒绝所有流量再通过具体策略开放必要通信监控与日志启用Calico的Prometheus监控端点调整calico-node日志级别默认info收集Felix组件的性能指标版本升级策略先在小规模测试集群验证新版本仔细阅读官方升级说明特别注意CRD变更采用滚动更新策略监控各组件健康状态6. 故障排查与维护常见问题处理节点一直处于NotReady状态检查calico-node Pod日志kubectl logs -n kube-system calico-node-pod-name -c calico-node验证网络插件二进制是否就绪ls /opt/cni/bin/calicoPod间网络不通检查基础网络连通性kubectl exec test-pod -- ping 目标IP验证网络策略是否阻止通信kubectl get networkpolicy --all-namespaces性能问题排查检查是否意外启用了IPIP模式ip a show tunl0监控BGP对等状态calicoctl node statusCalico卸载流程删除部署资源kubectl delete -f calico-v3.19.1-custom.yaml清理残留网络接口ip link delete tunl0 modprobe -r ipip移除CNI配置rm -f /etc/cni/net.d/10-calico.conflist重启kubelet服务systemctl restart kubelet在实施维护操作时建议先在测试环境验证特别是涉及生产环境的变更。Calico的灵活性带来了强大的功能同时也需要更深入的理解才能充分发挥其优势。