You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes 1.24+单节点部署Flannel时CNI插件未初始化求助

解决Ubuntu 20.04上单节点Kubernetes 1.24+ CNI插件未初始化问题

核心问题分析

Kubernetes 1.24起移除了dockershim组件,默认容器运行时切换为containerd,而Flannel的CNI适配逻辑、系统CNI插件路径或kubelet配置可能存在兼容性差异,这是导致CNI插件未初始化的核心诱因。

针对性解决步骤

1. 校验containerd的CNI配置

K8s 1.24+默认依赖containerd,需确保其CNI相关路径配置正确:

  • 编辑containerd主配置文件:sudo nano /etc/containerd/config.toml
  • 定位到[plugins."io.containerd.grpc.v1.cri".cni]配置段,确认以下参数:
    conf_dir = "/etc/cni/net.d"
    bin_dir = "/opt/cni/bin"
    
  • 保存后重启containerd服务:sudo systemctl restart containerd

2. 补全CNI二进制插件

Flannel依赖完整的CNI插件集,K8s 1.24+环境可能未自动安装:

  • 创建CNI插件目录(若不存在):sudo mkdir -p /opt/cni/bin
  • 前往CNI插件发布页面下载对应架构的压缩包(推荐v1.3.0版本),解压到/opt/cni/bin:
    sudo tar -C /opt/cni/bin -xz -f cni-plugins-linux-amd64-v1.3.0.tgz
    
  • 赋予插件执行权限:sudo chmod +x /opt/cni/bin/*

3. 调整Flannel配置并重新部署

  • 删除现有Flannel资源:kubectl delete -n kube-system deployment,pod,configmap,daemonset -l app=flannel
  • 获取Flannel的配置文件到本地,编辑其中的cni-conf.json部分,确保配置如下:
    {
      "name": "cbr0",
      "cniVersion": "0.3.1",
      "plugins": [
        {
          "type": "flannel",
          "delegate": {
            "hairpinMode": true,
            "isDefaultGateway": true
          }
        },
        {
          "type": "portmap",
          "capabilities": {
            "portMappings": true
          }
        }
      ]
    }
    
  • 应用修改后的配置:kubectl apply -f ./kube-flannel.yml

4. 校验kubelet的CNI路径配置

确保kubelet指向正确的CNI配置和插件目录:

  • 查看kubelet配置文件:sudo cat /var/lib/kubelet/config.yaml
  • 确认cniConfDir值为/etc/cni/net.d,cniBinDir值为/opt/cni/bin
  • 若配置不符,修改后重启kubelet:sudo systemctl restart kubelet

5. 调整kube-proxy模式(可选)

部分场景下,kube-proxy的ipvs模式可能干扰CNI初始化,可切换为iptables模式:

  • 编辑kube-proxy的ConfigMap:kubectl edit configmap kube-proxy -n kube-system
  • 将mode字段修改为iptables,保存退出后重启kube-proxy Pod:
    kubectl delete pod -n kube-system -l k8s-app=kube-proxy
    

额外排查动作

  • 查看kubelet实时日志定位细节:journalctl -u kubelet -f,重点搜索CNI相关报错
  • 确认节点IP转发功能开启:
    sudo sysctl net.ipv4.ip_forward=1
    sudo sysctl -p
    
  • 检查/run/flannel/subnet.env中的FLANNEL_SUBNET和节点PodCIDR是否匹配:kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}'

内容的提问来源于stack exchange,提问作者Jim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:40:38