jk's notes
  • 容器与镜像

容器与镜像

在 K8s 中不直接操作容器与镜像.

作者认为只需掌握几个命令能查看与调试错误即可.

容器运行时接口 (CRI)

猜测是Container Runtime Interface.

Kubelet 运行在每一个节点 (Node) 上, 用于维护和管理 Pod 与容器的状态.

  • 容器运行时接口 (CRI) 是 kubelet 与 容器运行时之间通信的主要协议.
  • 它将 Kubernetes 与容器运行时解耦.

逻辑上只要实现了 CRI 的容器引擎, 都可以作为 Kubernetes 的容器运行时.

Docker 没有 CRI 接口. Kubernetes 使用 dockershim 来兼容 docker.

从 K8s 1.24 开始, Dockershim 已被移除.

crictl 是一个兼容 CRI 的运行时容器命令. 其用法与 docker 大部分一样. 可用来检查调试底层容器.

image-20230731144238225

但是 crictl 命令比 docker 少, 例如, 它就无法导入导出镜像. 在某些网络不好的环境下需要手动导入导出竟像时, 可以使用 ctr 命令.

image-20230731145159518

这个命令自己介绍中就提到了不再被支持, 因此只需要知道怎么导入导出镜像即可.

将 Docker 中的镜像导入到 containerd 中

操作步骤:

  1. 在 Docker 中拉取一个镜像
  2. 然后将其导出成一个 tar 包
  3. 然后将这个包上传至 k8s-master 服务
  4. 进入 k8s-master 服务器, 使用 ctr 命令导入 tar 包.
    • 注意指定平台 --platform linux/amd64
    • K8s 中所有镜像都在 k8s.io 命名空间下
  5. 然后可以查看节点上的镜像
# 本地拉取镜像
docker pull alpine:3.15
docker save alpine:3.15 > alpine-3.15.tar
# 将镜像上传至服务器
scp ./alpine-3.15.tar root@192.168.56.109:/root
# 登录 k8s-master 导入镜像
ctr -n k8s.io images import alpine-3.15.tar --platform linux/amd64
crictl images

image-20230731163508409

从 containerd 中导出镜像

操作步骤:

  1. 使用 ctr 的 images export 子命令导出镜像
    • 注意指定命名空间
    • 以及平台
  2. 导入到其他节点 (scp 命令).
    • 在某些镜像无法获取时可以使用这个方式来导入导出镜像
    • 注意每一个节点都需要导入
ctr -n k8s.io images export \
	alpine.tar \
	docker.io/library/alpine:3.15 \
	--platform linux/amd64
Last Updated:
Contributors: jk