在使用 K8S 建置服務的過程中,假如有需要設定機密資訊的地方,我們都會使用 Secret ,但是 Secret 的編碼方式是使用 base64, 假如我們將其推送到 Git 的話顯然不夠安全,因此可以透過其他方式將 Secret 的部分進行加密後再推送到 Git。
Secret 範例:
apiVersion: v1
kind: Secret
metadata:
name: demo-secret-from-yaml # secret 名稱
type: Opaque
data: # secret 資料
username: cm9vdA==
password: cm9vdHBhc3M=
假如對於 K8S 不熟悉,甚至是對 Secret 不了解的話可以看一下 K8S 教學文章
要加密 Secret 有幾種做法
- 使用 Sealed Secret (kubeseal)
- 使用 Vault
- AWS Secret Manager 等密碼管理平台
Sealed Secret 安裝
而要使用 Sealed Secret 的話我們首先需要安裝 Sealed Secret, 我們首先透過 helm 安裝 sealed-secre 相關 controller, 緊接著透過 brew 安裝 kubeseal CLI。
helm 安裝
使用 brew 安裝 helm
brew install helm
檢查 helm 是否安裝成功
helm version
helm 初始化
helm init
使用 helm 安裝 sealed secret
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
檢查 helm reop 列表
helm repo list
指令說明:
helm install <name> <chart>
範例:
helm install my-release sealed-secrets/sealed-secrets
以上指令安裝 sealed-secrets 並命名為 my-release
ps: 在安裝的時候也可以指定 namespace
使用 brew 安裝 kubseal CLI
brew install kubeseal
kubeseal 安裝好後,開始將 Secret 加密成 Sealed Secret
指令說明:
可以使用以下指令產生 Sealed Secret
kubectl create secret generic secret-name --dry-run=client --from-literal=foo=bar -o [json|yaml] | \
kubeseal \
--controller-name=sealed-secrets \
--controller-namespace=default \
--format yaml > mysealedsecret.[json|yaml]
部署 Sealed Secret (會顯示加密後的 Secret )
kubectl create -f <sealed secret filename>.[json|yaml]
檢視部署的 secret 內容, 這邊應該會顯示解密後的 secret
kubectl get secret <secret name> -o [json|yaml]
我們先撰寫一個 secret
apiVersion: v1
kind: Secret
metadata:
name: mysql
labels:
mysql: test
type: Opaque
data:
username: cm9vdAo=
password: cm9vdAo=
將 secret 加密成 sealed secret
cat mysql-secret.yml | kubeseal --controller-name=sealed-secrets --controller-namespace=default --format yaml mysql-sealed-secret.yaml
產生的 sealed secret 內容
部署 sealed secret
kubectl create -f mysql-sealed-secret.yaml
檢查 sealed secret
kubectl get sealedsecret
檢查 secret
kubectl get secrets
檢視 mysql secret 的內容, 會發現 username 以及 password 為我們先前建立的 mysql.yml 一樣。
kubectl get secrets mysql -o yaml
這邊可以看到 mysql secret 是被 SealedSecret 所管理,所以假如使用 kubectl 刪除 secret 的話,沒過多久又會根據 sealed secret 在重新產生 secret, 所以要想刪除 secret 的話得刪除 sealed secret 才行。
刪除 sealed secret
kubectl delete sealedsecret mysql
參考資料: