Containerd 运行时的 K8S 集群离线导入镜像的方案

目录

[1. 准备与传输镜像](#1. 准备与传输镜像)

[2. 导入镜像](#2. 导入镜像)

[3. 部署应用](#3. 部署应用)

[4. 技巧与注意事项](#4. 技巧与注意事项)


在 Containerd 运行时的 K8S 集群中离线导入应用镜像,关键在于将镜像正确导入到 containerd 的 k8s.io命名空间,并确保 K8S部署时能使用这些本地镜像。

1. 准备与传输镜像

首先,你需要在可以访问互联网的环境中,准备好要部署的应用镜像。

拉取并保存镜像 :使用 Docker 拉取镜像,重新标记为符合 K8s 需求的标签(如需),然后导出为 .tar文件。

复制代码
docker pull <原镜像名称:标签>
docker tag <原镜像名称:标签> <新镜像名称:标签> # 可选,使镜像标签符合部署要求
docker save -o <镜像文件名>.tar <新镜像名称:标签>

docker pull nginx:latest
docker save -o nginx.tar nginx:latest
  • 提示docker save保存的是展开后的格式,文件可能较大。虽然 docker save也支持输出为 .tar.gz,但 ctr image import命令不支持直接导入压缩格式,如果得到的是 .tar.gz文件,需要先解压 。

  • 举例 :如需部署 nginx:latest,操作如下:

  • 传输镜像文件 :将生成的 .tar文件复制到离线环境中的 K8s 工作节点(如果需要部署到多个节点,则每个节点都需要复制)。scp <镜像文件名>.tar <用户名>@<节点IP>:<目

2. 导入镜像

这是最关键的一步,需要将镜像导入到 containerd 的正确命名空间中。

  • 导 入镜像 :登录到目标 K8s 节点,使用 ctr命令导入镜像。务必使用 -n k8s.io参数,这能确保镜像被导入到 Kubernetes 使用的命名空间 。

    复制代码
    ctr -n k8s.io image import <镜像文件名>.tar
    • 注意 :如果镜像文件是 .tar.gz格式,需要先解压:
  • 验证导入:导入完成后,使用以下命令检查镜像是否存在。

    复制代码
    # 使用 ctr 查看
    ctr -n k8s.io images list | grep <镜像名称>
    
    # 或者使用与 CRI 接口兼容的 crictl 查看
    crictl images | grep <镜像名称>

3. 部署应用

镜像准备就绪后,就可以在 K8s 集群中部署你的应用了。

  • 创建部署配置文件 :编写一个 K8s 的 Deployment YAML 文件。关键点在于需要设置 imagePullPolicy: IfNotPresentimagePullPolicy: Never。这会指示 Kubelet 不要尝试从远程仓库拉取镜像,而是直接使用本地已存在的镜像 。

    复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: your-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: your-app
      template:
        metadata:
          labels:
            app: your-app
        spec:
          containers:
          - name: your-app-container
            image: <你在节点上导入的完整镜像名称和标签>  # 例如: nginx:latest
            imagePullPolicy: IfNotPresent  # 重要!
            ports:
            - containerPort: 80
  • 应用配置 :使用 kubectl部署你的应用。

    复制代码
    kubectl apply -f your-deployment.yaml

4. 技巧与注意事项

  • 批量操作:如果需要导入多个镜像,可以写一个简单的循环脚本 。

    复制代码
    for image in /path/to/your/*.tar; do
        ctr -n k8s.io image import "$image"
    done
  • 镜像已经存在 :如果导入时提示镜像已存在,可以使用 ctr -n k8s.io images rm <镜像名>先删除旧镜像再导入,或者使用 --force选项强制替换(如果 ctr版本支持)。

相关推荐
孤岛悬城2 小时前
44 Docker:安装与容器管理
docker·容器·云计算
眠りたいです2 小时前
Docker:Docker image常用命令使用及实操
运维·docker·容器·eureka·镜像
可爱又迷人的反派角色“yang”2 小时前
docker基本概念(一)
linux·运维·docker·容器
CHINAHEAO2 小时前
Docker 安装Bagisto详细过程
运维·docker·容器
Justin_194 小时前
K8s常见问题
云原生·容器·kubernetes
tzhou6445213 小时前
Docker容器技术指南
运维·docker·容器
java_logo15 小时前
Crawl4AI Docker 容器化部署指南
运维·docker·容器·crawl4ai·crawl4ai部署文档·crawl4ai部署教程·crawl4ai部署
鸡吃丸子18 小时前
初识Docker
运维·前端·docker·容器
linweidong19 小时前
顺丰运维面试题及参考答案
运维·nginx·容器·ansible·运维开发·防火墙·python面试