一 secret概述1.1 secret作用Secret對象,主要作用是保管私密數據,比如密碼、OAuth Tokens、SSH Keys等信息。將這些私密信息放在Secret對象中比直接放在Pod或Docker Image中更安全,也更便於使用和分發。二 secret使用2.1 secret創建[ ...
一 secret概述
1.1 secret作用
Secret對象,主要作用是保管私密數據,比如密碼、OAuth Tokens、SSH Keys等信息。將這些私密信息放在Secret對象中比直接放在Pod或Docker Image中更安全,也更便於使用和分發。二 secret使用
2.1 secret創建
[root@k8smaster01 study]# kubectl create namespace myns [root@k8smaster01 study]# echo -n "value-1" | base64 dmFsdWUtMQ== [root@k8smaster01 study]# echo -n "value-2" | base64 dmFsdWUtMg== [root@k8smaster01 study]# vi secrets.yaml1 apiVersion: v1 2 kind: Secret 3 metadata: 4 name: mysecret 5 namespace: myns 6 type: Opaque 7 data: 8 password: dmFsdWUtMg0K 9 username: dmFsdWUtMQ0K[root@k8smaster01 study]# kubectl create -f secrets.yaml
註意:data域的各子域的值必須為BASE64編碼值,如上password域和username域都為BASE64編碼。
2.2 secret引用
創建完secret之後,可通過如下三種方式引用:- 在創建Pod時,通過為Pod指定Service Account來自動使用該Secret。
- 通過掛載該Secret到Pod來使用它。
- 在Docker鏡像下載時使用, 通過指定Pod的spc.ImagePullSecrets來引用它。
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: mypod 5 namespace: myns 6 spec: 7 containers: 8 - name: mycontainer 9 image: redis 10 volumeMounts: 11 - name: foo 12 mountPath: "/etc/foo" 13 readOnly: true 14 volumes: 15 - name: foo 16 secret: 17 secretName: mysecret[root@k8smaster01 study]# kubectl create -f mysecretpod.yaml 如上例創建的Secret,被掛載到一個叫作mycontainer的Container中,在該Container中可通過相應的查詢命令查看所生成的文件和文件中的內容。 [root@k8smaster01 study]# kubectl exec -ti mypod -n myns ls /etc/foo #查看掛載後的secret password username [root@k8smaster01 study]# kubectl exec -ti mypod -n myns cat /etc/foo/username value-1 [root@k8smaster01 study]# kubectl exec -ti mypod -n myns cat /etc/foo/password value-2 示例2:鏡像中引用,通常用於拉取需要驗證賬號密碼的私有倉庫的鏡像。 [root@k8smaster01 ~]# docker login [email protected] registry.cn-hangzhou.aliyuncs.com Password:【阿裡雲倉庫密碼】 [root@k8smaster01 ~]# cat ~/.docker/config.json #查看是否寫入登錄信息 [root@k8smaster01 ~]# base64 -w 0 ~/.docker/config.json #將登錄信息文件轉化為base64編碼 [root@k8smaster01 ~]# vim mysecretaliyun.yaml #創建secret內容
1 apiVersion: v1 2 kind: Secret 3 metadata: 4 name: myregsecret 5 namespace: default 6 data: 7 .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOiB7CgkJCSJhdXRoIjogIm 8 VERXlNRGsxTWpVM05rQXhNall1WTI5dE9uZzNNemMwTlRJeEtnPT0iCgkJfQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkiVXNlci1BZ2VudCI6ICJ 9 Eb2NrZXItQ2xpZW50LzE4LjAxxxxxxxxxxxxxxx 10 type: kubernetes.io/dockerconfigjson[root@k8smaster01 ~]# kubectl create -f mysecretaliyun.yaml [root@k8smaster01 ~]# vi mytestpod.yaml #創建Pod中使用imagePullSecrets引用
1 apiVersion: v1 2 kind: Pod 3 metadata: 4 name: mypodaliyun 5 spec: 6 containers: 7 - name: mongo 8 image: registry.cn-hangzhou.aliyuncs.com/xhypn/mongo:3.6 9 imagePullSecrets: 10 - name: myregsecret[root@k8smaster01 ~]# kubectl create -f mytestpod.yaml [root@k8smaster01 ~]# kubectl get pods mypodaliyun 1/1 Running 0 48s [root@k8smaster01 ~]# kubectl describe pods mypodaliyun
三 secret其他註意點
3.1 secret註意點
每個單獨的Secret大小不能超過1MB,Kubernetes不鼓勵創建大的Secret,因為如果使用大的Secret,則將大量占用API Server和kubelet的記憶體。當然,創建許多小的Secret也能耗盡API Server和kubelet的記憶體。 在使用Mount方式掛載Secret時,Container中Secret的data域的各個域的Key值作為目錄中的文件,Value值被BASE64編碼後存儲在相應的文件中。secret使用場景之一就是通過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。