【K8s教程】第七章 K8s存储 - ConfigMap 第一小节 笔记
一、ConfigMap 核心模型与设计背景
传统运维场景中,数百/数千台服务器运行相同业务时,配置需保持一致,但业务迭代导致配置频繁变更,人工逐台修改效率极低。由此衍生出配置中心方案:
- 每台节点部署Agent,监听配置中心的配置更新事件
- 配置变更时,Agent自动从配置中心拉取最新配置文件,替换本地原有文件并触发服务重载,使配置生效
- 运维仅需在配置中心发布新版本,全程无人工介入,实现无痕配置更新
Kubernetes中的ConfigMap正是该模型的落地实现,用于为Pod提供统一的配置管理能力。
二、ConfigMap 核心特性
- 版本兼容性:ConfigMap在Kubernetes 1.2版本中正式引入,当前主流版本均已支持,可放心使用
- 存储能力:支持保存单个配置属性、完整配置文件、JSON二进制对象等所有与配置相关的信息
- 核心机制:注入机制而非共享机制,是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使用
- 格式1:文件内为一行一对的
- 查看方式:
- 查看YAML格式数据:
kubectl get configmap <名称> -o yaml - 查看详细信息:
kubectl describe configmap <名称>
- 查看YAML格式数据:
- 演示示例:创建
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云原生应用配置管理的核心组件,适用于存储少量业务配置、环境参数等非敏感配置信息。