谷歌Kubernetes节点v1.21.4-gke.2300无法查看Docker镜像问题咨询
问题根因
- GKE 从 v1.21 及以上版本默认将容器运行时从 Docker 替换为
containerd,Kubernetes 官方正式移除了dockershim组件,新版本节点不再默认运行 Docker daemon - 旧版本中你使用的
docker images等命令依赖 Docker daemon 的存储路径/var/lib/docker/,新版本的所有镜像都存储在 containerd 的专属路径/var/lib/containerd/下,Docker 命令无法读取该路径的镜像数据,所以会出现节点上查不到镜像的情况
你当前使用的命令:
kubectl get pods -n geo-test -o jsonpath="{.items[*].spec.containers[*].image}" | tr -s '[[:space:]]' '\n' | sort | uniq -c
是从 Kubernetes API 读取 Pod 配置中声明的镜像地址,并非读取节点本地实际存储的镜像数据。
新版本节点查看本地镜像的方法
登录对应 GKE 节点后,使用 containerd 官方配套的 CLI 工具 crictl 即可查看节点本地真实存储的镜像,命令如下:
sudo crictl images
镜像实际存储的根目录为 /var/lib/containerd/io.containerd.content.v1.content/,该目录下是按内容哈希拆分存储的镜像层,不建议直接手动修改。
新版本实现本地修改镜像免上传直接使用的方案
你可以按照以下步骤完成和旧版本一致的操作,无需将镜像上传到 GCR 再拉取:
- 登录 Pod 所在的 GKE 节点,先拉取需要修改的基础镜像:
sudo crictl pull <基础镜像地址>
- 安装 containerd 生态的镜像构建工具
nerdctl(语法和 Docker 命令完全兼容,是 containerd 官方推荐的 Docker 替代工具),也可以直接使用ctr命令完成镜像打包操作 - 基于基础镜像修改完成后构建新镜像,给新镜像打上和你工作负载(Deployment/StatefulSet 等)配置中完全一致的镜像名称和标签
- 修改对应工作负载的镜像拉取策略为
IfNotPresent或Never,避免 Kubernetes 强制去远程仓库拉取镜像覆盖本地自定义镜像:
imagePullPolicy: IfNotPresent
- 重启对应 Pod 即可直接使用本地构建的自定义镜像
旧版本 v1.19.13-gke.1200 节点 Docker 镜像查询效果:
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

