12. K8S之configMap

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
2
3
4
5
6
7
8
9
# 创建本地目录
mkdir -p configure-pod-container/configmap/

# 将实例文件下载到 `configure-pod-container/configmap/` 目录
wget https://kubernetes.io/examples/configmap/game.properties -O configure-pod-container/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties -O configure-pod-container/configmap/ui.properties

# 创建 configmap
kubectl create configmap game-config --from-file=configure-pod-container/configmap/
  • 注1:普通文件之外的所有目录项都会被 忽略(例如,子目录、符号链接、设备、管道等等)。

  • 注2:文件夹下的文件名将会作为配置的key。当然,可以自己自定义key的名字:

    1
    2
    kubectl 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. 先下载下来:
1
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties
  1. 查看一下文件内容:
1
2
3
4
cat configure-pod-container/configmap/game-env-file.properties
enemies=aliens
lives=3
allowed="true"
  1. 创建
1
2
kubectl create configmap game-config-env-file \
--from-env-file=configure-pod-container/configmap/game-env-file.properties

注意: 当多次使用 --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
2
3
4
5
6
7
# 创建包含 ConfigMapGenerator 的 kustomization.yaml 文件
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: game-config-4
files:
- configure-pod-container/configmap/kubectl/game.properties
EOF

使用 kustomization 目录创建 ConfigMap 对象:

1
2
kubectl apply -k .
configmap/game-config-4-m9dm2f92bt created

从字面值生成 ConfigMap

参数: --from-literal

要基于字符串 special.type=charmspecial.how=very 生成 ConfigMap, 可以在 kusotmization.yaml 中配置 ConfigMap 生成器:

1
2
3
4
5
6
7
8
# 创建带有 ConfigMapGenerator 的 kustomization.yaml 文件
cat <<EOF >./kustomization.yaml
configMapGenerator:
- name: special-config-2
literals:
- special.how=very
- special.type=charm
EOF

应用 Kustomization 目录创建 ConfigMap 对象。

1
2
kubectl apply -k .
configmap/special-config-2-c92b5mmcf2 created

使用configMap

在 Pod 命令中使用 ConfigMap 定义的环境变量

你可以使用 $(VAR_NAME) Kubernetes 替换语法在容器的 commandargs 部分中使用 ConfigMap 定义的环境变量。

例如,以下 Pod 规范

pods/pod-configmap-env-var-valueFrom.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY) $(SPECIAL_TYPE_KEY)" ]
env:
- name: SPECIAL_LEVEL_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_LEVEL
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: SPECIAL_TYPE
restartPolicy: Never

使用存储在 ConfigMap 中的数据填充数据卷

在 Pod 规约的 volumes 部分下添加 ConfigMap 名称。 这会将 ConfigMap 数据添加到指定为 volumeMounts.mountPath 的目录(在本例中为 /etc/config)。 command 部分引用存储在 ConfigMap 中的 special.level

pods/pod-configmap-volume.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "ls /etc/config/" ]
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
# Provide the name of the ConfigMap containing the files you want
# to add to the container
name: special-config
restartPolicy: Never

注意: 如果在 /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 更新

文章作者: 海龟先生
文章链接: http://haiguixiansheng.org.cn/2020/05/23/12. K8S之configMap/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 海龟先生
打赏
  • 微信
  • 支付宝

评论