在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