Kubernetes配置管理-Secret

Kubernetes配置管理-Secret

定義:

  • Secret 是 Kubernetes 中用於儲存敏感資料(如密碼、令牌、金鑰)物件。
  • 對敏感資訊進行了額外的保護,防止未經授權的存取。

功能:

  • 安全儲存: 以加密方式在 etcd 中儲存資料(需要啟用 etcd 加密)。
  • 權限控制: 透過 Kubernetes 的 RBAC(基於角色的存取控制)限制對 Secret 的存取。

創建secret 分為以下幾種

  1. 直接透過 指令進行創建
  2. 透過 envfile 結合指令創建
  3. 透過 yaml 進行創建

範例檔案

# envfile
mysql.host=127.0.0.1
mysql.port=3306
mysql.pass=123456

example

透過 指令進行創建

kubectl create secret generic my-secret --from-literal=mysql.host=127.0.0.1 --from-literal=mysql.port=3306 --from-literal=mysql.pass=123456

 # --from-literal 直接從指令中創建key值

透過 envfile 結合指令創建

kubectl create secret generic my-secret --from-file=envfile

透過 yaml 進行創建

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
stringData:
  mysql.host: "127.0.0.1"
  mysql.port: "3306"
  mysql.pass: "123456"

使用方式

  • 注入環境變量
  • 掛載

注入環境變量

# 注入特定key 
env:
  - name: mysql.host # 請注意 這邊是掛載進容器環境變量的名稱
    valueFrom:
      secretKeyRef:
        name: my-secret # 輸入創建的secret名稱
        key: mysql.host # 選擇要注入的key

# 注入全部key到環境變量
envFrom:
 - secretRef:
     name: my-secret

注意 已掛載在 「環境變量的secret」 的Pod 「不會」自動更新,而可以通過以下幾個方法更新

  1. 手動重啟pod : 透過刪除Pod K8s會自動重新部署,並掛載最新的Secret
kubectl delete pod {podName}
  1. 滾動更新deploy: 如果Pod是透過Deploy 部署的話可以觸發滾動更新,會重新創建最新的Pod並掛載新的Secret。
kubectl rollout restart deploy {deployName}

掛載到特定目錄

# 注意 K8s 不提供Secret 將全部key 掛載到容器內
# 只能將key 拆開 若要掛載檔案 還是只能使用 configMap 會比較清晰好一點

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          volumeMounts:
            - name: secret-volume
              mountPath: "/data/htdocs/example/envfile"
      volumes:
        - name: secret-volume
          secret:
            secretName: my-secret

文末提供測試的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          resources:
            requests:
              cpu: "100m"
              memory: "128Mi"
            limits:
              cpu: "200m"
              memory: "256Mi"
          # 將特定key 注入到容器內
          # env:
          #   - name: mysql.host
          #     valueFrom:
          #       secretRef:
          #         name: my-secret
          # 將所有key 注入到容器內
          # envFrom:
          #   - secretRef:
          #       name: my-secret

      # 掛載方式, 但注意 k8s針對secret 是不支持將全部掛載成一個檔案
      #     volumeMounts:
      #       - name: secret-volume
      #         mountPath: "/data/htdocs/example/envfile"
      # volumes:
      #   - name: secret-volume
      #     secret:
      #       secretName: my-secret