k8s之Secret
- 2021 年 1 月 18 日
- 筆記
- Kubernetes
導讀
上一篇說了ServiceAccount,這一篇就來看一下Secret。
Secret
Secret的主要作用是保管私密數據,比如密碼、OAuth Tokens、SSH Keys等信息。
上一篇說到,默認的Secret主要包含三個東西,分別是token、ca.crt、namespace
當然,也可以包含其他信息,
例如:創建一個Secret
apiVersion: v1 kind: Secret metadata: name: secret type: Opaque data: password: base64 username: base64
在data域中的各子域的值必須是BASE64編碼值。
Secret被創建之後,可以通過下列三種方式使用它:
(1)為Pod指定Service Account來自動使用該Secret
apiVersion: v1 kind: Pod metadata: name: pod spec: containers: - name: pod image: image serviceAccountName: serviceaccount
(2)通過掛載該Secret到Pod來使用它
apiVersion: v1 kind: Pod metadata: name: pod spec: containers: - name: pod image: image volumeMounts: - name: foo mountPath: "/data" readOnly: true volumes: - name: foo secret: secretName: secretname
(3)在Docker鏡像下載時使用,通過設置spec.imagePullSecrets來引用
1、docker登陸私有倉庫
docker login localhost:5000
輸入用戶名和密碼,如果是第一次登陸,則會創建用戶,相關信息會被寫入~/.docker/config.json文件中
2、用BASE64編碼~/.docker/config.json的內容
cat ~/.docker/config.json | base64
3、將第二步的輸出結果作為secret的data.dockercfg域的內容,由此創建一個Secret
apiVersion: v1 kind: Secret metadata: name: base64secret data: .dockercfg: ewoJImF1dGhzIjogewoJCSJsb2NhbGhvc3Q6NTAwMCI6IHsKCQkJImF1dGgiOiAiYkdsMWMzazZNVEl6TkRVMiIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTkuMDMuMTIgKGxpbnV4KSIKCX0KfQ== type: kubernetes.io/dockercfg
4、在創建Pod時引用該Secret
apiVersion: v1 kind: Pod metadata: name: k8sdemo spec: containers: - name: k8sdemo image: cnode-1:5000/k8sdemo:v1.3 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 imagePullSecrets: - name: base64secret
在使用Mount方式掛載Secret時,Container中Secret的data域的各個域的key值作為目錄的文件,Value值被BASE64編碼後存在相應的文件中
該Container中可通過相應的查詢命令查看所生成的文件和文件中的內容,如下所示:
可以通過Secret保管敏感信息,並以Mount方式將Secret掛載到Container中,然後通過訪問目錄中文件的方式獲取信息。
當Pod被API Server創建時,API Server不會檢驗該Pod引用的Secret是否存在,一旦這個Pod被調度,則kubelet將試着去獲取Secret的值,如果Secret不存在或暫時無法連接到API Server,則kubelet將按時間間隔定期重試獲取該Secret,並發送一個Event來解釋Pod沒有啟動的原因,一旦Secret被Pod獲取,則kubelet將創建並掛載包含Secret的Volume。只有所有Volume都掛載成功,Pod中的Container才會被啟動,在kubelet啟動Pod中的Container後,Container中和Secret相關的Volume將不會被改變,即使Secret本身被修改。為了使用更新後的Secret,必須刪除舊Pod,並重新創建一個新Pod