Kubernetes 访问 docker 仓库失败 no bas
一般我们push 镜像 获取pull镜像,需要docker login ,用账号密码登录仓库,同理Kubernetes 部署pod,拉取镜像也需要登录。
首先需要创建一个带有docker 仓库账号密码信息的secret,在部署的yml或json文件中,带上这个secret即可。
在pod上指定ImagePullSecrets
注意: Google Kubernetes Engine,GCE及其他自动创建node的云平台上,推荐使用本方法。
Kubernetes支持在pod中指定仓库密钥。
使用Docker Config创建Secret
运行以下命令,将大写字母代替为合适的值
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.
如果需要接入多个仓库,可以为每个仓库创建一个secret。 当为pod拉取镜像时,kubelet会将imagePullSecrets
合入一个独立虚拟的.docker/config.json
。
Pod只能引用和它相同namespace的ImagePullSecrets, 所以需要为每一个namespace做配置
通过kubectl创建secret
由于某种原因在一个.docker/config.json
中需要多个项或者需要非上述命令给出的secret,可以create a secret using json or yaml。
请保证:
- 设置data项的名称为
.dockerconfigjson
- 使用base64对docker文件编码,并将字符准确黏贴到
data[".dockerconfigjson"]
里
cat .docker/config.json| base64
- 设置
type
为kubernetes.io/dockerconfigjson
示例:
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
namespace: awesomeapps
data:
.dockerconfigjson: UmVhbGx5IHJlYWxseSByZWVlZWVlZWVlZWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGx5eXl5eXl5eXl5eXl5eXl5eXl5eSBsbGxsbGxsbGxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2cgYXV0aCBrZXlzCg==
type: kubernetes.io/dockerconfigjson
如果收到错误消息error: no objects passed to create
,可能是 base64 编码后的字符串非法。 如果收到错误消息类似Secret "myregistrykey" is invalid: data[.dockerconfigjson]: invalid value ...
, 说明数据已经解码成功,但是不满足.docker/config.json
文件的语法。
在pod中引用imagePullSecrets
现在,在创建pod时,可以在pod定义中增加imagePullSecrets
小节来引用secret
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
对每一个使用私有仓库的pod,都需要做以上操作。
也可以在serviceAccount 资源中设置imagePullSecrets自动设置imagePullSecrets
imagePullSecrets
可以和每个node上的.docker/config.json
一起使用,他们将共同生效。本方法在Google Kubernetes Engine 也能正常工作。