k8s中的ConfigMap
在实际使用k8s运行项目的过程中,经常需要使用一定的配置文件。例如可能需要将变量注入到容器的环境变量中,但是在项目运行的过程中,环境变量的值可能发生修改,如果使用直接修改yaml的方式或者是使用patch的方式并不优雅,也不安全。例如在创建ingress-nginx的时候,在yaml中定义了多个ConfigMap。可以使用ConfigMap将nginx的配置文件抽取出来。我们只需要修改定义的Con
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.properties
和 ui.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中的容器的数据会不会跟着进行更新呢?
答案是需要分情况:
- 如果是使用env的方式将配置信息注入到容器的环境变量中,当
ConfigMap
中的配置数据发生改变时,容器中的环境变量的值并不会发生改变。 - 如果使用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也要进行热更新,需要满足如下条件
- 必须要使用控制器类型的Pod,且只能是
Deployment
。只有Deployment
支持滚动更新。 - 且在修改
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的滚动更新。
更多推荐
所有评论(0)