k8s官网对于ConfigMap的定义k8s官网关于ConfigMap的教程


1. 背景

在实际使用k8s运行项目的过程中,经常需要使用一定的配置文件。例如可能需要将变量注入到容器的环境变量中,但是在项目运行的过程中,环境变量的值可能发生修改,如果使用直接修改yaml的方式或者是使用patch的方式并不优雅,也不安全。

例如在创建ingress-nginx的时候,在yaml中定义了多个ConfigMap。可以使用ConfigMap将nginx的配置文件抽取出来。我们只需要修改定义的ConfigMap对应的值就可以修改nginx的配置文件了,当然这需要挂载的ConfigMap支持热更新。


2. 概念

ConfigMap是标准的k8s资源对象,用于将非机密的数据保存到键值对中,使用时可以使用作为环境变量、命令行参数或者存储卷中的配置文件。ConfigMap最常见的用法是为同一命名空间里某 Pod 中运行的容器执行配置。

ConfigMap可以使用kubectl create configmap <map-name> <data-source>(cm是ConfigMap的简写),也可以使用资源清单编写yaml文件定义cm的方式进行创建。ConfigMap基于名称空间进行隔离的

作用:ConfigMap 可以将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性,且便于应用配置的修改

注意:当需要存储机密数据时可以使用Secret对象。


3. 创建ConfigMap

3.1 使用命令行的方式

使用 kubectl create configmap 命令基于目录、文件或者字面值来创建 ConfigMap:
命令格式:

[root@k8s-master01 from-dir]# kubectl create configmap < cm-name > [--from-file=[key=]source] [--from-literal=key1=value1] [--from-env-file]

其中< cm-name > 是要设置的 ConfigMap 名称,后面的参数是要从中提取数据的目录、 文件或者字面值。
你可以使用kubectl describe cm < map-name >或者 kubectl get cm < map-name > -o yaml获取有关 ConfigMap 的信息。


3.1.1 从目录创建ConfigMap

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

命令:

[root@k8s-master01 from-dir]# mkdir -p cm/from-dir/
cd cm/from-dir/
wget https://kubernetes.io/examples/configmap/game.properties
wget https://kubernetes.io/examples/configmap/ui.properties
kubectl create cm game-config --from-file=./
configmap/game-demo created

查看一下,使用yaml的方式

[root@k8s-master01 from-dir]# kubectl get cm game-demo -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
......

目录中的 game.propertiesui.properties 文件出现在 ConfigMap 的 data 部分。其中key是文件名。value是文件内容。yaml文件中的"|"表示换行。

使用describe命令的方式查看game-demo。

[root@k8s-master01 from-dir]# kubectl describe cm game-demo
Name:         game-demo
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
......
ui.properties:
----
color.good=purple
......

3.1.2 从文件创建ConfigMap

使用 kubectl create configmap 基于单个文件或多个文件创建 ConfigMap。

[root@k8s-master01 from-dir]# kubectl create cm game-config2 --from-file=./game.properties  --from-file=./ui.properties
[root@k8s-master01 from-dir]# configmap/game-config2 created

使用describe的方式查看

[root@k8s-master01 from-dir]# kubectl describe cm game-config2
Name:         game-config2
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
game.properties:
----
enemies=aliens
...
ui.properties:
----
color.good=purple
...

可以看到文件名为key,文件的内容为value。
从这里可以看出基于文件夹的方式是基于文件的简便方式,可以批量将文件夹下的文件添加到data中。


3.1.3 使用–from-env-file的方式创建ConfigMap

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

  • Env 文件中的每一行必须为 VAR=VAL 格式。
  • 以#开头的行(即注释)将被忽略。
  • 空行将被忽略。
  • 引号不会被特殊处理(即它们将成为 ConfigMap 值的一部分)。
    这里是一个简便处理。直接将配置文件中的key=value中的数据加载到data的key和value中。

创建命令:

[root@k8s-master01 from-dir]# kubectl create cm game-config3 --from-env-file=./game.properties

使用get的方式查看

[root@k8s-master01 from-dir]# kubectl get cm game-config3 -o yaml
apiVersion: v1
data:
  enemies: aliens
  enemies.cheat: "true"
  enemies.cheat.level: noGoodRotten
  lives: "3"
  secret.code.allowed: "true"
  secret.code.lives: "30"
  secret.code.passphrase: UUDDLRLRBABAS
kind: ConfigMap
metadata:
......

从这里可以看到game.properties中的key=value的数据都被加载到了data中。其中key就是properties文件的key,value就是properties文件的value。这里可以看出--from-env-file的方式是对--from-literal的简写方式。直接将多个key=value的数据批量加载到data中。

