上一节我们分别使用纯文本账户密码和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"}]}'

完了之后,大家可以自己验证一下,重新编排一个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-uudge
  1. 我们编辑这个文件,增加一个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
  1. 更新default这个账户
kubectl replace serviceaccount default -f ./sa.yaml
05-11 20:20