在Kubernetes中,配置管理是應用部署的重要環節。ConfigMap作為存儲非敏感配置數據的資源對象,能幫助我們實現"配置與代碼分離",讓應用部署更靈活。
一、什么是ConfigMap?
ConfigMap是Kubernetes中用于存儲非加密配置數據的資源類型,它可以存儲鍵值對、配置文件等內容,然后被Pod中的容器引用。其核心作用是:
- 實現配置與應用程序代碼分離
- 方便不同環境(開發、測試、生產)使用不同配置
- 避免配置硬編碼到鏡像或Pod定義中
簡單說,ConfigMap就像一個"配置文件倉庫",Pod可以按需獲取其中的配置。
二、創建ConfigMap的4種方式
1. 從目錄創建(適用于多配置文件)
如果有多個配置文件需要統一管理,可以直接從目錄創建ConfigMap:
# 目錄結構
test/
└── config/├── db.properties└── redis.properties# 從config目錄創建(注意執行命令時的路徑)
chenaws@k8smaster:~/test$ kubectl create configmap test-dir-config --from-file=config/
configmap/test-dir-config created
查看創建的ConfigMap:
chenaws@k8smaster:~/test$ kubectl describe cm test-dir-config
Name: test-dir-config
Namespace: default
Data
====
redis.properties: # 文件名作為key
----
host: 127.0.0.1 # 文件內容作為value
port: 6379db.properties:
----
username=root
password=admin
2. 從單個文件創建(適用于獨立配置文件)
對于單個配置文件(如應用的.yaml配置),可以直接指定文件路徑創建:
# 創建application.yaml文件
chenaws@k8smaster:~/test$ cat application.yaml
spring:application:name: test-app
server:port: 8080# 從文件創建ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm spring-boot-test-yaml --from-file=./application.yaml
configmap/spring-boot-test-yaml created
此時ConfigMap的key默認是文件名(application.yaml),value是文件內容。
3. 重命名配置文件的key
如果希望在ConfigMap中使用自定義的key(而非默認文件名),可以用key=value
格式指定:
# 將application.yaml重命名為app.yml存入ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm spring-boot-test-alises-yaml --from-file=app.yml=application.yaml
configmap/spring-boot-test-alises-yaml created# 查看結果(key已變為app.yml)
chenaws@k8smaster:~/test$ kubectl describe cm spring-boot-test-alises-yaml
Name: spring-boot-test-alises-yaml
Data
====
app.yml: # 自定義的key
----
spring:application:name: test-app
server:port: 8080
4. 直接指定鍵值對創建(適用于簡單配置)
對于簡單的鍵值對配置(如用戶名、密碼),可以用--from-literal
直接創建:
# 創建包含用戶名和密碼的ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm test-k-v-config --from-literal=username=root --from-literal=password=admin
configmap/test-k-v-config created# 查看結果
chenaws@k8smaster:~/test$ kubectl describe cm test-k-v-config
Name: test-k-v-config
Data
====
password: # 鍵
----
admin # 值
username:
----
root
三、在Pod中使用ConfigMap的兩種方式
創建ConfigMap后,Pod可以通過環境變量或文件掛載兩種方式使用其中的配置。
方式1:作為環境變量注入
適用于需要通過環境變量讀取配置的場景(如應用啟動參數)。
步驟1:創建存儲環境變量的ConfigMap
chenaws@k8smaster:~/test$ kubectl create configmap test-env-config \
--from-literal=JAVA_OPTS_TEST='-Xms521m -Xms512m' \
--from-literal=APP_NAME=springboot-env-test
configmap/test-env-config created
步驟2:定義引用ConfigMap的Pod
創建env-test-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:name: test-env-po
spec:containers:- name: env-testimage: alpinecommand: ["/bin/sh", "-c", "env;sleep 3600"] # 輸出環境變量后休眠env:# 引用ConfigMap中的key作為環境變量- name: JAVA_VM_OPTS # 容器內的環境變量名valueFrom:configMapKeyRef:name: test-env-config # 關聯的ConfigMap名稱key: JAVA_OPTS_TEST # 引用的key- name: APP # 另一個環境變量valueFrom:configMapKeyRef:name: test-env-configkey: APP_NAMErestartPolicy: Never # Pod退出后不重啟
步驟3:創建Pod并驗證
# 創建Pod
chenaws@k8smaster:~/test$ kubectl create -f env-test-pod.yaml
pod/test-env-po created# 查看Pod狀態(等待容器創建完成)
chenaws@k8smaster:~/test$ kubectl get po test-env-po
NAME READY STATUS RESTARTS AGE
test-env-po 1/1 Running 0 30s# 查看環境變量(確認ConfigMap的配置已注入)
chenaws@k8smaster:~/test$ kubectl logs -f test-env-po
JAVA_VM_OPTS=-Xms521m -Xms512m # 來自ConfigMap
APP=springboot-env-test # 來自ConfigMap
...
方式2:作為文件掛載到容器
適用于需要通過配置文件讀取的場景(如數據庫配置文件、應用配置文件)。
步驟1:使用之前創建的test-dir-config(包含db.properties和redis.properties)
步驟2:定義掛載ConfigMap的Pod
創建file-test-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:name: test-configfile-po
spec:containers:- name: file-testimage: alpinecommand: ["/bin/sh", "-c", "sleep 3600"] # 休眠等待查看volumeMounts:- name: config-volume # 與下面的volume名稱對應mountPath: /usr/local/mysql/conf # 掛載到容器內的路徑items: # 可選:指定只掛載部分文件(不指定則掛載全部)- key: db.properties # ConfigMap中的key(文件名)path: db.properties # 掛載到容器內的文件名volumes:- name: config-volumeconfigMap:name: test-dir-config # 關聯的ConfigMap名稱restartPolicy: Never
步驟3:創建Pod并驗證
# 創建Pod
chenaws@k8smaster:~/test$ kubectl create -f file-test-pod.yaml
pod/test-configfile-po created# 進入容器查看掛載的文件
chenaws@k8smaster:~/test$ kubectl exec -it test-configfile-po -- sh
/ # cd /usr/local/mysql/conf/ # 掛載路徑
/usr/local/mysql/conf # ls
db.properties # 已掛載的文件
/usr/local/mysql/conf # cat db.properties
username=root # 內容與ConfigMap一致
password=admin
注意:
- 如果不指定
items
,ConfigMap中的所有文件(db.properties和redis.properties)都會被掛載到目標路徑 - 掛載的文件權限為只讀(ro),無法在容器內修改
四、ConfigMap使用總結
1. 創建方式對比
創建方式 | 命令示例 | 適用場景 |
---|---|---|
從目錄創建 | --from-file=目錄路徑 | 多配置文件統一管理 |
從單個文件創建 | --from-file=文件路徑 | 單個獨立配置文件 |
重命名key創建 | --from-file=自定義key=文件路徑 | 需要修改配置文件在ConfigMap中的key |
鍵值對直接創建 | --from-literal=key=value | 簡單的鍵值對配置(如參數) |
2. 使用方式對比
使用方式 | 配置方式 | 優點 | 缺點 |
---|---|---|---|
環境變量注入 | env.valueFrom.configMapKeyRef | 適合應用啟動參數,讀取方便 | 配置更新后需重啟Pod才能生效 |
文件掛載 | volumeMounts + volumes.configMap | 適合配置文件,支持部分文件掛載 | 配置更新后會自動同步(約1分鐘延遲) |
3. 注意事項
- ConfigMap與Pod必須在同一命名空間才能引用
- 配置更新后:環境變量方式需重啟Pod,文件掛載方式會自動同步(有延遲)
- 不要用ConfigMap存儲敏感信息(如密碼、密鑰),敏感信息應使用Secret