一、本地离线部署 Calico 网络插件

1.导入 Calico 镜像(加载 tar 包)

首先确认容器运行时是 containerd 还是 docker(kubeadm 1.24+ 默认 containerd):

kubectl get node -o wide
# 输出中 CONTAINER-RUNTIME 会显示 docker://... 或 containerd://...

  • 如果运行时是 containerd(最常见):

  • cd /root/calico-v3.29.1
    ctr -n k8s.io images import calico-v3.29.1.tar

  • 如果运行时是 docker

  • cd /root/calico-v3.29.1
    docker load -i calico-v3.29.1.tar

  • 导入后可以验证镜像是否存在:

  • # containerd
    crictl images | grep calico
    # 或
    ctr -n k8s.io images ls | grep calico

    # docker
    docker images | grep calico

  • 2. 修改 calico.yaml 中的 Pod 网络 CIDR

  • vim calico.yaml
  • 找到 calico-node DaemonSet 中容器 calico-node 的 env 部分,修改/添加以下环境变量:
  • - name: CALICO_IPV4POOL_CIDR
      value: "10.244.0.0/16"
  • 常见位置提示
    搜索 CALICO_IPV4POOL_CIDR,如果已存在但被注释,取消注释并改值;
    若完全不存在,就在 - name: IP 或 - name: CALICO_IPV4POOL_IPIP 等附近自行添加上述两行。
    一般不需要改动 CALICO_IPV4POOL_IPIPCALICO_IPV4POOL_VXLAN 等选项,保持默认即可。

    保存退出。

  • 3. 部署 Calico 网络插件

  • kubectl apply -f calico.yaml
  • Calico 资源会创建在 kube-system 或 calico-system 命名空间(取决于你的 YAML 版本)。等待所有 Calico Pod 就绪:
  • kubectl get pods -n kube-system -l k8s-app=calico-node -w
    # 如果没有输出,则可能在其他命名空间,尝试:
    kubectl get pods -A | grep calico
  • 确保每个节点的 calico-node 都是 Running 状态,READY 为 1/1 或 2/2(取决于是否包含 flexvol 等)。
  • 4. 验证 Pod 网络通信

  • # 查看节点状态(应全部为 Ready)
    kubectl get nodes

    # 查看默认 IP 池是否已更新为 10.244.0.0/16
    kubectl get ippools -o yaml | grep cidr
    # 或者
    calicoctl get ippools -o wide  2>/dev/null || kubectl get ippools default-ipv4-ippool -o yaml | grep cidr

  • 预期看到 cidr: 10.244.0.0/16

  • 接下来部署两个测试 Pod 验证跨节点通信:

  • # 创建测试命名空间和 Pod
    kubectl create ns test
    kubectl run test1 --image=busybox:1.28 --restart=Never --namespace=test -- sleep 3600
    kubectl run test2 --image=busybox:1.28 --restart=Never --namespace=test -- sleep 3600

    # 确保两个 Pod 都 Running
    kubectl get pods -n test -o wide

    # 从 test1 ping test2 的 IP(假设 test2 IP 为 10.244.x.y)
    kubectl exec -n test test1 -- ping -c 3 <test2-IP>

  • 若 ping 通,则 Calico 网络已正常工作。

  • 常见问题排查

  • Calico-node 一直 CrashLoopBackOff
    检查节点网卡名是否特殊,若有多网卡需要设置 IP_AUTODETECTION_METHOD。可在 calico-node 的 env 中添加:

  • - name: IP_AUTODETECTION_METHOD
      value: "interface=eth0"   # 替换为实际网卡名

  • 镜像拉取失败:确认 calico-v3.29.1.tar 已正确导入且命名空间正确(containerd 必须用 -n k8s.io)。

  • Pod 分配不到 IP:检查 kube-controller-manager 的 --cluster-cidr=10.244.0.0/16 是否存在,以及 calico.yaml 中 CALICO_IPV4POOL_CIDR 是否一致。

  • 完成以上步骤后,你的 Kubernetes 集群就成功安装了 Calico CNI,所有 Pod 应当能正常获取 IP 并跨节点通信。

更多推荐