当前位置: 首页 > news >正文

【kubernetes】--ConfigMap

文章目录

  • Kubernetes ConfigMap 详解
    • 1. ConfigMap 基本概念
      • 1.1 核心特性
      • 1.2 与 Secret 的对比
    • 2. ConfigMap 创建方式
      • 2.1 从字面值创建
      • 2.2 从文件创建
      • 2.3 从环境文件创建
      • 2.4 YAML 定义方式
    • 3. ConfigMap 使用方式
      • 3.1 作为环境变量
      • 3.2 作为命令行参数
      • 3.3 作为卷挂载
      • 3.4 子路径挂载(不自动更新)
    • 4. 热更新机制
      • 4.1 自动更新特性
      • 4.2 更新操作
      • 4.3 更新延迟
    • 5. 高级用法
      • 5.1 不可变ConfigMap
      • 5.2 大小限制与最佳实践
      • 5.3 与Init容器配合
    • 6. 监控与调试
      • 6.1 常用命令
      • 6.2 事件监控
    • 7. 最佳实践
    • 8. 实际应用示例
      • 8.1 Nginx配置示例
      • 8.2 多环境配置管理
    • 案例

Kubernetes ConfigMap 详解

ConfigMap 是 Kubernetes 中用于存储非敏感(不加密)配置数据的 API 对象,允许将配置与容器镜像分离,实现配置的灵活管理和动态更新。

1. ConfigMap 基本概念

1.1 核心特性

  • 解耦配置:将应用配置与容器镜像分离
  • 动态更新:支持不重启 Pod 更新配置(部分场景)
  • 多种使用方式:环境变量、命令行参数、配置文件
  • 非敏感数据:不适合存储密码、密钥等敏感信息

1.2 与 Secret 的对比

特性ConfigMapSecret
数据类型普通配置数据敏感数据
存储编码明文(可UTF-8文本)Base64编码
典型用途配置文件、命令行参数密码、令牌、密钥
安全保护无特殊保护额外保护机制
大小限制1MB(etcd限制)1MB

2. ConfigMap 创建方式

2.1 从字面值创建

kubectl create configmap game-config \--from-literal=game.level=4 \--from-literal=game.health=5

2.2 从文件创建

# 从单个文件
kubectl create configmap nginx-config --from-file=nginx.conf# 从目录(所有文件)
kubectl create configmap config-dir --from-file=./configs/# 指定键名
kubectl create configmap special-config --from-file=config=app.properties

2.3 从环境文件创建

kubectl create configmap env-config --from-env-file=env.list

2.4 YAML 定义方式

apiVersion: v1
kind: ConfigMap
metadata:name: game-confignamespace: default
data:# 类属性键game.properties: |enemy.types=aliens,monstersplayer.maximum.level=10# 类文件键ui.properties: |color.good=purplecolor.bad=yellow

3. ConfigMap 使用方式

3.1 作为环境变量

单个环境变量

env:
- name: LOG_LEVELvalueFrom:configMapKeyRef:name: game-configkey: log.level

全部环境变量

envFrom:
- configMapRef:name: game-config

3.2 作为命令行参数

args:- "--loglevel"- "$(LOG_LEVEL)"
env:- name: LOG_LEVELvalueFrom:configMapKeyRef:name: game-configkey: log.level

3.3 作为卷挂载

完整挂载

volumes:
- name: config-volumeconfigMap:name: game-config
volumeMounts:
- name: config-volumemountPath: /etc/config

选择性挂载

volumes:
- name: config-volumeconfigMap:name: game-configitems:- key: game.propertiespath: game/game.properties

3.4 子路径挂载(不自动更新)

volumeMounts:
- name: config-volumemountPath: /etc/game/game.propertiessubPath: game.properties

4. 热更新机制

4.1 自动更新特性

  • 卷挂载的ConfigMap:自动更新(kubelet定期检查,默认1分钟同步周期)
  • 环境变量:不会自动更新,需要重启Pod
  • 子路径挂载:不会自动更新

4.2 更新操作

# 更新ConfigMap
kubectl edit configmap game-config# 触发更新(对卷挂载有效)
kubectl patch configmap game-config -p '{"data":{"game.level":"5"}}'

4.3 更新延迟

  • 更新传播到Pod通常需要1-2分钟(取决于kubelet配置)
  • 可通过观察文件时间戳确认更新:
    kubectl exec <pod-name> -- ls -la /etc/config/
    

5. 高级用法

5.1 不可变ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:name: immutable-config
immutable: true
data:some.key: some.value

优势:

  • 防止意外更改
  • 减少apiserver负载
  • 安全提升(防止热更新攻击)

5.2 大小限制与最佳实践

  • 单ConfigMap限制:1MB(etcd限制)
  • 推荐实践
    • 按功能拆分ConfigMap
    • 同类配置合并
    • 避免超大配置文件

5.3 与Init容器配合

