Kubernetes-ConfigMap
ConfigMap 基础概念
ConfigMap 是 Kubernetes 中用于存储非机密配置数据的 API 对象,它通过键值对形式存储配置信息,实现了应用配置与容器镜像的解耦。ConfigMap 的主要设计目的是将环境配置信息从容器镜像中分离出来,便于配置的独立管理和灵活修改。
核心特性:
- 键值存储:支持纯文本键值对、完整配置文件或二进制数据(base64编码)
- 命名空间隔离:属于命名空间级别资源,仅对同命名空间内资源可见
- 大小限制:单个 ConfigMap 数据总量不超过 1MiB(ETCD 的限制)
- 多格式支持:可存储环境变量、命令行参数或完整配置文件(JSON、XML、YAML等)
- 非加密存储:不适用于敏感信息,敏感数据应使用 Secret 对象
ConfigMap 字段解析
apiVersion
- 作用:指定 ConfigMap 的 API 版本
- 值:固定为
v1 - 示例:yaml
apiVersion: v1 - 说明:所有 Kubernetes 核心资源对象都使用 v1 版本
kind
- 作用:指定资源类型
- 值:固定为
ConfigMap - 示例:yaml
kind: ConfigMap - 说明:标识这是一个 ConfigMap 资源对象
metadata
作用:包含 ConfigMap 的元数据信息
子字段:
name:ConfigMap 名称(必填)namespace:所属命名空间(可选,默认为 default)labels:标签(可选)annotations:注解(可选)
示例:
yamlmetadata: name: app-config namespace: production labels: app: myapp tier: backend annotations: config.version: "1.2"说明:
- 名称在命名空间内必须唯一
- 标签可用于分类和选择 ConfigMap
- 注解常用于存储非标识性元数据
data
作用:存储配置数据(键值对形式)
格式:
- 简单键值对:
key: value - 多行文本:使用
|或>符号 - 完整配置文件:直接嵌入文件内容
- 简单键值对:
示例:
yamldata: # 简单键值对 LOG_LEVEL: "debug" MAX_CONNECTIONS: "100" # 多行配置文件 nginx.conf: | server { listen 80; server_name example.com; } # 多行文本 init.sql: > CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL );说明:
- 所有值必须为字符串类型
- 使用
|保留换行符,>折叠换行符 - 单个 ConfigMap 数据总量不超过 1MiB
binaryData
- 作用:存储二进制数据(Kubernetes v1.10+)
- 格式:键值对,值需 base64 编码
- 示例:yaml
binaryData: game.bin: | R0lGODlhAQABAIABAP8AAP///yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw== - 说明:
- 用于存储图片、证书等二进制数据
- 自动进行 base64 编解码
- 与 data 字段的键名不能重复
immutable
- 作用:设置 ConfigMap 为不可变(Kubernetes v1.19+)
- 值:
true或false - 示例:yaml
immutable: true - 说明:
- 设置为 true 后无法修改 ConfigMap
- 提高安全性,减少 API 服务器负载
- 适合生产环境关键配置
ConfigMap 的创建方式
命令行创建
bash
# 从目录创建(目录下所有文件转为键值对)
kubectl create configmap game-config --from-file=path/to/config-dir/
# 从单个文件创建(可指定多个文件)
kubectl create configmap specific-config \
--from-file=game.properties \
--from-file=ui.properties
# 从字面值创建
kubectl create configmap literal-config \
--from-literal=special.how=very \
--from-literal=special.type=charm
# 从环境变量文件创建
kubectl create configmap env-config \
--from-env-file=configmap-demo/game.properties说明:--from-file 参数可重复使用,键名默认为文件名,值则为文件内容
YAML 文件声明式创建
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
namespace: default
data:
# 单行键值对
appversion: "v1.1.1"
# 多行配置文件内容
dbconfig: |
dbuser=admin
dbpass="123456"
binaryData:
# 二进制数据需base64编码
secret.bin: <base64 encoded data>注意:data 和 binaryData 中的键名不能重复,键名只能包含字母数字字符、-、_ 或 .
ConfigMap 在 Pod 中的使用方式
作为环境变量注入
yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-env-demo
spec:
containers:
- name: demo-container
image: busybox
command: ["/bin/sh", "-c", "echo $(DB_HOST) $(DB_PORT)"]
env:
- name: DB_HOST # 单个环境变量注入
valueFrom:
configMapKeyRef:
name: app-config
key: appversion
- name: DB_PORT
valueFrom:
configMapKeyRef:
name: app-config
key: db.port
envFrom: # 批量注入所有键值对
- configMapRef:
name: game-config特点:环境变量方式注入的配置需要重启 Pod 才能更新
作为命令行参数
yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-command-demo
spec:
containers:
- name: demo-container
image: busybox
command: [ "/bin/sh", "-c", "echo $(LOG_LEVEL)" ]
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log.level实现原理:通过环境变量间接传递到容器命令参数
作为卷挂载(最常用方式)
yaml
apiVersion: v1
kind: Pod
metadata:
name: configmap-volume-demo
spec:
containers:
- name: demo-container
image: nginx
volumeMounts:
- name: config-volume
mountPath: /etc/app-config
volumes:
- name: config-volume
configMap:
name: app-config
items: # 可选:筛选特定键并自定义文件名
- key: "dbconfig
path: "/app/dbconfig"
mode: 0644 # 设置文件权限