Administrator
发布于 2026-08-15 / 2 阅读
0
0

第七章.k8s存储-configmap-1

来源链接:https://www.bilibili.com/video/BV1PbeueyE8V?spm_id_from=333.788.videopod.episodes&vd_source=0e85828f19fba96334ebaebea2da3e2f&p=42

【K8s教程】第七章 K8s存储 - ConfigMap 第一小节 笔记

一、ConfigMap 核心模型与设计背景

传统运维场景中,数百/数千台服务器运行相同业务时,配置需保持一致,但业务迭代导致配置频繁变更,人工逐台修改效率极低。由此衍生出配置中心方案:

  • 每台节点部署Agent,监听配置中心的配置更新事件
  • 配置变更时,Agent自动从配置中心拉取最新配置文件,替换本地原有文件并触发服务重载,使配置生效
  • 运维仅需在配置中心发布新版本,全程无人工介入,实现无痕配置更新
    Kubernetes中的ConfigMap正是该模型的落地实现,用于为Pod提供统一的配置管理能力。

二、ConfigMap 核心特性

  1. 版本兼容性:ConfigMap在Kubernetes 1.2版本中正式引入,当前主流版本均已支持,可放心使用
  2. 存储能力:支持保存单个配置属性、完整配置文件、JSON二进制对象等所有与配置相关的信息
  3. 核心机制:注入机制而非共享机制,是ConfigMap与传统共享配置方案的核心区别:
    • 传统共享方案(如NFS):将配置文件挂载到所有节点,每次读取文件都会产生网络IO,多Pod同时读取时易出现峰值网络IO压力,适合多小文件按需读取的场景
    • ConfigMap注入方案:将配置文件直接注入到Pod内部,仅注入时产生一次网络IO,后续Pod本地读取无额外网络开销;且支持分批注入,可避免集群压力突增,峰值网络IO更低
    • 选型原因:ConfigMap通常仅存储1-3个少量配置文件,且大概率会被使用,注入方案的优势更明显

三、ConfigMap 创建方式

共支持3种创建方式,可根据配置规模按需选择:

1. 基于文件创建

命令格式:kubectl create configmap <资源名称> --from-file=<文件路径>

  • 文件内容格式要求及区别:
    • 格式1:文件内为一行一对的key=value格式:文件名作为ConfigMap的key,文件内容作为value,该格式的key后续可直接注入为Pod的环境变量
    • 格式2:文件为普通非key=value格式(如纯文本内容):文件名作为key,整个文件内容作为value,无法直接转为环境变量,仅能以文件形式挂载到Pod使用
  • 查看方式:
    • 查看YAML格式数据:kubectl get configmap <名称> -o yaml
    • 查看详细信息:kubectl describe configmap <名称>
  • 演示示例:创建xinxianghongfu.txt文件,内容为name=张三、password=123,执行kubectl create configmap game-config --from-file=hongfu.txt即可创建对应ConfigMap

2. 基于键值对直接创建

命令格式:kubectl create configmap <资源名称> --from-literal=<key>=<value>

  • 适用场景:适合少量简短的配置参数,直接在命令中写入key-value,无需额外创建文件
  • 演示示例:kubectl create configmap literal-config --from-literal=name=DAVID --from-literal=password=pass
  • 注意:若配置规模较大(如上万行),不建议使用该方式,过于繁琐,优先选择基于文件创建

3. 直接编写YAML资源清单创建

  • 适用场景:适合习惯编写YAML资源的用户
  • 技巧:若配置较长,可先通过命令生成YAML模板再修改,例如执行kubectl create configmap <名称> --from-file=<文件> --dry-run=client -o yaml > configmap.yaml生成模板后编辑即可,无需手动编写完整YAML

四、ConfigMap 使用方式(环境变量注入)

ConfigMap创建后,可通过环境变量形式注入到Pod中使用,共两种配置方式:

前置条件

提前创建好ConfigMap,例如literal-config,包含两个key:name(值为DAVID)、password(值为pass)

1. 单个Key映射为环境变量

可自定义环境变量名,映射ConfigMap的指定key,配置示例:

env:
- name: YOUR_NAME
  valueFrom:
    configMapKeyRef:
      name: literal-config
      key: name
- name: PASSWORD
  valueFrom:
    configMapKeyRef:
      name: literal-config
      key: password

2. 直接引入整个ConfigMap

直接将ConfigMap的所有key-value批量注入为环境变量,无需逐个配置,配置示例:

envFrom:
- configMapRef:
    name: literal-config
  • 特点:ConfigMap的所有key会直接作为环境变量名注入,无法重命名环境变量,配置更简洁

注意点

若Pod启动命令仅执行打印环境变量的操作(如env命令),执行完成后容器会退出,此时需将重启策略设置为Never,避免无意义重启;且重启策略需与Pod平级,不要放在spec.containers子对象下。

AI 总结

ConfigMap是Kubernetes 1.2引入的核心配置管理资源,采用注入机制替代传统共享配置方案,从根源上降低了多Pod场景下的网络IO压力,解决了分布式场景配置一致性问题。支持文件、键值对、YAML三种灵活创建方式,可通过环境变量、文件挂载等形式为Pod提供配置,是K8s云原生应用配置管理的核心组件,适用于存储少量业务配置、环境参数等非敏感配置信息。


评论