一,介绍
Configmap(简写 cm)是k8s中的资源对象,用于保存非机密性的配置的,数据可以用key/value键值对的形式保存,也可通过文件的形式保存。
【局限性】:在ConfigMap不是用来保存大量数据的,其数据量不可超过1 MiB。
kubectl get cm
二,功能
Configmap资源对象,可以有一个或者多个Configmap,通过 volume 形式映射到容器内部指定目录上,容器中应用程序按照原有方式读取容器特定目录上的配置文件,最总实现统一的配置管理。
三,两种方式
configmap注入方式有两:
- 一种是将configMap做为存储卷
- 一种是将configMap通过env中configMapKeyRef,注入到容器中。
四,应用场景
- 1、当需要将应用配置写进代码中,更新配置也需要打包镜像时。
configmap可以将配置信息和docker镜像解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,可直接注入到Pod中给容器使用。 - 2、当搭建使用微服务架构,在多个服务共用配置时。
如果每个服务中单独一份配置的话,那么更新配置就很麻烦,使用configmap可以友好的进行配置共享。
五,创建方法
1,指定"key/value"创建
直接在命令行中,通过--from-literal
指定参数,创建configmap。更为常用!
# 指定key1=config1和key2=config2来创建
kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
2,指定“配置文件”创建
key1和key2 分别指定一个配置文件,可以连续多个–from-file使用。
kubectl create configmap my-config --from-file=key1=/path/config-dir/file1.txt --from-file=key2=/path/config-dir/file2.txt
3,指定“目录”创建
目录path/config-dir/下,存放所有配置文件
kubectl create configmap my-config --from-file=path/config-dir/
4,编写“configmap清单”创建
# cat mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap # 指定cm类型
metadata:
name: mysql # 指定名称
labels:
app: mysql # 指定cm的标签
data: # 指定cm数据
master.cnf: | # 具体数据名称1
[mysqld]
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
slave.cnf: | # 具体数据名称2
[mysqld]
super-read-only
log_bin_trust_function_creators=1
【注意】
- 符合
|
表示,以下内容按“行” 显示。
六,使用
下面以configmap名为mdy-cm为例。做如下进入pod操作:
1,通过环境变量引入,使用valueFrom.configMapKeyRef
# cat mdy-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mdy-pod-configmap
spec:
containers:
- name: mdy-pod-tep-configmap
image: busybox
command: ["/bin/sh","-c","sleep 3600"]
imagePullPolicy: IfNotPresent
env: # 引用变量
- name: mysql-user # 该名称 定义的是容器内的变量
valueFrom: # 数据来源
configMapKeyRef: # 通过valueFrom.configMapKeyRef加载 configmap
name: mdy-cm # 指定之前定义的 configmap资源名称
key: mysql.com # 指定之前定义的 configmap资源中的key, 将value赋值给上面容器内定义的变量
- name: mysql-pwd # 同上
valueFrom:
configMapKeyRef:
name: mdy-cm
key: nginx.conf
restartPolicy: Never
2,通过环境变量引入:使用envfrom
# cat mdy-pod-envFrom.yaml
apiVersion: v1
kind: Pod
metadata:
name: mdy-pod-configmap-envfrom
spec:
containers:
- name: mdy-pod-tep-configmap-envfrom
image: busybox
command: ["/bin/sh","-c","sleep 3600"]
imagePullPolicy: IfNotPresent
envFrom: # 引入变量
- configMapRef: # 定义数据来源configmap
name: mdy-cm # 明确configmap的资源名称
restartPolicy: Never
3,把configmap做成volume,挂载到pod 【常用方式】
该种方式类似与持久化存储。以文件形式挂载到容器内部。
# cat mdy-pod-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: mdy-pod-configmap-volume
spec:
containers:
- name: mdy-pod-tep-configmap-volume
image: busybox
command: ["/bin/sh","-c","sleep 3600"]
imagePullPolicy: IfNotPresent
volumeMounts: # 容器内部挂载引入
- name: configmap-volume # 指定挂载卷的名字
mountPath: /tmp/config # 容器内挂载指定路径目录
volumes: # 挂载卷
- name: configmap-volume # 挂载卷名称,必须在上面指定
configMap: # 采用configmap形式挂载
name: mdy-cm # 之前生成configmap的名称
restartPolicy: Never
以上三种方式不同:
- 第一种:通过给容器定义变量名A,然后将configmap中 B=C的值C,赋值给A。即 A = C
- 第二种:不在定义变量A,直接将configmap中 B=C,作为变量 加载到容器内。即 B = C
- 第三章:以挂载卷的形式,加载到容器内部。此种方式更为常用。
七,Configmap热更新
更新 ConfigMap 的值以后:
1,使用该 ConfigMap 挂载的 "Env"
是不会同步更新的。(见下图)
2,使用该 ConfigMap 挂载的" Volume"
中的数据需要一段时间(大概10s 左右)才能同步更新(见下图)。