K8s flannel镜像离线导入指南:解决ImagePullBackOff与CNI插件缺失

发布时间:2026/10/11 3:48:48
K8s flannel镜像离线导入指南:解决ImagePullBackOff与CNI插件缺失 简介这份资源面向正在搭建 Kubernetes 集群、需要为节点配置网络插件的运维与开发人员聚焦解决 k8s 安装过程中 flannel 网络组件镜像拉取困难、离线环境部署不便的问题。压缩包共 3 个文件以 2 个 tar 镜像包和 1 个 yaml 清单为主整体约 27.34MB其中 tar 文件用于导入 flannel 及 CNI 插件镜像yaml 文件则提供配套的部署清单方便直接应用到集群。资源涵盖 flannel-cni-plugin:v1.1.2 与 flannel:v0.21.5 两个必要镜像并附带 kube-flannel.yaml可帮助读者在无外网或镜像源受限的场景下快速完成网络插件部署省去逐个查找与拉取镜像的繁琐过程。目前已有 1613 人学习下载适合需要离线安装、快速验证 flannel 网络方案的 k8s 使用者参考使用。1. 装 k8s 卡在 flannel 拉不动镜像先把这几个包备齐做 k8s 集群最玄学的一步往往不是 kubelet 配错而是 flannel 的镜像在节点上死活拉不下来。尤其是内网环境、离线机房、或者带宽被其他业务占满的时候kubectl get pods -n kube-system里 flannel 那几个 Pod 一直 ImagePullBackOff日志翻来覆去就是 pull access denied 或者 connection timeout。这个资源包解决的就是这件事把 flannel 在 k8s 里跑起来所必需的镜像提前准备好让节点不依赖外网也能把网络插件拉起来。它适合正在搭集群的运维、刚接触 k8s 网络的后端以及需要在隔离环境里交付集群的工程师。flannel 本身不复杂复杂的是镜像来源、版本对齐和导入方式这三件事没处理好集群网络就一直是半瘫状态。2. flannel 镜像到底包含什么从 CNI 插件到节点代理2.1 flannel 在 k8s 里的两个镜像角色很多人以为 flannel 只有一个镜像实际上在标准部署里它至少涉及两个角色。第一个是flannel/flannel这是主进程镜像负责监听集群里的网络配置、分配子网、写路由规则。第二个是flannel/flannel-cni-plugin这是 CNI 插件二进制镜像kubelet 在创建 Pod 沙箱时会调用它来配置 veth pair 和 IP 地址。这两个镜像如果只备了一个节点上要么 flannel Pod 起不来要么 Pod 网络通了但新建 Pod 拿不到 IP。常见做法是把两个镜像都打成 tar 包用docker load或ctr images import导入到每个节点。这里有个容易忽略的点k8s 1.24 之后默认容器运行时从 Docker 切到了 containerddocker load导入的镜像 containerd 不一定能直接看到需要确认运行时再选导入命令。我一般会先crictl info看运行时类型再决定用哪套命令。2.2 镜像版本与 k8s 版本的对应关系flannel 的镜像 tag 和 k8s 版本没有强绑定但和 flannel 自身的 manifest 文件强绑定。比如 flannel v0.22 的 manifest 里写的是flannel/flannel:v0.22.0和flannel/flannel-cni-plugin:v1.2.0-flannel1如果你只下了latestapply 之后照样拉不到。所以备镜像的第一步不是下载而是先确定你要用哪个版本的 flannel manifest。flannel 版本主镜像 tagCNI 插件 tag适用 k8s 范围v0.22.xv0.22.0v1.2.0-flannel11.21–1.27v0.23.xv0.23.0v1.3.0-flannel11.22–1.28v0.24.xv0.24.0v1.4.0-flannel11.23–1.29这张表不是官方强制矩阵而是我在几个集群里实际跑通过的组合。选版本的原则是k8s 版本越新flannel 尽量选新但不要跨太多大版本否则 CNI 配置格式可能对不上。2.3 镜像包的目录结构与校验方式一个可用的 flannel 镜像包目录通常长这样flannel-images/ ├── flannel-v0.22.0.tar ├── flannel-cni-plugin-v1.2.0-flannel1.tar ├── manifest/ │ └── kube-flannel.yml └── checksums.txtchecksums.txt里放每个 tar 包的 sha256导入前先校验一遍避免传输过程中文件损坏。校验命令sha256sum -c checksums.txt如果输出全是 OK说明包完整如果有 FAILED别急着导入重新传一遍。这个步骤在离线环境里特别重要因为 tar 包动辄几十兆传坏一个字节docker load可能不报错但镜像层是坏的后面排查起来就是黑匣子。3. 把镜像导进节点docker 与 containerd 两套命令3.1 确认容器运行时再动手在节点上执行crictl info | grep -i runtimeType如果输出docker用 docker 命令导入如果输出containerd用 ctr 命令。很多翻车现场就是运行时是 containerd却用docker load导了半天crictl images里什么都没有。3.2 docker 运行时的导入步骤# 导入主镜像 docker load -i flannel-v0.22.0.tar # 导入 CNI 插件镜像 docker load -i flannel-cni-plugin-v1.2.0-flannel1.tar # 确认镜像已存在 docker images | grep flanneldocker load会把 tar 里的镜像层解压到本地镜像库tag 信息也在 tar 里不需要额外docker tag。导入后docker images应该能看到两个 flannel 相关条目tag 和 manifest 里写的一致。3.3 containerd 运行时的导入步骤# containerd 用 ctr 导入注意命名空间是 k8s.io ctr -n k8s.io images import flannel-v0.22.0.tar ctr -n k8s.io images import flannel-cni-plugin-v1.2.0-flannel1.tar # 确认镜像 ctr -n k8s.io images ls | grep flannel这里的关键参数是-n k8s.io。containerd 有命名空间隔离kubelet 默认在k8s.io命名空间里找镜像如果你不加这个参数镜像导进了 default 命名空间kubelet 照样看不到。这个坑我踩过不止一次现象就是ctr images ls能看到但 Pod 还是 ImagePullBackOff。3.4 批量导入脚本与参数说明如果节点多手动导太慢可以写个简单脚本#!/bin/bash # 批量导入 flannel 镜像适配 containerd 运行时 RUNTIMEctr -n k8s.io IMAGE_DIR./flannel-images for tar in ${IMAGE_DIR}/*.tar; do echo importing ${tar} ... ${RUNTIME} images import ${tar} if [ $? -ne 0 ]; then echo failed: ${tar} exit 1 fi done echo all images imported脚本里RUNTIME变量可以根据节点实际运行时改成docker load -i的形式。$?判断上一步导入是否成功失败就退出避免坏包继续往下走。这个脚本不复杂但能省掉重复敲命令的功夫尤其在十几台节点的场景里。4. 避坑排查flannel 镜像导入后 Pod 还是起不来4.1 现象ImagePullBackOff 依旧存在原因镜像 tag 和 manifest 里写的不一致。比如你导入了v0.22.0但 apply 的 manifest 里写的是v0.22.1。解决kubectl describe pod -n kube-system flannel-pod看 Events 里的实际拉取地址和crictl images里的 tag 逐字对比。4.2 现象Pod 起来了但节点间网络不通原因只导入了主镜像CNI 插件镜像没导或者导入了但 kubelet 找不到。解决检查/opt/cni/bin/下有没有 flannel 二进制同时确认 CNI 插件镜像在k8s.io命名空间里。常见做法是重新导入 CNI 插件镜像并重启 kubelet。4.3 现象ctr 导入成功但 kubelet 报 not found原因containerd 命名空间不对。解决用ctr -n k8s.io images ls确认而不是ctr images ls。如果之前导错了命名空间重新用-n k8s.io导一遍即可不需要删除旧镜像。4.4 现象镜像导入后磁盘空间暴涨原因tar 包和导入后的镜像层同时占空间一个 flannel 镜像包解压后可能占几百兆。解决导入完成后删除 tar 包或者把 tar 包放到挂载的临时目录里导入后清理。docker system prune和ctr images prune可以清理未使用的镜像层但别在集群运行时随便 prune容易误删。4.5 现象apply manifest 后 flannel 一直 CrashLoopBackOff原因镜像本身没问题但 flannel 启动参数里的--iface或--pod-network-cidr和集群实际网段冲突。解决看 flannel Pod 日志kubectl logs -n kube-system pod -c kube-flannel如果是路由或网段报错改 manifest 里的Network字段重新 apply。这个和镜像无关但经常被误判成镜像问题。5. 进阶技巧把 flannel 镜像包做成可复用交付物5.1 用 skopeo 在联网机器上批量同步如果手头有一台能访问镜像仓库的机器可以用 skopeo 把镜像同步成 tar比 docker save 更干净# 同步主镜像到 tar skopeo copy \ docker://docker.io/flannel/flannel:v0.22.0 \ docker-archive:flannel-v0.22.0.tar # 同步 CNI 插件镜像 skopeo copy \ docker://docker.io/flannel/flannel-cni-plugin:v1.2.0-flannel1 \ docker-archive:flannel-cni-plugin-v1.2.0-flannel1.tarskopeo copy的docker-archive目标格式和docker load兼容同时不会在本地留下镜像层适合做一次性打包。参数里docker://是源仓库地址docker-archive:是目标文件冒号后面跟路径。5.2 校验清单与版本锁定每次打包完生成一份校验清单sha256sum *.tar checksums.txt同时在 manifest 目录里放一份versions.lock记录 flannel 版本、CNI 插件版本、k8s 版本范围。下次交付时直接看这个文件不用回忆当时用的哪个 tag。这个习惯是从一次集群升级后 flannel 镜像对不上号开始养成的从那以后我每次打包 flannel 镜像都强制走一遍校验和版本锁定再也没出现过导入后 tag 不匹配的问题。5.3 在离线节点上验证镜像可用性导入完成后别急着 apply manifest先用crictl或docker跑一个临时容器验证# containerd 环境 ctr -n k8s.io run --rm docker.io/flannel/flannel:v0.22.0 test-flannel /bin/true如果命令正常退出说明镜像层完整、入口可执行。这个验证只要几秒钟但能提前发现坏包比等到 Pod 起不来再排查省事得多。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询