initContainers:
- name: init-configimage: busyboxcommand: ['sh', '-c', 'cp /tmp/config/* /shared-config/']volumeMounts:- name: config-volumemountPath: /tmp/config- name: shared-configmountPath: /shared-config
containers:
- name: appimage: myappvolumeMounts:- name: shared-configmountPath: /etc/app-config

6. 监控与调试

6.1 常用命令

# 查看ConfigMap
kubectl get configmaps
kubectl describe configmap <name># 查看挂载内容
kubectl exec <pod> -- ls /etc/config# 查看环境变量
kubectl exec <pod> -- env | grep CONFIG# 检查更新状态
kubectl get pods -w

6.2 事件监控

kubectl get events --field-selector involvedObject.kind=ConfigMap

7. 最佳实践

  1. 命名规范

    • 使用有意义的名称(如 {app}-{env}-config
    • 包含版本信息(v1, v2)
  2. 组织结构

    configs/
    ├── dev/
    │   ├── app-config.yaml
    │   └── db-config.yaml
    └── prod/├── app-config.yaml└── db-config.yaml
    
  3. 版本控制

    • 将ConfigMap定义纳入版本控制
    • 使用Kustomize或Helm管理不同环境配置
  4. 更新策略

    • 对关键配置使用RollingUpdate
    • 测试环境先验证配置变更
  5. 安全考虑

    • 敏感数据必须使用Secret
    • 限制ConfigMap访问权限(RBAC)

8. 实际应用示例

8.1 Nginx配置示例

# nginx-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-conf
data:nginx.conf: |user  nginx;worker_processes  auto;events {worker_connections  1024;}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;server {listen       80;server_name  localhost;location / {root   /usr/share/nginx/html;index  index.html index.htm;}}}# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:alpineports:- containerPort: 80volumeMounts:- name: nginx-configmountPath: /etc/nginx/nginx.confsubPath: nginx.confvolumes:- name: nginx-configconfigMap:name: nginx-conf

8.2 多环境配置管理

# 目录结构
config/
├── base/
│   ├── configmap.yaml
│   └── kustomization.yaml
├── dev/
│   ├── configmap-patch.yaml
│   └── kustomization.yaml
└── prod/├── configmap-patch.yaml└── kustomization.yaml# 使用Kustomize部署
kubectl apply -k config/dev/

案例

cm.yaml

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: busyboximage: busyboxcommand: [ "/bin/sh","-c","cat /etc/config/redis.properties" ]volumeMounts:- name: config-volumemountPath: /etc/configvolumes:- name: config-volumeconfigMap:name: redis-configrestartPolicy: Never``
myconfig.yaml
```yaml
apiVersion: v1
kind: ConfigMap
metadata:name: myconfignamespace: default
data:special.level: infospecial.type: hello

config-var.yaml

apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: busyboximage: busyboxcommand: [ "/bin/sh", "-c", "echo $(LEVEL) $(TYPE)" ]env:- name: LEVELvalueFrom:configMapKeyRef:name: myconfigkey: special.level- name: TYPEvalueFrom:configMapKeyRef:name: myconfigkey: special.typerestartPolicy: Never
http://www.lryc.cn/news/589433.html

相关文章:

  • 极致cms多语言建站|设置主站默认语言与设置后台固定语言为中文
  • frp内网穿透(二)
  • 牛客:HJ20 密码验证合格程序[华为机考][字符串]
  • 一般芯片电气特性中Flash参数达到其最大值的条件是什么?
  • 【人工智能99问】激活函数有哪些,如何选择使用哪个激活函数?(5/99)
  • 全新 Python 项目托管到 Gitee 私有仓库完整流程(带详细命令注释)
  • 【PTA数据结构 | C语言版】构造二叉树
  • 软件质量概述
  • 使用 pdb 来 debug 调试 python 程序
  • I3C通信驱动开发注意事项
  • Linux715 磁盘管理:逻辑卷
  • golang二级缓存示例
  • 随机奖励能提升Qwen数学表现?本质是数据污染
  • NuGet01-安装及使用
  • Linux下编译海思WS63 SDK全攻略
  • 关于Linux下Cursor的使用
  • 如何设计实现开发自助重启工具-01-设计篇
  • 代码随想录八股文训练营总结
  • lesson14:Python的推导式
  • 2025-07-15 李沐深度学习6——Softmax回归
  • 项目:简单学生成绩管理系统设计
  • Nginx配置反向代理
  • 深入解析:磁盘级文件与内存级(被打开)文件的本质区别与联系
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • k8s环境使用Operator部署Seaweedfs集群(上)
  • 同济医院R语言训练营第三期开讲!上交大张维拓老师主讲
  • ubuntu22.04谷歌浏览器中文输入法bug
  • ASP .NET Core 8结合JWT轻松实现身份验证和授权
  • ESLint 配置错误:ReferenceError: prettier is not defined 解决方案
  • Vue 常用的 ESLint 规则集