Skip to content

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:注解(可选)
  • 示例

    yaml
    metadata:
      name: app-config
      namespace: production
      labels:
        app: myapp
        tier: backend
      annotations:
        config.version: "1.2"
  • 说明

    • 名称在命名空间内必须唯一
    • 标签可用于分类和选择 ConfigMap
    • 注解常用于存储非标识性元数据

data

  • 作用:存储配置数据(键值对形式)

  • 格式

    • 简单键值对:key: value
    • 多行文本:使用 |> 符号
    • 完整配置文件:直接嵌入文件内容
  • 示例

    yaml
    data:
      # 简单键值对
      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+)
  • truefalse
  • 示例
    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  # 设置文件权限