iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
DevOps

DevOps 進化論:從全能型戰士到安全守門員系列 第 14

Day 14|ConfigMap × Secret:Kubernetes 設定與敏感資訊管理

  • 分享至 

  • xImage
  •  

● 前言

🔸 在 Kubernetes 部署應用程式時,設定檔(Configuration)與敏感資訊(Secrets)是不可或缺的部分。
🔸 傳統上我們可能會把這些資訊硬寫在程式碼或映像檔中,但這樣做不僅不安全,也會降低靈活性。
🔸 K8s 提供了 ConfigMapSecret 兩個核心資源,分別用來管理「非敏感」與「敏感」的設定,幫助我們在部署中達到 配置與程式解耦 的目標。


● 專案目錄

專案目錄


● 注入架構圖

注入架構圖


● 核心元件

1. ConfigMap

  • 概念:ConfigMap 用來存放非敏感設定,例如環境變數、應用程式設定檔。
  • 建立方式:支援 YAML 定義或透過 kubectl create configmap 指令建立
  • 使用方式:可以以「環境變數」或「Volume 掛載」方式注入 Pod
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-config
data:
  APP_ENV: "dev"
  API_URL: "http://example.com"
  app.conf: |
    # Sample configuration file
    setting1 = value1
    setting2 = value2

2. Secret

  • 概念:Secret 用於存放敏感資訊(帳號、密碼、憑證)。
  • 類型:Opaque、TLS、Registry 等不同用途
  • 使用方式:可透過環境變數、Volume 掛載或 ImagePullSecrets
  • 技巧:透過 Checksum annotation 可觸發 Deployment 自動更新
apiVersion: v1
kind: Secret
metadata:
  name: demo-secret
type: Opaque
data:
  USERNAME: ZGV2X3VzZXI=        # base64(dev_user)
  PASSWORD: MTIzNDU2            # base64(123456)

3. Deployment

  • 概念:管理 Pod 副本數與滾動更新,確保應用程式持續可用
  • 本例:建立 BusyBox Pod,並用 envFrom 載入 ConfigMap 與 Secret,驗證注入是否成功
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  selector:
    matchLabels: { app: demo-app }
  template:
    metadata:
      labels: { app: demo-app }
    spec:
      containers:
        - name: app
          image: busybox
          command: ["sh", "-c", "printenv | grep -E 'APP_ENV|API_URL|USERNAME|PASSWORD'; sleep 3600"]
          envFrom:
            - configMapRef:
                name: demo-config
            - secretRef:
                name: demo-secret

4. Service

  • 概念:提供 Pod 穩定存取入口,避免 Pod IP 動態變動問題
  • 用途:此範例使用 ClusterIP,對內部暴露 8080 port
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
spec:
  selector:
    app: demo-app
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: ClusterIP

● 實作步驟

1. 啟動 Minikube 並切回 Minikube 的 Docker 環境

Minikube 啟動

2. 建立檔案 → 撰寫 ConfigMap、Secret、Deployment、Service 的 YAML

撰寫檔案
ConfigMap
Secret

3. 建立腳本並執行,套用資源

minikube kubectl -- apply -f .

套用資源

4. 驗證環境變數與掛載檔案

printenv
ls /etc/...

驗證環境

5. 清除資源(視需要)

kubectl delete -f .

清除資源


● 注意事項

🔸 ConfigMap 適合非敏感資料;Secret 用於敏感資料
🔸 Secret 雖然用 Base64 存放,但不是加密,建議搭配 Vault 或 KMS
🔸 建立 Secret 時要注意權限控管(RBAC)
🔸 ConfigMap 與 Secret 更新後,Pod 不會自動重啟,需搭配 Checksum Annotation 或 kubectl rollout restart


● 總結

🔸 ConfigMap 與 Secret:分別處理設定檔管理與敏感資訊管理
🔸 Deployment 與 Service:確保應用程式能正常運作與存取
🔸 透過這些資源,我們能將程式碼與環境設定解耦,提升靈活性與安全性


👉 下一篇

Day 15|Helm Chart 入門(實作)


上一篇
Day 13|用 Deployment、Service 與 Ingress 打造完整的 K8s 對外服務流程
下一篇
Day 15|從 YAML 到 Helm:打造可重用的部署模板
系列文
DevOps 進化論:從全能型戰士到安全守門員30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言