愈来越多的企业和团体都有自己的私有仓库,但是在kubernetes中部署时,拉取私有仓库的私有镜像会出现拉取失败的问题。本文主要讲解如果解决这个问题。
HTTPS支持
如果是公开认证的证书,请忽略本步骤;如果是自生成的证书,需要配置docker。
在kubernetes所有节点中,配置docker,添加证书。
在/etc/docker/certs.d
文件夹下,创建以私有仓库域名为名字的文件夹,并将私有仓库的ca证书放到文件夹中。
例如我的:
/e/d/certs.d# tree
.
└── hub.ict.ac.cn
└── ca.crt
拉取公开镜像
自签名证书需要先配置docker信任证书。
证书配置完成后可直接拉取,使用镜像。
拉取私有镜像
核心思路:拉取私有仓库镜像需要配置私有仓库的登陆信息,用Secret存储,并且定义Deployment或者Pod时,指定imagePullSecret
为保存了私有仓库登陆信息的Secret名。
docker credential创建Secret
如果使用docker login登陆过私有仓库,那么可以直接使用.docker/config.json
文件生成Secret。
kubectl create secret generic <secret-name> \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
如果需要改变namespace 可以添加-n <your-namespace>
。也可以自定义Secret,但必须保证:
- Secret的data项目key是
.dockerconfigjson
; .docker/config.json
文件BASE64编码,然后粘贴到data[".dockerconfigjson"]
。不要有换行- Secret type必须是
kubernetes.io/dockerconfigjson
;
例如:
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
用户名密码创建Secret
也可以使用私有仓库的用户名密码,直接创建Secret:
kubectl create secret docker-registry <secret-name> --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
使用私有仓库的私有镜像
私有镜像使用的例子:
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: <your-private-image>
imagePullSecrets:
- name: regcred
注意:
imagePullSecrets
常见错误
error: no objects passed to create:Base64字符串错误。
Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ..:BASE64字符串正确但是不能解析为.docker/config.json
文件。
参考
--Edited from Rpc