上一节我们分别使用纯文本账户密码和docker的config文件一创建一个kubernetes secret
对象,并且把它添加到containers的imagePullSecrets
字段用以拉取私仓镜像.这一节我们讲解另一种方法:即把secret附加到default
这个serviceaccount上,这样拉取镜像的时候就不需要每次都在yml文件里声明imagePullSecrets
字段.
至于为什么把镜像的拉取secret附加到default
这个serviceaccont上就可以实现无密钥拉取,实际上这里涉及到了kubernetes的RBAC权限,本教程其它章节有介绍过,这里不再详细介绍.默认情况下,拉取镜像使用的是default
这个账户,如果给这个账户添加了镜像拉取secret,则它会在拉取镜像时自动使用附加的secret,这样就不用在每个yml文件里都声明imagePullSecrets
字段了.
其实知道了原理,并且有了上一节的基础,做法也非常简单,只需要一行命令即可
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "regcred"}]}'
regcred
是我们上一节生成的密钥.
完了之后,大家可以自己验证一下,重新编排一个yml文件,拉取本地没有的镜像,可以看到,yml文件里没有声明imagePullSecrets
,也同样可以拉取镜像.我的编排文件如下,非常简单,供大家参考
apiVersion: v1
kind: Pod
metadata:
name: testport
spec:
containers:
- name: cat-hosts
image: 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4
imagePullPolicy: IfNotPresent
imagePullSecrets
.上述操作虽然看似非常简单,却要求非常高,否则很容易出错,当然大家可以选择记住这个命令,然后类似的命令越来越多时,全部记起来显然不是一个好的办法,我们需要一种可行的操作方法.
1) 把sa的编排文件导出到其它文件
kubectl get serviceaccounts default -o yaml > ./sa.yaml
内容看起来类似如下:
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
resourceVersion: "243024"
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
2) 我们编辑这个文件,增加一个imagePullSecrets
字段,并把regcred
赋给它,这样二者之间就建立了关联
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2015-08-07T22:02:39Z
name: default
namespace: default
selfLink: /api/v1/namespaces/default/serviceaccounts/default
uid: 052fb0f4-3d50-11e5-b066-42010af0d7b6
secrets:
- name: default-token-uudge
imagePullSecrets:
- name: regcred
3) 更新default
这个账户
kubectl replace serviceaccount default -f ./sa.yaml