K8s实践练习5_配置管理

官网链接

很多应用在其初始化或运行期间要依赖一些配置信息。但是我们不太想要配置参数被硬编码进容器而是希望这些配置参数是可调节的。 ConfigMap 是 Kubernetes 的一种机制,可让你将配置数据注入到应用的Pod内部。

ConfigMap支持将配置清单与镜像内容分离,以保持容器化的应用程序的可移植性。 例如,可以下载并运行相同的容器镜像来启动容器, 用于本地开发、系统测试或运行实时终端用户工作负载。

本页提供了一系列使用示例,这些示例演示了如何创建 ConfigMap 以及配置 Pod 使用存储在 ConfigMap 中的数据。

前置准备

搭建好一套k8s集群,可以参考我写的这篇教程:搭建k8s集群

k8s官方的镜像站在国内是拉不下来的,有几种方法解决:

  1. 在拉取镜像的虚拟机/服务器上科学上网
  2. 配置k8s的镜像源,目前国内只有阿里云支持改版后的k8s镜像源(registry.k8s.io)。
  3. 需要拉取镜像的时候,指定拉取策略为本地拉取(imagePullPolicy:Never),每次需要拉取镜像前都手动拉取/上传一份镜像到服务器上再导入镜像

这里给出阿里云镜像源的配置教程: 旧版的k8s直接修改/etc/containerd/config.toml里的mirror信息,添加上阿里云的镜像站就行。但是新版的不支持inline或者说暂时兼容,未来不支持。所以这里就只给出新版k8s镜像源配置教程。

修改/etc/containerd/config.yaml,填入下列信息(如果你已经有了config.yaml且这个配置文件是从containerd默认配置里生成的,那直接备份,然后使用下面的内容)。sudo vim /etc/containerd/config.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version = 2

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
    runtime_type = "io.containerd.runc.v2"
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
      SystemdCgroup = true
  [plugins."io.containerd.grpc.v1.cri".registry]
    config_path = "/etc/containerd/certs.d"

创建/etc/containerd/certs.d目录,在这个目录填入docker.io和registry.k8s.io的镜像源。

注意:k8s里修改镜像源之后,使用kubectl describe pod <pod_name> 查看时还是显示的docker.ioregistry.k8s.io。配置镜像源只物理修改从哪里修改,不改镜像拉取的逻辑源。所以改好镜像源之后也不太好验证成功,随便拉个镜像sudo crictl pull nginx:1.14.2,能拉下来就是成了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Docker Hub 加速
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml << 'EOF'
server = "https://registry-1.docker.io"

