上一節我們分別使用純文字賬戶密碼和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-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