ConfigMap详解
在 Kubernetes 中,ConfigMap 是用于存储配置数据的资源对象, 可以用来解耦配置和镜像,方便在不同环境中复用应用程序镜像,而无需修改镜像内容。以下是它的常见用法:
1. 创建 ConfigMap
从文件创建
如果配置以文件形式存在,可以通过命令从文件创建 ConfigMap,例如,有一个app.properties
配置文件,内容为app.name=myapp
,执行以下命令:
bash
kubectl create configmap my-config --from-file=app.properties
这会创建一个名为my-config
的 ConfigMap,其中包含app.properties
文件的内容,文件名为键,文件内容为值。也可以指定多个文件:
bash
kubectl create configmap my-multi-config --from-file=config1.properties --from-file=config2.properties
从目录创建
将一个目录下的所有文件都创建到 ConfigMap 中,比如config-files
目录下有多个配置文件:
bash
kubectl create configmap my-dir-config --from-file=config-files/
每个文件名会作为 ConfigMap 中的键。
直接指定键值对创建
还能直接通过命令行指定键值对来创建 ConfigMap:
bash
kubectl create configmap my-literal-config --from-literal=key1=value1 --from-literal=key2=value2
通过 YAML 文件创建
使用 YAML 文件定义 ConfigMap,可以更好地进行版本控制和管理。示例如下:
yaml
apiVersion: v1
kind: ConfigMap
metadata:name: my-yaml-config
data:key1: value1key2: value2
通过kubectl apply -f my-configmap.yaml
命令创建该 ConfigMap。
2. 在 Pod 中使用 ConfigMap
挂载为文件
在 Pod 的spec
中,通过volumes
和volumeMounts
将 ConfigMap 挂载为容器内的文件。例如:
yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imagevolumeMounts:- name: config-volumemountPath: "/etc/config"volumes:- name: config-volumeconfigMap:name: my-config
上述配置会将名为my-config
的 ConfigMap 挂载到容器内的/etc/config
目录下,ConfigMap 中的每个键值对都会成为该目录下的一个文件,键为文件名,值为文件内容。
作为环境变量使用
可以将 ConfigMap 中的值作为容器的环境变量注入。示例:
yaml
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: my-containerimage: my-imageenv:- name: APP_NAMEvalueFrom:configMapKeyRef:name: my-configkey: app.name
这样,my-config
这个 ConfigMap 中app.name
对应的值会被设置为容器内APP_NAME
环境变量的值。
3. 在其他资源中使用 ConfigMap
比如在Deployment
、StatefulSet
等资源中,使用方式和在Pod
中类似,都是为了给其中的容器提供配置信息, 可以将 ConfigMap 挂载为文件或设置为环境变量。
4. 更新 ConfigMap
当 ConfigMap 中的配置发生变化时,可以通过kubectl edit configmap my-config
修改对应的 ConfigMap。修改后,对于以挂载文件方式使用 ConfigMap 的 Pod,Kubernetes 默认会自动更新文件内容(根据restartPolicy
决定是否重启容器 );对于以环境变量方式使用的,需要重启容器才能获取到新值。
5. 跨命名空间使用 ConfigMap
如果需要在不同命名空间中使用同一个 ConfigMap,可以通过创建一个新的 ConfigMap,并使用dataSource
引用其他命名空间的 ConfigMap,示例如下:
yaml
apiVersion: v1
kind: ConfigMap
metadata:name: new-configmapnamespace: target-namespace
data:# 引用其他命名空间的ConfigMapkey1: |-{{ (lookup "v1" "ConfigMap" "source-namespace" "source-configmap").data.key1 }}
不过,使用lookup
函数需要安装external - secrets
等相关工具或使用特定的插件来实现。