写点什么

如何利用 k8s 拉取私有仓库镜像

用户头像
Damon
关注
发布于: 2021 年 05 月 13 日

作者:Damon

博客:http://www.damon8.cn

程序猿 Damon | 微服务 | 容器化 | 自动化

现象

最近实战时,发现一个很奇怪的问题,在通过 k8s 创建 pod,拉取镜像时,总是显示如下信息:

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image ..."
复制代码

该现象出现的原因可能是网络问题、docker 环境问题等。但如果访问的是一个公开的镜像仓库,在 pull image 的时候,不应该会提示:ImagePullBackOff,但如果访问的是私有仓库,那就有可能出现如下的错误:

这个错误出现的原因,刚才说了,有可能的网络问题,也有可能是 docker 问题,但有时候,这些不能解决的情况下,可以采用下面三种方式来解决。


方式一


第一种方式,我们可以使用文件生成 secret,然后通过 k8s 中的 imagePullSecrets 来解决拉取镜像时的验证问题。具体方式如下:

修改 /etc/docker/daemon.json

在 k8s 集群节点上,修改 docker 的 daemon.json 配置文件:

{"registry-mirrors": [ "https://registry.docker-cn.com"],"insecure-registries":["私有仓库服务地址"]}
复制代码

在里面加上自己私有的仓库服务地址,然后重启 docker 服务,使其生效。

生成 ~/.docker/config.json 文件
docker login 私有服务地址
复制代码

在命令行输入上面的命令,回车后,会提示输入用户名和密码。输入正确信息后,这会生成一个 /root/.docker/config.json 文件。同时会提示:

Login Succeeded
复制代码
生成 Secret 串

根据上面生成的 ~/.docker/config.json 文件,我们可以生成一个密文秘钥:

base64 -w 0 ~/.docker/config.json
复制代码

执行上面的命令后,会生成一个长串,即为我们所要的 Secret 串。

我们会在 source 下看见一个新的文件夹,_drafts,这个里面会装我们所有的草稿文件。

创建 Secret

通过 k8s 我们可以生成一个 Secret 资源:

apiVersion: v1kind: Secretmetadata:  name: docker_reg_secret  namespace: defaultdata:    .dockerconfigjson: ewoJImF1dGhjNWdlpHVnVaenB5Wld4aFFFeFdUa2xCVGtBeU1ERTMiCgkJfASEkidXJlZy5rOHMueXVud2VpLnJlbGEubWUiOiB7CgkJCSJhdXRoIjogIloyRnZaM1Z2WkdWdVSrsaaehoUUV4V1RrbEJUa0F5TURFMyIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJSetcaFTssZW50IjogIkRvY2tlci1DbGllbnQvMTguMDYuMS1jZSAobGludXgpIgoJfQp9type: kubernetes.io/dockerconfigjson
复制代码

执行这个资源的配置:

kubectl create -f secret.yml
复制代码
在服务配置加上依赖

最后,可以在 我们的服务 yml 文件中加上拉取镜像时的依赖 secret,部分代码如下:

imagePullSecrets:- name: docker_reg_secret
复制代码

方式二


第二种方式,我们可以直接使用 docker 的用户信息来生成 secret:

kubectl create secret docker-registry docker_reg_secret --docker-server=XXX --docker-username=XXX --docker-password=XXX
复制代码

参数含义:

docker_reg_secret: 指定密钥的键名称, 自定义

docker-server: 指定 docker 仓库地址

docker-username: 指定 docker 仓库账号

docker-password: 指定 docker 仓库密码

创建完 Secret 资源后,其他的如方式一,这就简单了。

方式三


第三种方式所使用的是最简单的办法,即我们利用 k8s 的拉取镜像的策略来处理,主要有如下三种:

Always:每次创建时都会拉取镜像

IfNotPresent:宿主机不存在时拉取镜像

Never: 从不主动拉取镜像

使用 IfNotPresent、Never 策略来处理。

以上三种方式,我比较推荐第二种,最中意第二种,因为假如密码修改了,就更新一下 secret 就好了,k8s node 不需要改动。而第一种需要改动,第三种会导致镜像丢失,毕竟只有本地存在。

结束福利

开源实战利用 k8s 作微服务的架构设计代码:

https://gitee.com/damon_one/spring-cloud-k8shttps://gitee.com/damon_one/spring-cloud-oauth2
复制代码

欢迎大家 star,多多指教。

关于作者

  笔名:Damon,技术爱好者,长期从事 Java 开发、Spring Cloud 的微服务架构设计,以及结合 Docker、K8s 做微服务容器化,自动化部署等一站式项目部署、落地。目前主要从事基于 K8s 云原生架构研发的工作。Golang 语言开发,长期研究边缘计算框架 KubeEdge、调度框架 Volcano 等。公众号 程序猿Damon 发起人。个人微信 MrNull008,个人网站:Damon | Micro-Service | Containerization | DevOps,欢迎來撩。

欢迎关注:InfoQ

欢迎关注:腾讯自媒体专栏


精彩推荐

欢迎关注




发布于: 2021 年 05 月 13 日阅读数: 39
用户头像

Damon

关注

God bless the fighters. 2020.03.11 加入

欢迎关注公众号:程序猿Damon,长期从事Java开发,研究Springcloud的微服务架构设计。目前主要从事基于K8s云原生架构研发的工作,Golang开发,长期研究边缘计算框架KubeEdge、调度框架Volcano、容器云KubeSphere研究

评论

发布
暂无评论
如何利用k8s拉取私有仓库镜像