注意: 当多次使用 --from-env-file 来从多个数据源创建 ConfigMap 时,仅仅最后一个 env 文件有效。


3.1.4 定义从文件创建 ConfigMap 时要使用的键

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

[root@k8s-master01 from-dir]# kubectl create configmap game-config4 --from-file=<my-key-name>=<path-to-file>

<my-key-name> 是你要在 ConfigMap 中使用的键名,<path-to-file> 是你想要键表示数据源文件的位置。
例如

[root@k8s-master01 from-dir]# kubectl create cm game-config4 --from-file=game-special-key=./game.properties

查看数据:

[root@k8s-master01 from-dir]# kubectl get cm game-config4 -o yaml
apiVersion: v1
data:
  game-special-key: |-
    enemies=aliens
	......
kind: ConfigMap
......

这里可以看到data中的key是我们自定义的key,而不是默认的文件名。


3.1.5 根据字面值创建 ConfigMap

可以使用kubectl create cm--from-literal参数一起使用,从命令行定义文字值
例如:

[root@k8s-master01 from-dir]# kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

查看数据:

[root@k8s-master01 from-dir]# kubectl get cm special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2020-09-15T03:21:02Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:special.how: {}
        f:special.type: {}
    manager: kubectl
    operation: Update
    time: "2020-09-15T03:21:02Z"
  name: special-config
  namespace: default
  resourceVersion: "18249"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: adff5518-a8b2-402e-ada7-5a9c1f27cf9a

可以看到命令行中的数据变成了data中的数据。


3.2 使用yaml文件的方式创建ConfigMap

在yaml文件中将数据key、value的形式定义在data中。
例如:文件名称为game-demo.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"
  #
  # 类文件键
  # 类似于 --from-file
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true
  # 使用 --from-literal 定义的简单属性。或者是--from-env-file
  example.property.1: hello
  example.property.2: world

创建ConfigMap

[root@k8s-master01 from-dir]# kubectl apply -f game-demo.yaml

4. 使用ConfigMap

在Pod的spec中引用 ConfigMap ,使用ConfigMap中的数据为该 Pod 中的容器进行配置。这个 Pod 和 ConfigMap 必须要在同一个 命名空间中。

可以有如下方式来使用ConfigMap配置Pod中的容器:

  • 容器 entrypoint 的命令行参数(command参数)
  • 容器的环境变量
  • 在只读卷里面添加一个文件,让应用来读取
  • 编写代码在 Pod 中运行,使用 Kubernetes API 来读取 ConfigMap。这些不同的方法适用于不同的数据使用方式。对前三个方法,kubelet 使用 ConfigMap 中的数据在 Pod 中启动容器。第4点并不常见,这里也就不再演示。
  • ConfigMap 位于特定的名字空间 中。每个 ConfigMap 只能被同一名字空间中的 Pod 引用。
  • 在 Pod 规范中引用之前,必须先创建一个 ConfigMap(除非将 ConfigMap 标记为"可选")。 如果引用的 ConfigMap 不存在,则 Pod 将不会启动。同样,引用 ConfigMap 中不存在的键也会阻止 Pod 启动。
  • 如果你使用 envFrom 基于 ConfigMap 定义环境变量,那么无效的键将被忽略。 可以启动 Pod,但无效名称将记录在事件日志中(InvalidVariableNames)。

4.1 使用一个或者是多个ConfigMap的数据定义容器的环境变量

ConfigMap的资源清单:configmaps.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  special.how: very
  name: 张三
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: env-config
  namespace: default
data:
  log_level: INFO

创建ConfigMap:kubectl create -f configmaps.yaml

在Pod的spec中定义环境变量,资源清单的名称:pod-multiple-configmap-env-variable.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-multiple-configmap-env-variable
spec:
  containers:
    - name: pod-multiple-configmap-env-variable
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              name: special-config
              key: special.how
        - name: LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: env-config
              key: log_level
  restartPolicy: Never

运行命令:kubectl create -f pod-multiple-configmap-env-variable.yaml

查看pod中的容器输出的日志数据:kubectl logs pod/pod-multiple-configmap-env-variable

KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=test-pod
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
name=张三
special.how=very
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

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

说明: Kubernetes v1.6 和更高版本支持此功能。

使用envFrom将所有ConfigMap中的数据定义为容器的环境变量,ConfigMap中的键成为Pod中的容器的环境变量的名称。
pod的资源清单:pod-configmap-envFrom.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh", "-c", "env" ]
      # 使用上次创建的ConfigMap
      envFrom:
      - configMapRef:
          name: special-config
  restartPolicy: Never

创建Pod:kubectl create -f pod-configmap-envFrom.yaml
查看打印的环境变量 kubectl logs pod/test-pod

KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.96.0.1:443
HOSTNAME=test-pod
SHLVL=1
HOME=/root
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
name=张三
special.how=very
KUBERNETES_SERVICE_HOST=10.96.0.1
PWD=/

可以看到name=张三;special.how=very都已经添加到容器的环境变量中。


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

Pod的资源清单:pod-configmap-env-var-valueFrom.yaml
删除之前创建的ConfigMap:kubectl delete cm --all

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod2
spec:
  containers:
    - name: test-container
      image: busybox
      imagePullPolicy: IfNotPresent
      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

创建Pod kubectl create -f pod-configmap-env-var-valueFrom.yaml
注意:如果要在command中使用参数,需要提前在env或者是envFrom中提前定义该环境变量

查看Pod容器的日志。kubectl logs pod/test-pod2
在test-container容器的日志中输出:

very charm

4.4 将 ConfigMap 数据添加到一个卷中

创建Pod:pod-configmap-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod3
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh", "-c", "sleep 3600" ]
      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

创建Pod kubectl create -f pod-configmap-volume.yaml

进入Pod的容器中:kubectl exec pod/test-pod3 -it sh
查看/etc/config目录下的数据。

/etc/config # pwd
/etc/config
/etc/config # ls
SPECIAL_LEVEL  SPECIAL_TYPE
/etc/config # cat SPECIAL_LEVEL
very
/etc/config # cat SPECIAL_TYPE
charm
/etc/config #

可以看到special-config这个ConfigMap中的全部数据已经自动放入到定义的/etc/config文件夹下。且文件名就是special-config定义的key,value就是文件的内容。
注意: 如果在 /etc/config/ 目录中有一些文件,它们将被删除。


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

