沿用 lab 裡的 web,這次把環境名稱放進 ConfigMap,再交給容器使用。這樣切換環境時就不用重新製作 Nginx 映像。
建立名為 app-config 的設定,並放入 APP_MODE=staging:
kubectl create configmap app-config --from-literal=APP_MODE=staging -n lab
kubectl get configmap app-config -n lab -o yaml
查詢結果的 data 區段應該會看到 APP_MODE: staging。這只是一般設定,如果內容是密碼或金鑰,應該改用 Secret。
將 ConfigMap 內的資料注入 web,這會修改 Pod 範本並觸發一次更新。等待部署完成後,再進入容器查看環境變數:
kubectl set env deployment/web --from=configmap/app-config -n lab
kubectl rollout status deployment/web -n lab --timeout=120s
kubectl exec deployment/web -n lab -- printenv APP_MODE
畫面應該會輸出 staging。Nginx 本身不會因為這個變數改變網站內容,我們只是借它示範設定如何進入容器;真正的程式還要自己讀取並使用這個值。
開啟編輯器,把 APP_MODE 從 staging 改成 testing,儲存後離開:
kubectl edit configmap app-config -n lab
馬上再查一次,容器仍會顯示 staging。因為環境變數是在容器啟動時讀進去的,單獨修改 ConfigMap 不會替現有 Pod 更新內容。
kubectl exec deployment/web -n lab -- printenv APP_MODE
讓 Deployment 進行滾動重啟,等新 Pod 就緒後再查看,這次應該會看到 testing:
kubectl rollout restart deployment/web -n lab
kubectl rollout status deployment/web -n lab --timeout=120s
kubectl exec deployment/web -n lab -- printenv APP_MODE
這次看到值改變,代表新 Pod 已讀到新的設定。正式環境修改 ConfigMap 時,也要記錄改了什麼、何時重啟,否則出問題時很難確認各個 Pod 實際拿到哪一版內容。