上一节我们分别使用纯文本账户密码和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 使用修改yml的方式为default用户增加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-uudge2) 我们编辑这个文件,增加一个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: regcred3) 更新default这个账户
kubectl replace serviceaccount default -f ./sa.yaml