[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOF

# K8s 镜像加速
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml << 'EOF'
server = "https://registry.k8s.io"

[host."https://registry.cn-hangzhou.aliyuncs.com/google_containers"]
  capabilities = ["pull", "resolve"]
  override_path = true
EOF

到这里,镜像源就配置好了,如果不出意外,文件目录应该是下面这样:

1
2
3
4
5
6
7
rust@k8s1:/etc/containerd$ ll
总计 28
drwxr-xr-x   3 root root  4096  2月  4 10:31 ./
drwxr-xr-x 144 root root 12288  2月  2 17:01 ../
drwxr-xr-x   4 root root  4096  2月  2 16:44 certs.d/
-rw-r--r--   1 root root   423  2月  2 19:02 config.toml
-rw-r--r--   1 root root   886 12月 19 02:48 config.toml.dpkg-dist

修改完配置文件后需要重启containerd:

1
2
sudo systemctl restart containerd
sudo systemctl status containerd

创建ConfigMap

k8s支持使用kubectl create configmap或者在kustomization.yaml中的 ConfigMap 生成器来创建 ConfigMap。

使用 kubectl create configmap 创建 ConfigMap

可以使用 kubectl create configmap 命令基于目录、 文件或者字面值来创建 ConfigMap: kubectl create configmap <configmap_name> <数据源>

其中,<configmap_name> 是为 ConfigMap 指定的名称,<数据源> 是要从中提取数据的目录、 文件或者字面值。ConfigMap 对象的名称必须是合法的 DNS 子域名。

在基于文件来创建ConfigMap时,<数据源> 中的键名默认取自文件的基本名, 而对应的值则默认为文件的内容。

可以使用kubectl describe configmaps <config_map_name>或者kubectl get configmaps获取有关 ConfigMap 的信息。

  1. 基于目录创建ConfigMap

可以使用 kubectl create configmap 基于同一目录中的多个文件创建 ConfigMap。 当基于目录来创建 ConfigMap 时,kubectl 识别目录下文件名可以作为合法键名的文件, 并将这些文件打包到新的 ConfigMap 中。普通文件之外的所有目录项都会被忽略 (例如:子目录、符号链接、设备、管道等等)。

说明: 用于创建 ConfigMap 的每个文件名必须由可接受的字符组成,即:字母(A 到 Z 和 a 到 z)、数字(0 到 9)、’-’、’_’ 或 ‘.’。 如果在一个目录中使用 kubectl create configmap,而其中任一文件名包含不可接受的字符, 则 kubectl 命令可能会失败。

kubectl 命令在遇到不合法的文件名时不会打印错误。

创建本地目录:

1
mkdir -p configure-pod-container/configmap/

现在,下载示例的配置并创建 ConfigMap:

1
2
3
4
5
6
# 将示例文件下载到 `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/

以上命令将 configure-pod-container/configmap 目录下的所有文件,也就是 game.properties 和 ui.properties 打包到 game-config ConfigMap 中。

显示 ConfigMap 的详细信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
kubectl describe configmaps game-config

Name:         game-config
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
ui.properties:
----
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice


BinaryData
====

Events:  <none>

configure-pod-container/configmap/ 目录中的 game.properties 和 ui.properties 文件出现在 ConfigMap 的 data 部分。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
kubectl get configmaps game-config -o yaml

rust@k8s1:~$ kubectl get configmaps game-config -o yaml
apiVersion: v1
data:
  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: "2026-02-10T06:51:06Z"
  name: game-config
  namespace: default
  resourceVersion: "169466"
  uid: b379ed2c-575b-492e-8485-68ac4c385062
  1. 基于单个或多个文件创建ConfigMap, –from-file指定单个文件即可基于单个文件创建ConfigMap
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties

rust@k8s1:~$ kubectl get configmaps game-config-2 -o yaml
apiVersion: v1
data:
  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
kind: ConfigMap
metadata:
  creationTimestamp: "2026-02-10T07:00:06Z"
  name: game-config-2
  namespace: default
  resourceVersion: "170295"
  uid: a5a08086-7e39-4763-b3aa-1285d96c28e9

多个–from-file,每个指定单个文件即可实现基于多个文件创建ConfigMap

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties

rust@k8s1:~$ kubectl delete configmap game-config-2
configmap "game-config-2" deleted
rust@k8s1:~$ kubectl create configmap game-config-2 --from-file=configure-pod-container/configmap/game.properties --from-file=configure-pod-container/configmap/ui.properties
configmap/game-config-2 created
rust@k8s1:~$ kubectl get configmaps game-config-2 -o yaml
apiVersion: v1
data:
  game.properties: |-
    enemies=aliens
    lives=3
    enemies.cheat=true
    enemies.cheat.level=noGoodRotten
    secret.code.passphrase=UUDDLRLRBABAS
    secret.code.allowed=true
    secret.code.lives=30
  ui.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
    how.nice.to.look=fairlyNice
kind: ConfigMap
metadata:
  creationTimestamp: "2026-02-10T07:02:57Z"
  name: game-config-2
  namespace: default
  resourceVersion: "170560"
  uid: c0db714a-11ee-4125-8dee-1f64b2986f6a
  1. 使用 –from-env-file 选项基于 env 文件创建 ConfigMap
1
2
3
4
wget https://kubernetes.io/examples/configmap/game-env-file.properties -O configure-pod-container/configmap/game-env-file.properties

kubectl create configmap game-config-env-file \
       --from-env-file=configure-pod-container/configmap/game-env-file.properties

Env 文件包含环境变量列表。其中适用以下语法规则:

  • Env 文件中的每一行必须为 VAR=VAL 格式。
  • 以#开头的行(即注释)将被忽略。
  • 空行将被忽略。
  • 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。
1
2
3
4
5
enemies=aliens
lives=3
allowed="true"

# 此注释和上方的空行将被忽略

使用env创建ConfigMap与基于普通文件创建语法类似,同样支持基于单个文件或多个文件创建ConfigMap。 不同的是创建出的ConfigMap的data里的配置参数格式不同。不再是文件名:配置参数信息的格式,而是直接提取文件内的参数信息,变成了参数名称:值

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2019-12-27T18:36:28Z
  name: game-config-env-file
  namespace: default
  resourceVersion: "809965"
  uid: d9d1ca5b-eb34-11e7-887b-42010a8002b8
data:
  allowed: '"true"'
  enemies: aliens
  lives: "3"

在使用 –from-file 参数时,可以定义在 ConfigMap 的 data 部分出现键名, 而不是按默认行为使用文件名:

1
2
3
kubectl create configmap game-config-3 --from-file=<我的键名>=<文件路径>

kubectl create configmap game-config-3 --from-file=game-special-key=configure-pod-container/configmap/game.properties
  1. 基于字面值创建configmap, 用–from-literal传入单个或多个字面值也可以创建configmap
1
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

得到了类似从env文件创建的config。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: 2022-02-18T19:14:38Z
  name: special-config
  namespace: default
  resourceVersion: "651"
  uid: dadce046-d673-11e5-8cd0-68f728db1985
data:
  special.how: very
  special.type: charm

基于生成器创建configmap

可以基于生成器(Generators)创建 ConfigMap,然后将其应用于集群的 API 服务器上创建对象。 生成器应在目录内的kustomization.yaml中指定。

基于kustomization.yaml生成器文件创建configmap

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
rust@k8s1:~$ cat <<EOF >./kustomization.yaml./kustomization.yaml
configMapGenerator:
- name: game-config-4
  options:
    labels:
      game-config: config-4
  files:
  - configure-pod-container/configmap/game.properties
EOF
rust@k8s1:~$ kubectl apply -k .
configmap/game-config-4-tbg7c4gc77 created
rust@k8s1:~$ kubectl get configmap
NAME                       DATA   AGE
game-config                2      38m
game-config-2              2      26m
game-config-4-tbg7c4gc77   1      8s
kube-root-ca.crt           1      8d
rust@k8s1:~$ kubectl describe configmap game-config-4-tbg7c4gc77
Name:         game-config-4-tbg7c4gc77
Namespace:    default
Labels:       game-config=config-4
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30

BinaryData
====

Events:  <none>

在生成器文件的file字段,可以像kubectl create configmap那样指定字段值而不是用默认的文件名

1
2
3
4
5
  files:
  - configure-pod-container/configmap/game.properties

  files:
  - game-special-key=configure-pod-container/configmap/game.properties

生成器也能用字面值创建configmap,只需要在生成器文件里用literals,就像这样:

1
2
3
4
5
configMapGenerator:
- name: special-config-2
  literals:
  - special.how=very
  - special.type=charm

使用配置文件创建configmap

第三种创建configmap的方式就是创建configmap类型的yaml文件,yaml文件类似上面两种方式创建的configmap输出的yaml格式的文件。

1
2
3
4
5
6
7
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

再用kubectl apply -f <configmap_yaml>应用配置文件即可创建configmap。

使用ConfigMap

使用configmap的数据定义容器环境变量

创建configmap。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO
1
2
vim configmaps.yaml
kubectl apply -f configmaps.yaml

在pod规约(spec)中通过env.valueFrom使用configmap:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # 定义容器的环境变量
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # ConfigMap 包含你要赋给 SPECIAL_LEVEL_KEY 的值
              name: special-config
              # 指定与取值相关的键名
              key: special.how
        # 多个环境变量对应多个值
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: env-config
              key: log_level
  restartPolicy: Never

pod启动后在pod详情里可以看到环境变量,使用了configmap。

1
2
3
Environment:
      SPECIAL_LEVEL_KEY:  <set to the key 'special.how' of config map 'special-config'>  Optional: false
      LOG_LEVEL:          <set to the key 'log_level' of config map 'env-config'>        Optional: false

将ConfigMap中的所有键值对配置为容器环境变量

创建configmap,yaml文件如下:

1
2
3
4
5
6
7
8
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
1
2
vim configmap-multikeys.yaml
kubectl create -f configmap-multikeys.yaml

使用 envFrom 将所有 ConfigMap 的数据定义为容器环境变量,ConfigMap 中的键成为 Pod 中的环境变量名称。

1
2
vim  pod-configmap-envFrom.yaml 
kubectl apply -f pod-configmap-envFrom.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

查看pod详情,发现容器的环境变量全部来自于configmap

1
2
3
4
5
kubectl describe pod dapi-test-pod

Environment Variables from:
      special-config  ConfigMap  Optional: false
    Environment:      <none>

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

可以使用 $(VAR_NAME)Kubernetes替换语法在容器的command和args属性中使用 ConfigMap 定义的环境变量。

例如下面的pod配置文件里,在容器的command里就用$(SPECIAL_LEVEL_KEY) 使用了环境变量。也即是,通过环境变量使用configmap,再在命令里使用替换语法使用环境变量。

 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: busybox:1.27.2
      command: [ "/bin/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 数据添加到一个卷中

k8s支持用kubectl create configmap来从文件中创建configmap,也支持把configmap作为文件挂载到容器内部,就好像容器里有configmap的文件一样。

1
2
3
4
5
6
7
8
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm

创建configmap:

1
2
vim configmap-multikeys.yaml
kubectl apply -f configmap-multikeys.yaml

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

command 部分列出了名称与 ConfigMap 中的键匹配的目录文件,查看pod日志(command执行情况),将会看到configmap作为文件挂到到容器内,并被ll命令展示。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # 提供包含要添加到容器中的文件的 ConfigMap 的名称
        name: special-config
  restartPolicy: Never
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
vim  pod-configmap-volume.yaml
kubectl apply -f pod-configmap-volume.yaml


rust@k8s1:~$ vim  pod-configmap-volume.yaml
rust@k8s1:~$ kubectl apply -f pod-configmap-volume.yaml
pod/dapi-test-pod created
rust@k8s1:~$ kubectl logs dapi-test-pod
SPECIAL_LEVEL
SPECIAL_TYPE

如果将容器的命令改为查看configmap文件(cat /etc/config/SPECIAL_LEVEL),日志中将输出对应文件的内容,也即是configmap中对应key的值。

将 ConfigMap 数据添加到卷中的特定路径

上面的默认挂在configmap的key同名文件里。可以通过path修改数据挂载到卷中的路径。 例如下面这个pod就把SPECIAL_LEVEL数据挂载到了keys文件(/etc/config/keys)里。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: [ "/bin/sh","-c","cat /etc/config/keys" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          path: keys
  restartPolicy: Never
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubectl delete pod dapi-test-pod
vim pod-configmap-volume-specific-key.yaml
kubectl apply -f pod-configmap-volume-specific-key.yaml


rust@k8s1kubectl delete pod dapi-test-pod
pod "dapi-test-pod" deleted
rust@k8s1:~$ vim pod-configmap-volume-specific-key.yaml
rust@k8s1:~$ kubectl apply -f pod-configmap-volume-specific-key.yaml
pod/dapi-test-pod created
rust@k8s1:~$ kubectl logs dapi-test-pod
veryrust@k8s1:~$ 

ConfigMap原理介绍

说明:ConfigMap 应该引用属性文件,而不是替换它们。可以将 ConfigMap 理解为类似于 Linux /etc 目录及其内容的东西。例如,如果你基于 ConfigMap 创建 Kubernetes 卷,则 ConfigMap 中的每个数据项都由该数据卷中的某个独立的文件表示

可以在 Pod 规约中将对ConfigMap的引用(env.valueFrom.configMapKeyRef)标记为可选(optional)。 如果 ConfigMap 不存在,则挂载的卷将为空。 如果 ConfigMap 存在,但引用的键不存在,则挂载点下的路径将不存在。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: ["/bin/sh", "-c", "env"]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: a-config
              key: akey
              optional: true # 将环境变量标记为可选
  restartPolicy: Never

也可以在 Pod 规约中将ConfigMap提供的卷和文件(volumes.configMap)标记为可选。 此时 Kubernetes 将总是为卷创建挂载路径,即使引用的 ConfigMap 或键不存在。 例如,以下 Pod 规约将所引用的ConfigMap 的卷标记为可选:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: busybox:1.27.2
      command: ["/bin/sh", "-c", "ls /etc/config"]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: no-config
        optional: true # 将引用的 ConfigMap 的卷标记为可选
  restartPolicy: Never

当已挂载的 ConfigMap 被更新时,所投射的内容最终也会被更新。 这适用于 Pod 启动后可选引用的 ConfigMap 重新出现的情况。

Kubelet 在每次定期同步时都会检查所挂载的 ConfigMap 是否是最新的。 然而,它使用其基于 TTL 机制的本地缓存来获取 ConfigMap 的当前值。 因此,从ConfigMap更新到新键映射到Pod的总延迟可能与 kubelet 同步周期(默认为 1 分钟)+ kubelet 中 ConfigMap 缓存的 TTL(默认为 1 分钟)一样长。 你可以通过更新 Pod 的一个注解来触发立即刷新。

说明:使用 ConfigMap 作为 subPath 卷的容器将不会收到 ConfigMap 更新。

configMap使用具有如下限制:

  • 在 Pod 规约中引用某个 ConfigMap 之前,必须先创建这个对象, 或者在 Pod 规约中将 ConfigMap 标记为 optional。 如果所引用的 ConfigMap 不存在,并且没有将应用标记为 optional 则 Pod 将无法启动。 同样,引用ConfigMap中不存在的主键也会令 Pod 无法启动,除非你将 Configmap 标记为 optional。
  • 如果使用envFrom 来基于ConfigMap 定义环境变量,那么无效的键将被忽略。 Pod可以被启动,但无效名称将被记录在事件日志中(InvalidVariableNames)。 日志消息列出了每个被跳过的键。例如:
1
2
3
4
kubectl get events
#输出与此类似:
LASTSEEN FIRSTSEEN COUNT NAME          KIND  SUBOBJECT  TYPE      REASON                            SOURCE                MESSAGE
0s       0s        1     dapi-test-pod Pod              Warning   InvalidEnvironmentVariableNames   {kubelet, 127.0.0.1}  Keys [1badkey, 2alsobad] from the EnvFrom configMap default/myconfig were skipped since they are considered invalid environment variable names.
  • ConfigMap位于确定的名字空间中。每个ConfigMap只能被同一名字空间中的 Pod 引用。
  • Kubernetes不支持将ConfigMap用于静态 Pod(由特定节点上的kubelet守护进程直接管理的Pod)
网站总访客数:Loading
网站总访问量:Loading
使用 Hugo 构建
主题 StackJimmy 设计