在 Kubernetes 環境中,管理應用程式組態和敏感資料至關重要。ConfigMap 適用於非敏感組態,可直接掛載為 Volume 或注入環境變數。Secret 則用於保護敏感資料,例如密碼或 API 金鑰,並透過環境變數或 Volume 掛載方式供 Pod 使用。實務上,使用 YAML 檔案定義 ConfigMap 和 Secret 更易於版本控制和自動化佈署。設定不可變的 ConfigMap 可確保組態一致性,避免意外修改。對於 Secret,除了 base64 編碼外,更應搭配 RBAC 許可權控管和 KMS 加密提升安全性,並定期輪換以降低風險。

使用 ConfigMap 和 Secret 組態 Pod

將 ConfigMap 掛載為 Volume

就像注入環境變數一樣,我們需要使用 YAML 清單檔案以命令式的方式來完成這項操作。這裡,我們將一個名為 my-sixth-configmap 的 ConfigMap 掛載為一個新的 Pod flask-pod-with-configmap-volume 的 Volume 掛載點,如下所示:

# flask-pod-with-configmap-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: flask-pod-with-configmap-volume
spec:
  containers:
  - name: flask-with-configmap-volume
    image: quay.io/iamgini/my-flask-app:1.0
    volumeMounts:
    - name: configuration-volume # 與 Volume 名稱相符
      mountPath: /etc/conf
  volumes:
  - name: configuration-volume
    configMap:
      name: my-sixth-configmap # ConfigMap 名稱在此處填寫

內容解密:

  • 在此 YAML 檔案中,我們在與容器相同的層級宣告了一個名為 configuration-volume 的 Volume,並告訴 Kubernetes 這個 Volume 是由一個 ConfigMap 建立的。
  • 被參考的 ConfigMap(在這裡是 my-sixth-configmap)必須在我們套用此檔案時存在於叢集中。
  • 然後,在容器層級,我們將之前宣告的 Volume 掛載到 /etc/conf 路徑。
  • ConfigMap 中的引數應該會出現在指定的位置。

套用 YAML 檔案並驗證結果

讓我們套用此檔案來建立一個新的 Pod,並將 Volume 附加到我們的叢集:

$ kubectl apply -f flask-pod-with-configmap-volume.yaml
pod/flask-pod-with-configmap-volume created

執行容器中的 ls 命令來確認目錄是否已成功掛載:

$ kubectl exec pods/flask-pod-with-configmap-volume -- ls /etc/conf
color
configfile.txt

內容解密:

  • 目錄已成功掛載,並且在 ConfigMap 中建立的兩個引數都以純文字檔案的形式出現在該目錄中。

執行 cat 命令來確認兩個檔案是否包含正確的值:

$ kubectl exec pods/flask-pod-with-configmap-volume -- cat /etc/conf/color
yellow
$ kubectl exec pods/flask-pod-with-configmap-volume -- cat /etc/conf/configfile.txt
I'm just a dummy config file

內容解密:

  • 兩個檔案都包含了之前在建立 ConfigMap 時宣告的值。

刪除 ConfigMap

刪除 ConfigMap 非常簡單。但是,請注意,即使其值被容器使用,也可以刪除 ConfigMap。一旦 Pod 被啟動,它就與 ConfigMap 物件無關:

$ kubectl delete cm my-first-configmap
configmap "my-first-configmap" deleted

內容解密:

  • 無論 ConfigMap 的值是否被容器使用,它都會在輸入此命令後立即被刪除。
  • 請注意,ConfigMap 無法被還原,因此在刪除以命令式方式建立的 ConfigMap 之前,請三思。

更新 ConfigMap

在 Kubernetes 中,有兩種主要的方法來更新 ConfigMap。第一種方法是使用 kubectl apply 命令,並修改 ConfigMap 定義檔案。這種方法非常適合版本控制和協作環境。只需對 ConfigMap YAML 檔案進行必要的更改,然後使用 kubectl apply 套用更新。

或者,您可以使用 kubectl edit 命令直接編輯現有的 ConfigMap。這提供了一種互動式的方式來修改 ConfigMap 的內容。然而,使用此方法時請務必謹慎,因為它不涉及版本控制。

不可變的 ConfigMap

Kubernetes 提供了一個名為不可變 ConfigMap 的功能,以防止意外或故意修改 ConfigMap 資料。透過將 ConfigMap 標記為不可變,您可以確保其內容保持不變。

建立不可變的 ConfigMap

要建立不可變的 ConfigMap,只需在 ConfigMap 定義中將 immutable 欄位設為 true,如下所示:

