12. K8S之configMap
1. 概述
ConfigMap
允许你将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。 本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap
以及配置 Pod 使用存储在 ConfigMap
中的数据。
创建 ConfigMap
你可以使用 kubectl create configmap
或者在 kustomization.yaml
中的 ConfigMap 生成器 来创建 ConfigMap。注意,kubectl
从 1.14 版本开始支持 kustomization.yaml
。
使用 kubectl create configmap 创建 ConfigMap
你可以使用 kubectl create configmap
命令基于 目录
、文件
或者字面值
来创建 ConfigMap:
1 | kubectl create configmap <map-name> <data-source> |
1. 基于目录创建
参数: --from-file
1 | 创建本地目录 |
注1:普通文件之外的所有目录项都会被 忽略(例如,子目录、符号链接、设备、管道等等)。
注2:文件夹下的文件名将会作为配置的key。当然,可以自己自定义key的名字:
1
2kubectl create configmap game-config-3 --from-file=<my-key-name>=<path-to-file>
<my-key-name> 是你要在 ConfigMap 中使用的键名,<path-to-file> 是你想要键表示数据源文件的位置。
2. 基于文件创建
参数: --from-file
1 | kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties |
可以多次使用 --from-file
参数,从多个数据源创建 ConfigMap。
环境变量从文件创建配置:
--from-env-file
- 先下载下来:
1 | wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties |
- 查看一下文件内容:
1 | cat configure-pod-container/configmap/game-env-file.properties |
- 创建
1 | kubectl create configmap game-config-env-file \ |
注意: 当多次使用 --from-env-file
来从多个数据源创建 ConfigMap 时,仅仅最后一个 env 文件有效。
基于生成器创建 ConfigMap
自 1.14 开始,kubectl
开始支持 kustomization.yaml
。 你还可以基于生成器创建 ConfigMap,然后将其应用于 API 服务器上创建对象。 生成器应在目录内的 kustomization.yaml
中指定。
基于文件生成 ConfigMap
例如,要从 configure-pod-container/configmap/kubectl/game.properties
文件生成一个 ConfigMap:
1 | 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件 |
使用 kustomization 目录创建 ConfigMap 对象:
1 | kubectl apply -k . |
从字面值生成 ConfigMap
参数: --from-literal
要基于字符串 special.type=charm
和 special.how=very
生成 ConfigMap, 可以在 kusotmization.yaml
中配置 ConfigMap 生成器:
1 | 创建带有 ConfigMapGenerator 的 kustomization.yaml 文件 |
应用 Kustomization 目录创建 ConfigMap 对象。
1 | kubectl apply -k . |
使用configMap
在 Pod 命令中使用 ConfigMap 定义的环境变量
你可以使用 $(VAR_NAME)
Kubernetes 替换语法在容器的 command
和 args
部分中使用 ConfigMap 定义的环境变量。
例如,以下 Pod 规范
pods/pod-configmap-env-var-valueFrom.yaml
1 | apiVersion: v1 |
使用存储在 ConfigMap 中的数据填充数据卷
在 Pod 规约的 volumes
部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到指定为 volumeMounts.mountPath
的目录(在本例中为 /etc/config
)。 command
部分引用存储在 ConfigMap 中的 special.level
。
pods/pod-configmap-volume.yaml
1 | apiVersion: v1 |
注意: 如果在 /etc/config/
目录中有一些文件,它们将被删除。
挂载的 ConfigMap 将自动更新
更新已经在数据卷中使用的 ConfigMap 时,已映射的键最终也会被更新。 kubelet
在每次定期同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能与 kubelet 同步周期 + ConfigMap 在 kubelet 中缓存的 TTL 一样长。
说明: 使用 ConfigMap 作为 subPath 的数据卷将不会收到 ConfigMap 更新
subpath
在一般情况下 configmap 挂载文件时,会先覆盖掉挂载目录,然后再将 congfigmap 中的内容作为文件挂载进行。如果想不对原来的文件夹下的文件造成覆盖,只是将 configmap 中的每个 key,按照文件的方式挂载到目录下,可以使用 subpath 参数。
使用 ConfigMap 作为subpath 的数据卷将不会收到 ConfigMap 更新