iT邦幫忙

2025 iThome 鐵人賽

DAY 12
1
Cloud Native

從 Docker 到 K8s:我的 30 天雲原生筆記系列 第 12

Day 12: ConfigMap & Secret

  • 分享至 

  • xImage
  •  

哈囉大家~歡迎來到 K8s 第五天

到目前為止,我們已經把 OTA 專案部署在 Kubernetes 上,學會了 DeploymentService,還用 LabelsNamespaces 把資源整理得乾乾淨淨。看起來一切都步上軌道了,對吧?

但今天要回頭檢查一個小細節,發現我們之前做了一件…有點危險的事。

還記得在 Day 7compose.yaml 嗎?

services:
  ota-backend:
    environment:
      - DB_HOST=ota-mariadb
      - DB_USER=ota_user
      - DB_PASSWORD=ota_password # <-- 等等,這裡有問題!
      - DB_NAME=ota_service

對,就是這裡。我們直接把資料庫密碼明文寫在設定檔裡。
如果這個 Image 被打包、推到 registry,任何人都可以看到密碼,完全就是大門敞開。
這帶來了幾個嚴重的問題:

  1. 不安全:任何能看到這份設定檔或 Image 的人,都能輕易獲取我們的資料庫密碼。
  2. 不靈活:如果我們要將應用部署到測試環境,需要連線到不同的資料庫,我們就必須去修改並重新套用這份 YAML 檔案。
  3. 職責不清:應用程式開發者,被迫需要知道生產環境的資料庫密碼。

今天,我們就要來學習 K8s 提供的標準解決方案,徹底將設定 (Configuration) 與我們的應用程式 (Application) 進行解耦 —— ConfigMapSecret

Part 1:管理一般設定 - ConfigMap

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 中的設定檔來使用。)

簡單來說,它就是讓你的應用程式 不用把設定寫死

1. 建立 ConfigMap

我們可以用宣告式的方式,建立一個 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

Pod 使用 ConfigMap

deployment.yaml 裡加上:

envFrom:
- configMapRef:
    name: ota-backend-config <--對應到這裡

這樣 DB_HOSTDB_PORTDB_NAME 就會自動注入到容器環境變數中,程式不用改,直接就能讀到。

Part 2:管理敏感資訊 - Secret

如果是密碼、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 跟 ConfigMap 的差異

它們的用法幾乎一樣,最大不同點是:Secret 會自動把值用 Base64 編碼存起來。
但是:Base64 ≠ 加密
它只是「遮掩」字串,避免明碼直接裸奔在 YAML 裡。安全性上,它只是第一層保護。

建立 Secret

先把字串編碼:

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

Pod 使用 Secret

一樣是在 deployment.yaml

envFrom:
- secretRef:
    name: ota-db-secret <-- 對應到這裡

這樣一來,容器啟動時就能同時拿到 ConfigMap 跟 Secret 的設定。
開發者完全不用碰到密碼,Image 也變得更乾淨。

Part 3:一張圖看懂

看圖片示意 ConfigMap 和 Secret 如何注入環境變數:
https://ithelp.ithome.com.tw/upload/images/20250919/20178656CzzGPbucKy.png

下一篇,我們會來看看 Kubernetes 的 PersistentVolume (PV) 與 PersistentVolumeClaim (PVC),了解如何給 Pod 持久化儲存空間,讓資料不會隨 Pod 重啟消失。


上一篇
Day 11: K8s 如何劃分領地 - Namespaces
下一篇
Day 13: PersistentVolume (PV) & PersistentVolumeClaim (PVC)
系列文
從 Docker 到 K8s:我的 30 天雲原生筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言