哈囉大家~歡迎來到 K8s 第五天!
到目前為止,我們已經把 OTA 專案部署在 Kubernetes 上,學會了 Deployment
、Service
,還用 Labels
和 Namespaces
把資源整理得乾乾淨淨。看起來一切都步上軌道了,對吧?
但今天要回頭檢查一個小細節,發現我們之前做了一件…有點危險的事。
還記得在 Day 7 的 compose.yaml
嗎?
services:
ota-backend:
environment:
- DB_HOST=ota-mariadb
- DB_USER=ota_user
- DB_PASSWORD=ota_password # <-- 等等,這裡有問題!
- DB_NAME=ota_service
對,就是這裡。我們直接把資料庫密碼明文寫在設定檔裡。
如果這個 Image 被打包、推到 registry,任何人都可以看到密碼,完全就是大門敞開。
這帶來了幾個嚴重的問題:
今天,我們就要來學習 K8s 提供的標準解決方案,徹底將設定 (Configuration) 與我們的應用程式 (Application) 進行解耦 —— ConfigMap 與 Secret。
ConfigMap 的角色很簡單:存放不需要保密的設定值。你可以把它想成「放在 Kubernetes 裡的設定檔抽屜」。
官方文件定義:
A ConfigMap is an API object used to store non-confidential data in key-value pairs. Pods can consume ConfigMaps as environment variables, command-line arguments, or as configuration files in a volume.
(ConfigMap 是一個 API 物件,用於以鍵值對的形式儲存非機密資料。Pods 可以將 ConfigMaps 作為環境變數、命令列參數,或 Volume 中的設定檔來使用。)
簡單來說,它就是讓你的應用程式 不用把設定寫死。
我們可以用宣告式的方式,建立一個 configmap.yaml
:
# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ota-backend-config <-- 這邊對應
namespace: project-space
data:
DB_HOST: ota-mariadb-service
DB_PORT: "3306"
DB_NAME: ota_service
套用:
kubectl apply -f configmap.yaml
在 deployment.yaml
裡加上:
envFrom:
- configMapRef:
name: ota-backend-config <--對應到這裡
這樣 DB_HOST
、DB_PORT
、DB_NAME
就會自動注入到容器環境變數中,程式不用改,直接就能讀到。
如果是密碼、API Token、TLS 憑證這種東西,絕對不能放 ConfigMap!
這時候,就要用 Secret。
官方文件定義:
A Secret is an object that contains a small amount of sensitive data such as a password, a token, or a key.
(Secret 是一個包含少量敏感資料(例如密碼、令牌或金鑰)的物件。)
它們的用法幾乎一樣,最大不同點是:Secret 會自動把值用 Base64 編碼存起來。
但是:Base64 ≠ 加密。
它只是「遮掩」字串,避免明碼直接裸奔在 YAML 裡。安全性上,它只是第一層保護。
先把字串編碼:
echo -n 'ota_user' | base64
# b3RhX3VzZXI=
echo -n 'ota_password' | base64
# b3RhX3Bhc3N3b3Jk
然後寫進 secret.yaml
:
apiVersion: v1
kind: Secret
metadata:
name: ota-db-secret <-- 這邊對應
namespace: project-space
type: Opaque
data:
DB_USER: b3RhX3VzZXI=
DB_PASSWORD: b3RhX3Bhc3N3b3Jk
套用:
kubectl apply -f secret.yaml
一樣是在 deployment.yaml
:
envFrom:
- secretRef:
name: ota-db-secret <-- 對應到這裡
這樣一來,容器啟動時就能同時拿到 ConfigMap 跟 Secret 的設定。
開發者完全不用碰到密碼,Image 也變得更乾淨。
看圖片示意 ConfigMap 和 Secret 如何注入環境變數:
下一篇,我們會來看看 Kubernetes 的 PersistentVolume (PV) 與 PersistentVolumeClaim (PVC),了解如何給 Pod 持久化儲存空間,讓資料不會隨 Pod 重啟消失。