kubernetes實戰篇之為預設賬戶建立映象拉取金鑰

周國通發表於2019-07-01

系列目錄

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

相關文章