【Kubernetes】ConfigMap配置管理:存储配置参数,创建到容器挂载

发布于:2025-08-03 ⋅ 阅读:(12) ⋅ 点赞:(0)

在Kubernetes中,配置管理是应用部署的重要环节。ConfigMap作为存储非敏感配置数据的资源对象,能帮助我们实现"配置与代码分离",让应用部署更灵活。

一、什么是ConfigMap?

ConfigMap是Kubernetes中用于存储非加密配置数据的资源类型,它可以存储键值对、配置文件等内容,然后被Pod中的容器引用。其核心作用是:

  • 实现配置与应用程序代码分离
  • 方便不同环境(开发、测试、生产)使用不同配置
  • 避免配置硬编码到镜像或Pod定义中

简单说,ConfigMap就像一个"配置文件仓库",Pod可以按需获取其中的配置。

二、创建ConfigMap的4种方式

1. 从目录创建(适用于多配置文件)

如果有多个配置文件需要统一管理,可以直接从目录创建ConfigMap:

# 目录结构
test/
└── config/
    ├── db.properties
    └── redis.properties

# 从config目录创建(注意执行命令时的路径)
chenaws@k8smaster:~/test$ kubectl create configmap test-dir-config --from-file=config/
configmap/test-dir-config created

查看创建的ConfigMap:

chenaws@k8smaster:~/test$ kubectl describe cm test-dir-config
Name:         test-dir-config
Namespace:    default
Data
====
redis.properties:  # 文件名作为key
----
host: 127.0.0.1    # 文件内容作为value
port: 6379

db.properties:
----
username=root
password=admin

2. 从单个文件创建(适用于独立配置文件)

对于单个配置文件(如应用的.yaml配置),可以直接指定文件路径创建:

# 创建application.yaml文件
chenaws@k8smaster:~/test$ cat application.yaml
spring:
  application:
    name: test-app
server:
  port: 8080

# 从文件创建ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm spring-boot-test-yaml --from-file=./application.yaml
configmap/spring-boot-test-yaml created

此时ConfigMap的key默认是文件名(application.yaml),value是文件内容。

3. 重命名配置文件的key

如果希望在ConfigMap中使用自定义的key(而非默认文件名),可以用key=value格式指定:

# 将application.yaml重命名为app.yml存入ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm spring-boot-test-alises-yaml --from-file=app.yml=application.yaml
configmap/spring-boot-test-alises-yaml created

# 查看结果(key已变为app.yml)
chenaws@k8smaster:~/test$ kubectl describe cm spring-boot-test-alises-yaml
Name:         spring-boot-test-alises-yaml
Data
====
app.yml:  # 自定义的key
----
spring:
  application:
    name: test-app
server:
  port: 8080

4. 直接指定键值对创建(适用于简单配置)

对于简单的键值对配置(如用户名、密码),可以用--from-literal直接创建:

# 创建包含用户名和密码的ConfigMap
chenaws@k8smaster:~/test$ kubectl create cm test-k-v-config --from-literal=username=root --from-literal=password=admin
configmap/test-k-v-config created

# 查看结果
chenaws@k8smaster:~/test$ kubectl describe cm test-k-v-config
Name:         test-k-v-config
Data
====
password:  # 键
----
admin      # 值
username:
----
root

三、在Pod中使用ConfigMap的两种方式

创建ConfigMap后,Pod可以通过环境变量文件挂载两种方式使用其中的配置。

方式1:作为环境变量注入

适用于需要通过环境变量读取配置的场景(如应用启动参数)。

步骤1:创建存储环境变量的ConfigMap
chenaws@k8smaster:~/test$ kubectl create configmap test-env-config \
--from-literal=JAVA_OPTS_TEST='-Xms521m -Xms512m' \
--from-literal=APP_NAME=springboot-env-test
configmap/test-env-config created
步骤2:定义引用ConfigMap的Pod

