[bug解决]k8s与docker本地仓库不共享的解决方法
[bug解决]k8s与docker本地仓库不共享的解决方法
Joshua在安装kubesphere的过程中,由于kubesphere 3.2.x版本会提示证书错误,疑似bug,需要手动修改docker镜像以解决问题。
在我用docker重新打包修改后的镜像文件以后,却发现k8s无法读取到我新打包的镜像。原来是docker的本地仓库和k8s的本地仓库是不共享的。因此写下本篇来记录一下解决方案。
原因:
由于k8s在1.24版本中把docker-shim移除,从而k8s底层从使用docker的api转移到使用更轻量更标准化的contained。所以本质原因就是containerd和docker的本地镜像不互通。
解决方案1
- 使用docker命令,导出目标镜像为image.tar文件
docker save -o image.tar 目标镜像 |
- 使用ctr命令(container的客户端命令),导入上一步导出文件。不过注意一点ctr区分namespace的,k8s镜像默认都在k8s.io的namespace之下
ctr -n=k8s.io image import image.tar |
解决方案2
只适用于新构建镜像已在仓库,且docker底层使用containerd管理容器(k8s版本v1.24之后默认就是使用containerd)
- 直接使用ctr去拉取镜像,当然也需要注意namespace问题
ctr image pull -n k8s.io 镜像名称 |
解决方案3
只适用于新构建镜像已在仓库,且是v1.24版本之后的k8s。
由于v1.24版本之后的k8s抽象出了一层CRI接口,只要实现了此接口的容器管理器,都能对接k8s。目前containerd和docker-shim(docker用来实现对接CRI)都已实现CRI接口对接。
此方法优于第二种的方法在于本方法能直接控制CRI接口,无视了底层实现。
- 使用crictl命令去拉取镜像。即使是containerd也不需要指定namespace,默认会直接操作k8s.io的namespace
crictl pull 镜像名称 |