ConfigMap
ConfigMap
configMap描述
* ConfigMap供容器使用的典型用法如下:
* (1)生成为容器内的环境变量。
* (2)设置容器启动命令的启动参数(需设置为环境变量)。
* (3)以Volume的形式挂载为容器内部的文件或目录。
* ConfigMap以一个或多个key:value的形式保存在Kubernetes系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可以用于表示一个完整配置文件的内容(例如server.xml=<?xml...>...)。
* 可以通过YAML配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。
创建configmap
使用命令行创建
* 使用--from-literal参数从文本进行创建
语法:
kubectl create configmap configmap_name --from-literal=key1=value1 --from-literal=key2=value2
示例:
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
* 使用--from-file参数从目录进行创建
说明:
·命令会在当前路径下寻找config.conf文件,也可以使用绝对路径
·键名为文件名,键值为文件内容
语法:
kubectl create configmap configmap_name --from-file=config_dir
示例:
kubectl create configmap test-config --from-file=my_config_dir
* 使用--from-file参数从文件进行创建
说明:
·可以指定key的名称(不指定以文件名为key),也可以在一个命令行中创建包含多个key的ConfigMap
语法:
kubectl create configmap NAME --from-file=[key=]source
示例:
kubectl create configmap test-config --from-file=config.conf
使用yaml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-configmap
data:
host: localhost # key为host,value为localhost
port: "80"
在pod中使用configmap
* 容器使用ConfigMap的两种方法:
* (1)通过环境变量获取ConfigMap中的内容。
* (2)通过Volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录。
通过环境变量方式使用configmap
* 环境变量的名称受POSIX命名规范([a-zA-Z_][azA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来提示环境变量无法生成,但并不阻止Pod的启动。
示例
1、创建一个configmap的资源清单,指定一个变量
vim env-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-demo
namespace: default
data:
log_level: INFO
kubectl apply -f env-config.yaml
2、在containers中使用env字段
vim env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-pod
namespace: default
spec:
containers:
- name: env-container
image: busybox
command: ["/bin/sh", "-c", "env"] # 容器打印出环境变量
env: # 自定义环境变量 这两个变量不是以资源清单的形式创建的
- name: LOG_LEVEL # 环境变量名
valueFrom: # 变量的来源
configMapKeyRef: # 参考configmap中key值
name: configmap-demo # configmap的名字
key: log_level # configmap的键
kubectl apply -f env-pod.yaml
kubectl logs env-pod
3、在containers中使用envFrom字段
spec:
containers:
- image: some-image
envFrom: #根据configmap-demo中的key=value自动生成环境变量
- configMapRef:
name: configmap-demo
扩展-给ConfigMap中的键加前缀
spec:
containers:
- image: some-image
envFrom: #使用envFrom而不是env
- prefix: CONFIG_ #给ConfigMap中的键加前缀,可以不加,按原键名处理
configMapRef:
name: my-config-map
通过vlumemount以容器卷的形式挂载configMap
configMap卷会将configmap中的每个条目暴露为一个文件,运行在容器中的进程可通过读取文件内容获得对应的条目值
* 示例
1、环境准备
·创建cm_dir目录,目录中创建 my_nginx.conf 和 my_fastcgi.conf 两个文件,文件中书写配置内容
·从目录创建configmap
·kubectl create configmap test-config --from-file=cm_dir
2、将test-config挂载到/nginx/conf.d目录
vim config-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: config-map-volume
spec:
containers:
- name: web-server
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d # 挂载configMap卷到此目录,不能指定成文件
subPath: myconfig.conf # 如果不指定该项,/etc/nginx/conf.d目录下原有的文件就被覆盖了
volumes: # 创建数据卷
- name: config-volume
configMap:
name: test-config
items: # 如果不指定items,configmap中的每个key都会都会生产一个文件并挂载到容器中
- key: my_nginx.conf # my_nginx.conf文件
path: nginx.conf # 其value将被写入nginx.conf文件中,并挂载到/etc/nginx/conf.d/nginx.conf
- key: my_fastcgi.conf
path: fastcgi.conf
defaultMode: "6600" # 给CM卷中的文件设置权限,默认644
指定items字段可以使特定的key挂载到容器中,key的值被存储在path指定的文件中,这个名字是容器使用的名字相当于改名,注意要和CM目录中的名字区分
configmap的使用限制
* ConfigMap必须在Pod之前创建。
* ConfigMap受Namespace限制,只有处于相同Namespace中的Pod才可以引用它。
* ConfigMap中的配额管理还未能实现。
* kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通过--manifest-url或--config自动创建的静态Pod将无法引用ConfigMap。
* 在Pod对ConfigMap进行挂载(volumeMount)操作时,在容器内部只能挂载到“目录”,无法挂载为“文件”
configMap热更新
vim config-host.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: config-log
namespace: default
data:
log_level: INFO
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 1
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: config-log
修改configMap,进入容器内部,在/etc/host下有log_level文件,内容为INFO
kubectl edit configmap config-log # 进入交互界面,修改INFO为DEBUG
kubectl exec -it my-nginx-7b46df564f-qphcs cat /etc/config/log_level # 查看修改后的结果
更新ConfigMap不会触发相关Pod的滚动更新,可以通过修改pod annotations的方式强制触发滚动更新
kubectl patch deployment test-deploy --patch '{"spec": {"template": {"metadata": {"annotations": {"update": "2" }}}}}'
kubectl patch deployment test-deploy --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20191027" }}}}}'
更新configmap后,使用该cm挂载的env不会同步更新,使用该cm挂载的volume中的数据需要10s才能同步更新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南