# immutable-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-immutable-configmap
data:
  key: value
immutable: true

內容解密:

  • immutable 欄位設為 true 可以防止對 ConfigMap 的任何修改。
  • 此功能對於嚴重依賴 ConfigMap 的叢集尤其有益,因為它可以防止因組態錯誤而導致的應用程式中斷。

使用 ConfigMaps 和 Secrets 組態 Pod

在 Kubernetes 中,ConfigMaps 和 Secrets 是兩種重要的資源,用於組態和管理應用程式。ConfigMaps 用於儲存非敏感的組態資料,而 Secrets 則用於儲存敏感資訊,如密碼、令牌或私鑰。

ConfigMaps 的不可變性

一旦將 ConfigMap 標記為不可變,就無法修改其資料。若需要更改,必須刪除現有的 ConfigMap 並建立一個新的。這樣可以確保組態的正確性和一致性。

name: immutable-configmap
data:
  color: "blue"
  version: "1.0"
  environment: "prod"
immutable: true

內容解密:

  • name:指定 ConfigMap 的名稱。
  • data:包含組態資料的鍵值對。
  • immutable:設定為 true 時,表示 ConfigMap 不可變。

使用 Secret 物件管理敏感組態

Secret 物件是一種資源,允許您組態在 Kubernetes 上執行的應用程式。與 ConfigMaps 類別似,Secrets 可以用於儲存敏感資料,如密碼、令牌或私鑰。

最佳實踐:

  1. 限制存取:使用根據角色的存取控制(RBAC)來限制對 Secrets 的存取。
  2. 避免硬編碼:不要將 Secrets 直接嵌入到應用程式碼或組態檔案中。
  3. 定期輪換:實施定期的 Secret 輪換計劃,以降低未經授權存取的風險。
  4. 考慮外部 Secret 管理:對於高階安全需求,探索專用的 Secret 管理解決方案,如 HashiCorp Vault 或 AWS Secrets Manager。
  5. 利用加密:使用 KMS 外掛來加密靜態的 Secrets 資料,提供額外的保護層。
  6. 監控和稽核:定期審查存取日誌和稽核跟蹤,以檢測可疑活動和潛在的安全漏洞。
  7. 教育團隊:透過提供有關處理和管理 Secrets 的最佳實踐培訓,培養安全意識文化。

列出 Secrets

可以使用 kubectl get 命令列出 Secrets。

$ kubectl get secret -A

建立 Secret

命令式建立

可以使用 kubectl create secret 命令建立 Secret。

$ kubectl create secret generic my-first-secret --from-literal='db_password=my-db-password'

宣告式建立

也可以使用 YAML 檔案建立 Secret。

# ~/secret-from-file.yaml
apiVersion: v1
data:
  db_password: bXktZGItcGFzc3dvcmQ=
kind: Secret
metadata:
  name: my-first-secret
type: Opaque

在建立 Secret 時,可以使用 stringData 欄位指定明文字串,Kubernetes 將自動將其編碼為 base64 格式。

KMS 加密

Kubernetes 提供了 KMS 外掛,用於加密 Secrets 和 ConfigMaps 中的資料。這提供了額外的保護層,用於保護敏感資訊。

Kubernetes 中的 Secrets 管理與應用

在 Kubernetes 中,Secrets 用於儲存敏感資訊,如資料函式庫密碼、API 金鑰等。與 ConfigMaps 類別似,Secrets 也是一種用於儲存鍵值對的資源,但 Secrets 的內容會被 base64 編碼,以提供基本的隱私保護。

建立 Secret

建立 Secret 有多種方法,包括使用 YAML 檔案、命令列工具等。

使用 YAML 檔案建立 Secret

首先,建立一個 YAML 檔案來定義 Secret,例如 my-second-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: my-second-secret
type: Opaque
data:
  db_password: bXktZGItcGFzc3dvcmQ=

然後,使用 kubectl apply 命令來建立 Secret:

$ kubectl apply -f ~/my-second-secret.yaml

可以使用 kubectl get 命令來驗證 Secret 是否建立成功:

$ kubectl get secret my-second-secret -o yaml

使用 stringData 建立 Secret

也可以使用 stringData 來建立 Secret,無需手動編碼:

apiVersion: v1
kind: Secret
metadata:
  name: my-secret-stringdata
type: Opaque
stringData:
  db_password: my-db-password

建立 Secret 後,可以使用 kubectl get 命令來驗證其內容:

$ kubectl get secrets my-secret-stringdata -o yaml

