用 ctr 将 Docker 镜像导入 K8s 集群并使用本地镜像
2026/8/30 15:17:08
网站建设
项目流程
文章目录 用 ctr 将 Docker 镜像导入 K8s 集群并使用本地镜像 一、核心原理 二、第一步:在 master 上用 Docker 导出镜像 2.1 导出两个镜像(基础镜像 + 构建好的 httpd 镜像) 2.2 (可选)合并为一个 tar 包 三、第二步:分发到所有节点 3.1 用 scp 分发到两个 node 3.2 master 自己也导入(虽然 master 有污点不调度,但以防万一) 四、第三步:在每个节点用 ctr 导入到 containerd 4.1 在 master 上导入 4.2 在 node01 上导入 4.3 在 node02 上导入 4.4 一键批量导入脚本(推荐) 五、第四步:验证 containerd 中的镜像 5.1 查看 k8s.io namespace 下的所有镜像 5.2 查看镜像详细信息 5.3 用 crictl 验证(更贴近 K8s 视角) 六、第五步:修改 Deployment 使用本地镜像 6.1 关键配置:imagePullPolicy 6.2 最终的 Deployment YAML 6.3 创建并验证 七、第六步:完整测试(Service + 访问) 八、常见问题排查 Q1:ctr import 成功,但 Pod 还是 ImagePullBackOff? Q2:ctr: command not found? Q3:导入后镜像名变成了 docker.io/library/...? Q4:如何删除 containerd 里的镜像? Q5:如何确认 kubelet 用的是 containerd? 九、一键完整脚本(从构建到部署) 十、总结:3 个关键点 用 ctr 将 Docker 镜像导入 K8s 集群并使用本地镜像 你的集群是v1.24.17 + containerd ,docker build的镜像存在 Docker 的存储里,containerd(ctr)看不到 ,必须导出再导入。下面是完整流程。
一、核心原理 Docker 守护进程(master 上) containerd(kubelet 用的) ┌─────────────────────┐ ┌─────────────────────┐ │ centos-httpd:v1 │ docker save │ │ │ centos:7.7.1908 │ ──────────► │ tar 包 │ │ (docker 的存储) │ │ │ └─────────────────────┘ └──────────┬──────────┘ │ ctr import ▼ ┌──────────