一、环境背景
1、k8s集群,1.17+,目前k8s最新版本已更新至V1.31版本;
2、镜像仓库,如harbor、registry、portus、nexus等;
3、配置镜像仓库用户登录认证,参考资料如下:
harbor参考:https://www.geekby.cn/posts/harbor-https/
registry参考:https://www.cnblogs.com/chen2ha/p/14787695.html
二、优雅拉取镜像
k8s集群内部与docker通信机制如下:
kubelet——>docker shim——>docker-daemon(grpc接口)-containerd-socket--containerd-{containerd-shim-runcontainer————(单个进程与一个容器相对应)}
当需要下载镜像时,docker根据daemon.json文件中的insecure-registries配置参数,拉取镜像。
如果私有镜像仓库设置了用户认证,kubelet无法直接拉取镜像,在创建容器中会报错:“Failed to pull image”,查看日志定位为:访问镜像仓库失败;通过以下方法可以正常拉取私有镜像仓库镜像。
2.1基于secret方式实现
k8s集群内置的密钥(secret)机制,可以完成此需求。
#secret分类
$ kubectl create secret -h
Create a secret using specified subcommand.
Available Commands:
docker-registry 创建一个给 Docker registry 使用的 secret
generic 从本地 file, directory 或者 literal value 创建一个 secret
tls 创建一个 TLS secret
2.1.1 创建docker-registry 类型的secret
#基于k8s集群的名字空间隔离机制,需指定名字空间(注