Kubernetes - Secret
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 改變時觸發容器重新啟動。