k8s之Secret

Liusy01發表於2021-01-18


導讀

上一篇說了ServiceAccount,這一篇就來看一下Secret。

Secret

Secret的主要作用是保管私密資料,比如密碼、OAuth Tokens、SSH Keys等資訊。

上一篇說到,預設的Secret主要包含三個東西,分別是token、ca.crt、namespace

k8s之Secret

 

當然,也可以包含其他資訊,

例如:建立一個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

  

k8s之Secret

 

(3)在Docker映象下載時使用,通過設定spec.imagePullSecrets來引用

1、docker登陸私有倉庫

docker login localhost:5000

  

輸入使用者名稱和密碼,如果是第一次登陸,則會建立使用者,相關資訊會被寫入~/.docker/config.json檔案中

k8s之Secret

 

k8s之Secret

 

2、用BASE64編碼~/.docker/config.json的內容

cat ~/.docker/config.json | base64

  

k8s之Secret

 

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

  

k8s之Secret

 

在使用Mount方式掛載Secret時,Container中Secret的data域的各個域的key值作為目錄的檔案,Value值被BASE64編碼後存在相應的檔案中

該Container中可通過相應的查詢命令檢視所生成的檔案和檔案中的內容,如下所示:

k8s之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

 

 

相關文章