创建env-test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-env-po
spec:
  containers:
    - name: env-test
      image: alpine
      command: ["/bin/sh", "-c", "env;sleep 3600"]  # 输出环境变量后休眠
      env:
      # 引用ConfigMap中的key作为环境变量
      - name: JAVA_VM_OPTS  # 容器内的环境变量名
        valueFrom:
          configMapKeyRef:
            name: test-env-config  # 关联的ConfigMap名称
            key: JAVA_OPTS_TEST    # 引用的key
      - name: APP  # 另一个环境变量
        valueFrom:
          configMapKeyRef:
            name: test-env-config
            key: APP_NAME
  restartPolicy: Never  # Pod退出后不重启
步骤3:创建Pod并验证
# 创建Pod
chenaws@k8smaster:~/test$ kubectl create -f env-test-pod.yaml
pod/test-env-po created

# 查看Pod状态(等待容器创建完成)
chenaws@k8smaster:~/test$ kubectl get po test-env-po
NAME         READY   STATUS    RESTARTS   AGE
test-env-po  1/1     Running   0          30s

# 查看环境变量(确认ConfigMap的配置已注入)
chenaws@k8smaster:~/test$ kubectl logs -f test-env-po
JAVA_VM_OPTS=-Xms521m -Xms512m  # 来自ConfigMap
APP=springboot-env-test          # 来自ConfigMap
...

方式2:作为文件挂载到容器

适用于需要通过配置文件读取的场景(如数据库配置文件、应用配置文件)。

步骤1:使用之前创建的test-dir-config(包含db.properties和redis.properties)
步骤2:定义挂载ConfigMap的Pod

创建file-test-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-configfile-po
spec:
  containers:
    - name: file-test
      image: alpine
      command: ["/bin/sh", "-c", "sleep 3600"]  # 休眠等待查看
      volumeMounts:
      - name: config-volume  # 与下面的volume名称对应
        mountPath: /usr/local/mysql/conf  # 挂载到容器内的路径
        items:  # 可选:指定只挂载部分文件(不指定则挂载全部)
        - key: db.properties  # ConfigMap中的key(文件名)
          path: db.properties  # 挂载到容器内的文件名
  volumes:
  - name: config-volume
    configMap:
      name: test-dir-config  # 关联的ConfigMap名称
  restartPolicy: Never
步骤3:创建Pod并验证
# 创建Pod
chenaws@k8smaster:~/test$ kubectl create -f file-test-pod.yaml
pod/test-configfile-po created

# 进入容器查看挂载的文件
chenaws@k8smaster:~/test$ kubectl exec -it test-configfile-po -- sh
/ # cd /usr/local/mysql/conf/  # 挂载路径
/usr/local/mysql/conf # ls
db.properties  # 已挂载的文件
/usr/local/mysql/conf # cat db.properties 
username=root  # 内容与ConfigMap一致
password=admin

注意

  • 如果不指定items,ConfigMap中的所有文件(db.properties和redis.properties)都会被挂载到目标路径
  • 挂载的文件权限为只读(ro),无法在容器内修改

四、ConfigMap使用总结

1. 创建方式对比

创建方式 命令示例 适用场景
从目录创建 --from-file=目录路径 多配置文件统一管理
从单个文件创建 --from-file=文件路径 单个独立配置文件
重命名key创建 --from-file=自定义key=文件路径 需要修改配置文件在ConfigMap中的key
键值对直接创建 --from-literal=key=value 简单的键值对配置(如参数)

2. 使用方式对比

使用方式 配置方式 优点 缺点
环境变量注入 env.valueFrom.configMapKeyRef 适合应用启动参数,读取方便 配置更新后需重启Pod才能生效
文件挂载 volumeMounts + volumes.configMap 适合配置文件,支持部分文件挂载 配置更新后会自动同步(约1分钟延迟)

3. 注意事项

  • ConfigMap与Pod必须在同一命名空间才能引用
  • 配置更新后:环境变量方式需重启Pod,文件挂载方式会自动同步(有延迟)
  • 不要用ConfigMap存储敏感信息(如密码、密钥),敏感信息应使用Secret