ConfigMap是Kubernetes的核心配置管理資源,用于存儲非敏感配置數據(如應用參數、環境變量、配置文件內容),實現配置與容器鏡像解耦。其核心價值在于:
在CentOS主機上,可通過命令行或YAML文件創建ConfigMap,以下是常見方法:
--from-literal)適用于簡單鍵值對(如數據庫端口、應用模式):
kubectl create configmap my-config --from-literal=db_port=3306 --from-literal=app_mode=production
--from-file)適用于單個配置文件(如Nginx配置、應用YAML):
echo "server { listen 80; }" > nginx.conf
kubectl create configmap nginx-config --from-file=nginx.conf
--from-file)適用于批量管理多個配置文件(如Spring Boot的application.yml、logback.xml):
mkdir -p /opt/app/config
echo "spring.application.name=myapp" > /opt/app/config/application.yml
echo "logging.level.root=INFO" >> /opt/app/config/application.yml
kubectl create configmap app-config --from-file=/opt/app/config
--from-env-file)適用于.env格式的環境變量文件:
echo "DB_HOST=mysql-service DB_PORT=3306" > .env
kubectl create configmap env-config --from-env-file=.env
適用于復雜配置(如需要注釋、多鍵值對),步驟如下:
my-config.yaml)apiVersion: v1
kind: ConfigMap
metadata:
name: my-config # ConfigMap名稱
namespace: default # 所屬命名空間(默認default)
data:
db_host: mysql-service # 鍵值對1(應用連接數據庫的主機名)
db_port: "3306" # 鍵值對2(端口需為字符串)
log_level: INFO # 鍵值對3(日志級別)
kubectl apply -f my-config.yaml
創建后,可通過以下命令檢查:
# 查看ConfigMap列表
kubectl get configmaps
# 查看ConfigMap詳情(包含所有鍵值對)
kubectl describe configmap my-config
# 查看ConfigMap的YAML格式內容
kubectl get configmap my-config -o yaml
ConfigMap創建后,需通過Pod的spec字段將其配置注入容器,主要有三種方式:
通過envFrom或env字段,將ConfigMap的鍵值對轉換為容器的環境變量:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
envFrom: # 直接引用整個ConfigMap的所有鍵值對
- configMapRef:
name: my-config # ConfigMap名稱
# 或通過env字段引用單個鍵(需指定key)
# env:
# - name: DB_PORT # 容器內環境變量名
# valueFrom:
# configMapKeyRef:
# name: my-config
# key: db_port
容器內可通過echo $DB_HOST或printenv查看環境變量。
通過volumes字段,將ConfigMap的內容掛載到容器的指定路徑(每個鍵對應一個文件,值為文件內容):
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
volumeMounts:
- name: config-volume # 卷名稱(與volumes中的name一致)
mountPath: /etc/app/config # 容器內掛載路徑
readOnly: true # 只讀掛載
volumes:
- name: config-volume
configMap:
name: my-config # ConfigMap名稱
# 可選:僅掛載部分鍵(避免掛載不必要的配置)
# items:
# - key: db_host
# path: db_host.conf # 容器內文件名(自定義)
容器內可通過cat /etc/app/config/db_host查看文件內容。
通過args字段,將ConfigMap的值作為命令行參數傳遞給應用:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: busybox
command: ["sh", "-c", "echo 'Database Host: $(DB_HOST), Port: $(DB_PORT)'"]
envFrom:
- configMapRef:
name: my-config
容器啟動后,會輸出Database Host: mysql-service, Port: 3306。
kubectl apply -f my-config.yaml # 修改YAML中的data字段后重新apply
kubectl edit)kubectl edit configmap my-config # 直接編輯ConfigMap內容
修改后,集群會自動更新ConfigMap的etcd存儲。
kubectl rollout status檢查);kubectl delete pod my-pod)使新配置生效;kubectl delete configmap my-config # 刪除指定ConfigMap
刪除前需確保無Pod依賴該ConfigMap(否則Pod會報錯)。
my.config.key,不能以數字開頭);DB_HOST與db_host視為不同鍵);Secret資源;通過以上步驟,可在CentOS環境下高效使用Kubernetes ConfigMap實現應用配置管理,提升部署靈活性和環境適應性。