kubernetes在v1.20 版本宣布弃用 dockershim
(在v1.24正式移除),改用cri接口去操作更为基础的containerd或cri-o。
k8s在创建容器时,或多或少有些镜像无法正常拉取(网络等原因)。
还在使用docker engine
时我们能方便的pull第三方同步的镜像,然后tag成需要的标签版本,让k8s从本地获取到想要的镜像。
因docker
将其容器格式和运行时runc捐赠给oci
(开放容器标准),oci标准化了容器工具和底层实现之间的大量接口。
因此改用containerd
或cri-o
万变不离其宗,他们都支持运行符合oci
标准的镜像。
理论存在,实践开始。我集群的容器运行时是containerd
,以我想在k8s中安装prometheus为例,拉取不到需要的镜像prometheus-adapter。
一如既往,先从安装了docker的机器中拉image(可在docker hub或其他镜像源中搜索想要的镜像和版本),打tag,保存,传输
# 在 docker hub 上找到了第三方帮忙同步的 prometheus-adapter:v0.10.0
docker pull v5cn/prometheus-adapter:v0.10.0
# 为镜像打上k8s需要的 tag
docker tag v5cn/prometheus-adapter:v0.10.0 registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.10.0
# 将镜像保存下来
docker save -o /data/prometheus-adapter.tar registry.k8s.io/prometheus-adapter/prometheus-adapter
# 复制给各k8s worker节点
scp /data/prometheus-adapter.tar #账号@机器:路径
然后连接各k8s worker node,进行镜像导入。注意要导入至k8s使用的containerd默认命名空间是 k8s.io 否则它会找不到镜像
# 导入,-n 参数为指定命名空间
ctr -n k8s.io image import prometheus-adapter.tar
# 确认下导入
ctr -n k8s.io image list | grep prometheus
# crictl是kubernetes社区定义的cri接口工具,在这边也确认下
crictl image | grep prometheus
至此k8s已能在本地找到相应镜像(记得确认imagepullpolicy
已设置为ifnotpresent
或never
)
发表评论