kubernetes實踐之十四:Service Account與Secret

百聯達發表於2018-04-11
一:Service Account與Secret資料結構


二:Service Account與Secret執行機制

1.kubernetes的master節點由三部分組成kube-apiserver,kube-scheduler和kube-controller-manager。其中controller manager會根據apiserver的配置資訊(--admission-control和--service-account-private-key-file),生成ServiceAccount controller 和token controller.

2.ServiceAccount controller一直監聽Service Account和Namespace事件。如果一個Namespace中沒有default Service Account,那麼Service Account Controller就會為該Namespace建立一個預設的(default)的Service Account。

3.Token Controller也監聽Service Account的事件,如果發現新建的Service Account裡沒有對應的Service Account Secret,則會用API Server私鑰(--service-account-private-key-file指定的檔案)建立一個Token(JWT Token),並用該Token、CA證書(這個是API Server的CA公鑰證書,來源於controller-manager配置檔案中的root-ca-file),Namespace名稱等三個資訊產生一個新的Secret物件,然後放入剛才的Service Account中;如果監聽到的事件是刪除Service Account事件,則自動刪除與該Service Account相關的所有Secret。此外,Token Controller物件同時監聽Secret的建立、修改和刪除事件,並根據事件的不同做不同的處理。

4.API Server收到Token以後,採用自己的私鑰(實際是使用apiserver配置檔案中的引數service-account-key-file指定的私鑰,如果此引數沒有設定,則預設採用tls-private-key-file指定的引數,即自己的私鑰)對Token進行合法驗證。


三:Service Account相關概念

1.    Service Account概念的引入是基於這樣的使用場景:執行在pod裡的程式需要呼叫Kubernetes API以及非Kubernetes API的其它服務。Service Account它並不是給kubernetes叢集的使用者使用的,而是給pod裡面的程式使用的,它為pod提供必要的身份認證。

2. 如果kubernetes開啟了ServiceAccount(apiserver配置檔案)那麼會在每個namespace下面都會建立一個預設的default的service account。

3.ServiceAccount詳情

4.當建立pod的時候,如果沒有指定一個service account,系統會自動在該pod所在的namespace下為其指派一個default service account.

a.    如果spec.serviceAccount域沒有被設定,則Kubernetes預設為其制定名字為default的Serviceaccount;

b.    如果Pod的spec.serviceAccount域指定了default以外的ServiceAccount,而該ServiceAccount沒有事先被建立,則該Pod操作失敗;

c.    如果在Pod中沒有指定“ImagePullSecrets”,那麼該sec.serviceAccount域指定的ServiceAccount的“ImagePullSecrets”會被加入該Pod;

d.    給Pod新增一個新的Volume,在該Volume中包含ServiceAccountSecret中的Token,並將Volume掛載到Pod中所有容器的指定目錄下(/var/run/secrets/kubernetes.io/serviceaccount);


四:Secret相關概念


1.Secret解決了密碼、token、金鑰等敏感資料的配置問題,而不需要把這些敏感資料暴露到映象或者Pod Spec中。Secret可以以Volume或者環境變數的方式使用。

2.
Secret有三種型別:
·Service Account:用來訪問Kubernetes API,由Kubernetes自動建立,並且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中;
·Opaque:base64編碼格式的Secret,用來儲存密碼、金鑰等;
·kubernetes.io/dockerconfigjson:用來儲存私有docker registry的認證資訊。



我們可以通過Secret保管其它系統的敏感資訊,並以Mount的方式將Secret掛載到Container中,然後通過訪問目錄中檔案的方式獲取該敏感資訊。當Pod被API Server建立時,API Server不會校驗該Pod引用的Secret是否存在。一旦這個Pod被呼叫,則kubelet將試著獲取Secret的值,如果Secret不存在或者暫時無法連線到API Server,則kubelet將按一定的時間間隔定期重試獲取Secret. 為了使用更新後的secret,必須刪除舊的Pod,並重新建立一個新的Pod.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2152817/,如需轉載,請註明出處,否則將追究法律責任。

相關文章