K8S Secret 部署處理

Gary Ng
7 min readOct 2, 2024

--

在使用 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 有幾種做法

  1. 使用 Sealed Secret (kubeseal)
  2. 使用 Vault
  3. 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

參考資料:

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet