目錄
- 深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
- 一、目錄結構
- 二、ConfigMap 和 Secret 的創建
- 1. 創建 ConfigMap
- `config/app-config.yaml`:
- `config/db-config.yaml`:
- 2. 創建 Secret
- `secrets/db-credentials.yaml`:
- 三、在 Deployment 中使用 ConfigMap 和 Secret
- `deployments/app-deployment.yaml`:
- 四、只掛載 ConfigMap 或 Secret 中的某個變量
- 1. 只掛載 ConfigMap 中的某個變量
- 示例:只將 `APP_ENV` 環境變量從 ConfigMap 中注入到容器:
- 2. 只掛載 Secret 中的某個變量
- 示例:只將 `DB_USER` 和 `DB_PASSWORD` 從 Secret 中注入到容器:
- 五、部署和管理
- 六、安全性和最佳實踐
- 七、總結
深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
在企業級 Kubernetes 環境中,如何高效、安全地管理應用配置是運維和開發的核心任務之一。Kubernetes 提供了 ConfigMap 和 Secret 兩種資源對象,分別用于存儲非敏感和敏感的配置信息。本文將通過一套完整的 YAML 文件示例,展示如何在 Kubernetes 中使用 ConfigMap 和 Secret 管理應用配置,包括創建、部署、更新和安全控制等方面,并且我們會演示如何只掛載 ConfigMap 或 Secret 中的某個變量。
一、目錄結構
以下是示例項目的目錄結構:
├── config/
│ ├── app-config.yaml # 存儲應用配置的 ConfigMap
│ └── db-config.yaml # 存儲數據庫配置的 ConfigMap
├── secrets/
│ └── db-credentials.yaml # 存儲數據庫憑證的 Secret
├── deployments/
│ └── app-deployment.yaml # 應用的 Deployment 配置
└── README.md
二、ConfigMap 和 Secret 的創建
1. 創建 ConfigMap
ConfigMap 用于存儲非敏感的配置信息,例如環境變量、應用配置等。
config/app-config.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:name: app-confignamespace: default
data:# 應用環境設置APP_ENV: productionLOG_LEVEL: infoFEATURE_FLAG: "true" # 特性標志,用于控制功能開關
config/db-config.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:name: db-confignamespace: default
data:# 數據庫連接配置DB_HOST: db.example.comDB_PORT: "5432"DB_NAME: myapp
2. 創建 Secret
Secret 用于存儲敏感信息,例如數據庫憑證、API 密鑰等。數據以 base64 編碼存儲。
secrets/db-credentials.yaml
:
apiVersion: v1
kind: Secret
metadata:name: db-credentialsnamespace: default
type: Opaque
data:# 數據庫用戶名和密碼,值經過 base64 編碼DB_USER: YWRtaW4= # base64 編碼的 'admin'DB_PASSWORD: cGFzc3dvcmQ= # base64 編碼的 'password'
注意:Secret 中的值使用 base64 編碼存儲,實際使用時需要解碼。
三、在 Deployment 中使用 ConfigMap 和 Secret
在 Deployment 中掛載 ConfigMap 和 Secret,可以通過環境變量或卷的方式將配置數據注入到容器中。
deployments/app-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080envFrom:# 使用 ConfigMap 注入環境變量- configMapRef:name: app-config- configMapRef:name: db-config# 使用 Secret 注入環境變量- secretRef:name: db-credentialsvolumeMounts:# 將 ConfigMap 掛載為文件- name: config-volumemountPath: /etc/config# 將 Secret 掛載為文件- name: secret-volumemountPath: /etc/secretvolumes:# ConfigMap 掛載配置文件- name: config-volumeconfigMap:name: app-config# Secret 掛載敏感信息文件- name: secret-volumesecret:secretName: db-credentials
四、只掛載 ConfigMap 或 Secret 中的某個變量
如果只需要掛載 ConfigMap 或 Secret 中的某個變量,可以使用 env
或 envFrom
來指定具體的鍵,而不是將整個 ConfigMap 或 Secret 注入容器。
1. 只掛載 ConfigMap 中的某個變量
示例:只將 APP_ENV
環境變量從 ConfigMap 中注入到容器:
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080env:# 從 ConfigMap 中注入單一環境變量- name: APP_ENVvalueFrom:configMapKeyRef:name: app-configkey: APP_ENV # 僅注入 APP_ENV 變量
2. 只掛載 Secret 中的某個變量
示例:只將 DB_USER
和 DB_PASSWORD
從 Secret 中注入到容器:
apiVersion: apps/v1
kind: Deployment
metadata:name: app-deploymentnamespace: default
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: app-containerimage: myapp:v1ports:- containerPort: 8080env:# 從 Secret 中注入數據庫用戶名和密碼- name: DB_USERvalueFrom:secretKeyRef:name: db-credentialskey: DB_USER # 僅注入 DB_USER- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-credentialskey: DB_PASSWORD # 僅注入 DB_PASSWORD
五、部署和管理
-
應用資源:
使用kubectl
部署 ConfigMap、Secret 和 Deployment:kubectl apply -f config/ kubectl apply -f secrets/ kubectl apply -f deployments/
-
查看資源狀態:
檢查部署狀態:kubectl get deployments kubectl get pods kubectl get configmaps kubectl get secrets
-
更新 ConfigMap 和 Secret:
-
編輯
config/app-config.yaml
或secrets/db-credentials.yaml
。 -
使用
kubectl apply -f
更新資源。 -
對于以環境變量形式注入的配置,更新后需要重啟 Pod:
kubectl rollout restart deployment app-deployment
-
六、安全性和最佳實踐
- 加密存儲:啟用 Kubernetes 的靜態加密功能,確保 Secret 在 etcd 中以加密形式存儲。
- 訪問控制:使用 RBAC 控制對 ConfigMap 和 Secret 的訪問權限,確保只有授權的用戶和服務可以訪問。
- 版本管理:為 ConfigMap 和 Secret 添加版本信息,便于追蹤和回滾。
- 外部 Secret 管理:對于敏感信息,建議使用外部 Secret 管理工具(如 HashiCorp Vault)進行管理,并通過 Kubernetes 的 External Secrets Operator 實現同步。
七、總結
通過上述示例,我們展示了如何在 Kubernetes 中使用 YAML 文件創建和管理 ConfigMap 和 Secret,實現應用配置的集中管理和動態更新。在實際操作中,建議將非敏感的配置存儲在 ConfigMap 中,將敏感信息存儲在 Secret 中,并通過環境變量或卷的方式將其注入到 Pod 中。這樣可以有效地解耦應用和配置,提高系統的靈活性和安全性。