上一節我們分別使用純文本賬戶密碼和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
.
上述操作雖然看似非常簡單,卻要求非常高,否則很容易出錯,當然大家可以選擇記住這個命令,然后類似的命令越來越多時,全部記起來顯然不是一個好的辦法,我們需要一種可行的操作方法.
- 把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
- 我們編輯這個文件,增加一個
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
- 更新
default
這個賬戶
kubectl replace serviceaccount default -f ./sa.yaml