前面是将ConfigMap中定义的所有数据全部放入到特定文件夹下。现在可以将特定的数据添加到数据卷中的特定路径下。
Pod资源清单的yaml:pod-configmap-volume-specific-key.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pod4
spec:
  containers:
    - name: test-container
      image: busybox
      command: [ "/bin/sh","-c","sleep 3600" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        name: special-config
        items:
        - key: SPECIAL_LEVEL
          # 这里的keys表示文件的名称
          path: keys
  restartPolicy: Never

创建Pod kubectl create -f pod-configmap-volume-specific-key.yaml
进入Pod中的容器,kubectl exec pod/test-pod4 -it sh查看cat /etc/config/keys文件的内容。

/ # cat /etc/config/keys
very
/ #

5 ConfigMap的热更新

出于业务的需要,需要修改ConfigMap中的配置数据,那么引用了该ConfigMap的Pod中的容器的数据会不会跟着进行更新呢?
答案是需要分情况:

  1. 如果是使用env的方式将配置信息注入到容器的环境变量中,当ConfigMap中的配置数据发生改变时,容器中的环境变量的值并不会发生改变。
  2. 如果使用volume挂载的方式,当ConfigMap中的配置数据发生改变时,容器中的挂载路径下的文件数据也会随之发生修改。kubelet 在每次定期同步时都会检查已挂载的 ConfigMap 是否是最新的。 但是,它使用其本地的基于 TTL 的缓存来获取 ConfigMap 的当前值。 因此,从更新 ConfigMap 到将新键映射到 Pod 的总延迟可能与 kubelet 同步周期 + ConfigMap 在 kubelet 中缓存的 TTL 一样长。
    从kubelet的源码里KubeletManager中是有Volume Manager的,这就说明Kubelet会监控管理每个Pod中的Volume资源,当发现配置的Volume更新后,就会重建Pod,以更新所用的Volume,但是会有一定延迟,大概10秒以内。

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


5.1 使用环境变量挂载ConfigMap的deployment的滚动更新

如果想要让使用环境变量的方式挂载ConfigMap的Pod也要进行热更新,需要满足如下条件

  1. 必须要使用控制器类型的Pod,且只能是Deployment。只有Deployment支持滚动更新。
  2. 且在修改ConfigMap的配置文件之后Deployment并不会进行滚动更新,需要修改 pod annotations 的方式强制触发滚动更新。
 kubectl patch deployment <deployment_name> -p '{"spec": {"template": {"metadata": {"annotations": {"update": "2" }}}}}'

演示案例:
资源清单 deployment-cm-update.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-cm-update
spec:
  selector:
    matchLabels:
      app: deployment-cm-update
  template:
    metadata:
      labels:
        app: deployment-cm-update
    spec:
      containers:
      - name: test
        image: busybox
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - sleep 3600
        envFrom:
        - configMapRef:
            name: special-config

创建Deployment和ConfigMap kubectl apply -f deployment-cm-update.yaml

显示创建的Pod kubectl get pod

打印注入到容器中的环境变量 kubectl exec deployment-cm-update-XXX env

SPECIAL_LEVEL=very
SPECIAL_TYPE=charm
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
HOME=/root

这时候打开另外一个终端,使用kubectl get pod -w命令监控Pod
这时候修改special-config的ConfigMap中的值

kubectl edit cm special-config

将SPECIAL_LEVEL的值从very变成very+1。使用ESC :wq! 保存退出。这时候special-config的值已经发生了变化。
重新执行 kubectl exec deployment-cm-update-XXX env发现环境变量SPECIAL_LEVEL并没有发生改变。
这说明如果使用环境变量的方式挂载ConfigMap配置数据,当ConfigMap发生修改时,Pod中的容器的环境变量的值并没有发生修改。
使用patch命令修改Pod的数据,强制修改,触发滚动更新。

 kubectl patch deployment deployment-cm-update -p '{"spec": {"template": {"metadata": {"annotations": {"update": "2" }}}}}'

这时候注意观察另一个终端,发现Pod进行了重启,deployment进行了滚动更新

NAME                                    READY   STATUS    RESTARTS   AGE
deployment-cm-update-5465f94849-zzvwg   1/1     Running   0          2m41s
deployment-cm-update-6fc9894dc-7zkkk    0/1     Pending   0          0s
deployment-cm-update-6fc9894dc-7zkkk    0/1     Pending   0          0s
deployment-cm-update-5465f94849-zzvwg   1/1     Terminating   0          3m11s
deployment-cm-update-6fc9894dc-7zkkk    0/1     ContainerCreating   0          0s
deployment-cm-update-6fc9894dc-7zkkk    1/1     Running             0          12s
deployment-cm-update-5465f94849-zzvwg   0/1     Terminating         0          3m42s
deployment-cm-update-5465f94849-zzvwg   0/1     Terminating         0          3m43s
deployment-cm-update-5465f94849-zzvwg   0/1     Terminating         0          3m43s

重新执行 kubectl exec deployment-cm-update-XXX env发现环境变量SPECIAL_LEVEL发生了改变。

SPECIAL_TYPE=charm
SPECIAL_LEVEL=very+1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
HOME=/root

5.2 使用volume挂载ConfigMap的Pod

删除之前创建的ConfigMap和Deployment。kubectl delete -f deployment-cm-update.yaml
资源清单:pod-volume-cm-update.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  SPECIAL_LEVEL: very
  SPECIAL_TYPE: charm
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-cm-update
spec:
  containers:
  - name: test
    image: busybox
    imagePullPolicy: IfNotPresent
    command:
    - /bin/sh
    - -c
    - sleep 3600
    volumeMounts:
    - name: config
      mountPath: /config
  volumes:
  - name: config
    configMap:
      name: special-config 

创建Pod和ConfigMap kubectl apply -f pod-volume-cm-update.yaml
进入Pod中的容器查看 /config文件夹下的配置文件 kubectl exec pod-volume-cm-update -- cat /config/SPECIAL_LEVEL
这里ConfigMap中的key作为文件名, value为文件的内容。very
我们使用kubectl patch cm special-config -p '{"data":{"SPECIAL_LEVEL":"very+1"}}'命令对special-config的SPECIAL_LEVEL进行修改
大概过了10秒后。重新执行kubectl exec pod-volume-cm-update -- cat /config/SPECIAL_LEVEL命令发现发生了变化 very+1


6 使用 ConfigMap 来配置 Redis

资源清单:redis-cm.yaml

#定义ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-config
  namespace: default
data:
  redis-config: |
    maxmemory 2mb
	maxmemory-policy allkeys-lru
---
#定义redis的Pod
apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis:5.0.4
    command:
      - redis-server
      - "/redis-master/redis.conf"
    env:
    - name: MASTER
      value: "true"
    ports:
    - containerPort: 6379
    volumeMounts:
    - name: data
      mountPath: /redis-master-data 
    - name: config
      mountPath: /redis-master
  volumes:
  - name: data
    emptyDir: {}
  - name: config
    configMap:
      name: redis-config
      items:
      - key: redis-config
        path: redis.conf

创建ConfigMap和Pod kubectl create -f redis-cm.yaml
在示例中,配置卷挂载在 /redis-master 下。 它使用 path 将 redis-config 密钥添加到名为 redis.conf 的文件中。 因此,redis配置的文件路径为 /redis-master/redis.conf。 这是镜像将在其中查找 redis master 的配置文件的位置。
使用kubectl exec redis -it -- redis-cli命令连接到Pod的redis服务器

kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"

可以看到配置文件已经被redis服务器加载。
当我们修改redis-config的ConfigMap数据,会触发redis这个Pod的滚动更新。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