之前由于harbor的存储空间不够了,同事干掉了好多镜像,结果把现网生产的镜像也搞掉了。进行了找回操作,这里做下记录。
环境是k8s集群,容器引擎用的containerd。
最初发现这个问题是在增加节点的时候,发现有的节点主机上,拉取镜像报错。排除了节点网络问题后,才发现是harbor上镜像被删除了。
但是部分主机是可以正常创建节点的,所以考虑部分节点本地有镜像缓存,没有走harbor拉取。
于是一个恢复思路出来了。
上当前运行pod的主机上找到image,然后push到harbor上就行了。
本以为挺简单的事情。结果登陆节点一看。
docker images是空。想起来用的containerd。然后ctr image ls也是空。
额。头大了。想起来还有k8s的crictl命令,尝试crictl images,终于找到了镜像。
具体区别如下:
ctr 是 containerd 的一个客户端工具。
crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 k8s 节点上的容器运行时和应用程序。
ctr -v 输出的是 containerd 的版本,crictl -v 输出的是当前 k8s 的版本,从结果显而易见你可以认为 crictl 是用于 k8s 的。
这里发现一个问题,crictl没有push命令,没法做推送。。。
然后查资料,ctr需要制定n=k8s.io才能够获取k8s的镜像。
尝试
ctr -n=k8s.io image list
能够找到镜像,于是尝试
ctr -n=k8s.io images push image.sd001.cn:30003/zone/app:2401152907 --user=root:password
发现报错
于是尝试从ctr中export出来,导入docker再push。
ctr -n=k8s.io image export 2401152907.tar image.sd001.cn:30003/zone/app:2401152907
docker load -i 2401152907.tar
然后docker images,终于看到镜像了。
然后docker login,docker push,成功把镜像推送到了harbor。
这里记录下过程。