Kubernetes Secret 是一種將配置設置與應用分離的抽象,解決服務間配置的冗余與維護問題。主要可以用來保存敏感訊息,將這些 data 放在 Secret 中,比放在 Pod 的定義中或者 Docker Image中,來說更加安全和靈活。


簡介

Kubernetes 資源對象 Secret 概念上和 ConfigMap 一樣,也是希望將資料與應用程式解耦,但最重要的部分是可以用來保存敏感的資料,而不隨便曝露。一般情況下 ConfigMap 是用來儲存一些非敏感的設定 data ,如果涉及到一些安全相關的資料的話,用 ConfigMap 就非常不妥,因為 ConfigMap 是明文儲存的。而 Secret 是將一些敏感資訊,像是 :

  • 資料庫帳密
  • 訪問其他台 server 的 Access Token
  • SSH Key

非明碼的方式(opaque) 存放在 Kubernetes 中。

Secret 有以下幾種常見的使用方式:

  • 當成environment variables使用
  • 將 Secrets File mount 在 Pod 某個檔案路徑底下使用


Secret YAML

Secret 有分 data 和 stringData。

  • data: 用來儲存 base64 編碼的任意資料

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4= # echo -n 'admin' | base64
      password: MWYyZDFlMmU2N2Rm # echo -n '1f2d1e2e67df' | base64
    

    檢查是否正確編碼:

    echo "YWRtaW4=" | base64 -d
    admin
    
    echo "MWYyZDFlMmU2N2Rm " | base64 -d
    1f2d1e2e67df
    

  • stringData: 為了方便,它允許 Secret 使用未編碼的字串。

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: admin
      password: 1f2d1e2e67df
    

在 Pod 內,可以用環境變數的方式,使用 Secret 中的資料。

apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: registry.k8s.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
      - name: SECRET_USERNAME
      valueFrom:
        secretKeyRef:
          name: mysecret
          key: username

envFrom

此功能在 Kubernetes 1.6 版本之后可用。使用 envFrom 可將所有 Secret Secret 中的 Key 會直接成為 Pod 中的環境變數名稱。

apiVersion: v1
kind: Pod
metadata:
  name: envfrom-secret
spec:
  containers:
  - name: envars-test-container
    image: nginx
    envFrom:
    - secretRef:
        name: mysecret

除非容器重新啟動,否則容器將無法感知到 Secret 更新。但有第三方解決方案可以在 Secret 改變時觸發容器重新啟動。


參考資料