上一篇我們聊到 多環境部署:Dev、Staging、Prod 隔離方式,當我們將系統拆分成多個環境時,最麻煩的事情之一就是「設定檔管理」。
程式碼一份沒錯,但不同環境需要不同的設定,例如 API URL、Log Level、Feature Flags,要怎麼有效管理呢?
在 Kubernetes 中,ConfigMap 就是解決方案之一。今天我們就來看看它的用途、建立方式,並透過實作範例帶你快速上手。
在容器化之前,我們常常把設定直接寫在程式碼裡,或用 .env
檔控制。
但是在 Kubernetes 的世界裡,我們希望「應用程式」與「設定」能完全解耦,讓同一份程式碼可以在不同環境中靈活部署。
這樣一來,程式碼與設定就能完全分離,提高靈活度與安全性。
1. 使用 YAML 檔
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: "staging"
API_URL: "https://api.staging.example.com"
套用指令:
kubectl apply -f configmap.yaml
2. 使用 kubectl 指令
kubectl create configmap app-config \
--from-literal=APP_ENV=staging \
--from-literal=API_URL=https://api.staging.example.com
3. 從檔案匯入
kubectl create configmap app-config --from-file=config.properties
1. 注入環境變數
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: demo-container
image: nginx
envFrom:
- configMapRef:
name: app-config
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
containers:
- name: demo-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
這樣 /etc/config 目錄底下就會出現 ConfigMap 的 key/value 檔案。
假設我們有一個簡單的 Node.js API,需要依環境切換不同的 API URL。
Step 1:建立三份 ConfigMap
以 Staging 為例:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-staging
data:
APP_ENV: "staging"
API_URL: "https://api.staging.example.com"
Step 2:Deployment 使用對應的 ConfigMap
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
spec:
replicas: 2
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
spec:
containers:
- name: demo-container
image: node:18
envFrom:
- configMapRef:
name: app-config-staging
Step 3:驗證
進入 Pod 查看環境變數:
kubectl exec -it demo-app-xxxxx -- printenv | grep API_URL
輸出結果應該會是:
API_URL=https://api.staging.example.com
這樣就完成了「不同環境使用不同設定」的部署方式 🎉
👉 下一篇,我們將探討 Secret:管理敏感資訊,補足 ConfigMap 的不足之處。