iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 17

Day 17: Secret:管理敏感資訊

  • 分享至 

  • xImage
  •  

在前一篇 Day 16: ConfigMap 中,我們學到如何用 ConfigMap 來管理應用程式的設定檔。不過,如果今天要存放的不是一般設定,而是 密碼、API Key、TLS 憑證 這類敏感資訊,ConfigMap 就不太合適了。
這時候,就需要 Secret 上場了!

為什麼需要 Secret?

在真實世界中,應用程式往往需要連接資料庫、第三方服務或 API,而這些連線必須使用帳號密碼或金鑰。如果這些資訊:

  • 寫死在 Deployment YAML 中 → 容易被看到
  • 放在 ConfigMap → 沒有額外的安全保護

Secret 的設計目的,就是要安全地管理敏感資訊。

Secret 的核心概念

1. 用途
- 管理敏感資料,例如:資料庫帳號密碼、OAuth Token、SSH Key、TLS 憑證等。
2. 與 ConfigMap 的差異
- ConfigMap:存放一般設定(不敏感)。
- Secret:存放敏感資訊,資料會用 Base64 編碼。
3. 存放形式
- Secret 會儲存在 Kubernetes 的 etcd 中。
- 可透過環境變數或 Volume 掛載方式,注入到 Pod 中。

建立 Secret 的方式

  1. 命令式建立
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=123456
  1. YAML 建立
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  username: YWRtaW4=
  password: MTIzNDU2

注意:data 欄位的值需要是 Base64 編碼。

  1. Secret 的常見類型
    • Opaque(預設,任意資料)
    • kubernetes.io/tls(TLS 憑證)
    • kubernetes.io/dockerconfigjson(私有 Docker Registry 登入資訊)

使用 Secret 的方式

  1. 以環境變數注入
apiVersion: v1
kind: Pod
metadata:
  name: secret-env-demo
spec:
  containers:
  - name: app
    image: nginx
    env:
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password
  1. 以 Volume 掛載
apiVersion: v1
kind: Pod
metadata:
  name: secret-volume-demo
spec:
  containers:
  - name: app
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secret"
  volumes:
  - name: secret-volume
    secret:
      secretName: db-secret

安全性考量

  • Base64 不是加密 → 容易被 decode。
  • Secret 預設會以明文存在 etcd → 建議開啟 Encryption at Rest。
  • 搭配 RBAC 限制存取權限,避免任意使用者讀取 Secret。
  • 高安全需求情境 → 可搭配 HashiCorp Vault、AWS KMS、GCP KMS。

實作範例:用 Secret 管理 MySQL 密碼

  1. 建立 Secret
kubectl create secret generic mysql-secret \
  --from-literal=username=root \
  --from-literal=password=MyStrongPassword
  1. 建立 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql-app
  template:
    metadata:
      labels:
        app: mysql-app
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: username
  1. 驗證 Secret 是否生效
kubectl exec -it <pod-name> -- printenv | grep MYSQL

可以看到 MYSQL_ROOT_PASSWORDMYSQL_USER 已經成功注入。

總結

  • Secret 是 Kubernetes 提供的資源,用來管理敏感資訊。
  • 與 ConfigMap 的差異:用途不同(一般設定 vs. 敏感資訊)。
  • Secret 可以透過 環境變數 或 Volume 注入到 Pod。
  • 實務上建議搭配 加密與 RBAC,甚至外部 Secret 管理工具。

在下一篇 Day 18: Volume 基礎:EmptyDir、HostPath 中,會更深入探討 Volume,而 Secret 也能以 Volume 的形式掛載到容器中,讓你更靈活地管理應用程式所需的敏感資料。


上一篇
Day 16: ConfigMap:管理設定檔
系列文
新創視角下的 DevOps × AI 探索17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言