從檔案建立 Secret

可以從檔案中讀取內容來建立 Secret,例如:

$ echo -n 'mypassword' > ./password.txt
$ kubectl create secret generic mypassword --from-file=./password.txt

讀取 Secret

由於 Secrets 儲存的是敏感資訊,因此 kubectl 命令不會直接顯示其內容。可以使用 kubectl describe 命令來檢視 Secret 的基本資訊:

$ kubectl describe secret/mypassword

也可以使用 kubectl get 命令以 YAML 格式輸出 Secret 的內容:

$ kubectl get secret my-second-secret -o yaml

需要注意的是,base64 編碼並不是加密,任何有權存取 Kubernetes 叢集的人都可以解碼 Secrets。因此,需要實施 RBAC(Role-Based Access Control)來限制對 Secrets 的存取。

在 Pod 中使用 Secret

可以將 Secret 的內容注入到 Pod 中的環境變數中,例如:

apiVersion: v1
kind: Pod
metadata:
  name: flask-pod-with-secret
labels:
  app: flask-with-secret
spec:
  containers:
  - name: flask-with-secret
    image: quay.io/iamgini/my-flask-app:1.0
    env:
    - name: PASSWORD_ENV_VAR
      valueFrom:
        secretKeyRef:
          name: my-first-secret
          key: db_password

內容解密:

  1. env: 定義了容器中的環境變數。
  2. valueFrom: 指定了環境變數的值來源。
  3. secretKeyRef: 表示該值來自某個 Secret 中的特定鍵。
  4. name: my-first-secret 指定了 Secret 的名稱。
  5. key: db_password 指定了要使用的鍵名稱。

這樣,Pod 中的應用程式就可以透過環境變數 PASSWORD_ENV_VAR 來存取 Secret 中的值。

在 Kubernetes 中使用 ConfigMaps 和 Secrets 組態 Pod

本章節將探討如何在 Kubernetes 中管理組態資料。我們將瞭解 ConfigMaps 和 Secrets 的基本概念、建立方法以及如何在 Pod 中使用它們來注入組態資料。

使用 Secrets 管理敏感資訊

Secrets 是 Kubernetes 中用於儲存和管理敏感資訊(如密碼、API 金鑰和憑證)的資源。與 ConfigMaps 不同,Secrets 會對資料進行編碼以保護機密性。

建立 Secret

可以使用兩種方法建立 Secret:命令式和宣告式。

  • 命令式建立 Secret:

kubectl create secret generic my-first-secret –from-literal=db_password=my-db-password

*   宣告式建立 Secret:

    首先,建立一個 YAML 檔案(例如 `secret-from-file-database.yaml`):
    ```yml
apiVersion: v1
kind: Secret
metadata:
  name: appdb-secret
type: Opaque
stringData:
  db_user: appadmin
  db_password: appdbpassword
然後,使用 `kubectl apply` 命令建立 Secret:
```bash

kubectl apply -f secret-from-file-database.yaml


#### 在 Pod 中使用 Secret

可以透過兩種方式在 Pod 中使用 Secret:環境變數和 Volume Mounts。

*   將 Secret 作為環境變數注入 Pod:

    在 Pod 的 YAML 檔案中,可以使用 `env` 或 `envFrom` 欄位將 Secret 中的鍵值對注入為環境變數。例如:
    ```yml
apiVersion: v1
kind: Pod
metadata:
  name: flask-pod-with-secret-all
spec:
  containers:
  - name: flask-with-secret
    image: quay.io/iamgini/my-flask-app:1.0
    envFrom:
    - secretRef:
        name: appdb-secret
這樣,`appdb-secret` 中的所有鍵值對都會被注入為環境變數。
  • 將 Secret 掛載為 Volume:

    可以將 Secret 掛載為 Pod 中的 Volume。例如:

apiVersion: v1 kind: Pod metadata: name: flask-pod-with-secret-volume spec: containers:

  • name: flask-with-secret image: quay.io/iamgini/my-flask-app:1.0 volumeMounts:
    • name: mysecret-volume mountPath: ‘/etc/password-mounted-path’ readOnly: true volumes:
  • name: mysecret-volume secret: secretName: my-second-secret
    這樣,`my-second-secret` 中的資料就會被掛載到 `/etc/password-mounted-path` 目錄下。

#### 管理 Secret

可以使用 `kubectl delete` 命令刪除 Secret:
```bash
kubectl delete secret my-first-secret

要更新 Secret,可以使用 kubectl apply 命令或 kubectl edit 命令。