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才能同步更新

posted @   立勋  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示