如何利用k8s拉取私有仓库镜像
现象
最近实战时,发现一个很奇怪的问题,在通过 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: v1
kind: Secret
metadata:
name: docker_reg_secret
namespace: default
data:
.dockerconfigjson: ewoJImF1dGhjNWdlpHVnVaenB5Wld4aFFFeFdUa2xCVGtBeU1ERTMiCgkJfASEkidXJlZy5rOHMueXVud2VpLnJlbGEubWUiOiB7CgkJCSJhdXRoIjogIloyRnZaM1Z2WkdWdVSrsaaehoUUV4V1RrbEJUa0F5TURFMyIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJSetcaFTssZW50IjogIkRvY2tlci1DbGllbnQvMTguMDYuMS1jZSAobGludXgpIgoJfQp9
type: 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 不需要改动。而第一种需要改动,第三种会导致镜像丢失,毕竟只有本地存在。
最
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android | dagger细枝篇
- ES UpdateByQuery Java Api
- [Bazel]repository_rule() vs rule()
- Windows 系统信息收集姿势
- 小白学PyTorch | 3 浅谈Dataset和Dataloader
- 小白学PyTorch | 4 构建模型三要素与权重初始化
- 小白学PyTorch | 5 torchvision预训练模型与数据集全览
- 细品redis的Scan和Keys命令
- if语句与while语句
- 内网渗透 | 基于IPC的横向移动
- 【DB笔试面试866】队列等待之enq: TX - allocate ITL entry
- 【Vue.js】Vue.js组件库Element中的上传、评分、穿梭框和表单
- 【Vue.js】Vue.js项目构建
- 【Vue.js】Vue.js组件库Element中的表格、标签和进度条
- 用个小技巧,趁你不备,rm -rf你的电脑