configmap简介

在生产环境中经常会遇到需要修改配置文件的情况,传统的修改方式不仅会影响到服务的正常运行,而且操作步骤也很繁琐。
为了解决这个问题,kubernetes项目从1.2版本引入了ConfigMap功能,用于将应用的配置信息与程序的分离。

ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。

ConfigMap不可以跨命名空间使用

ConfigMap必须要在pod/deployment创建之前就得存在

ConfigMap 在设计上不是用来保存大量数据的。在 ConfigMap 中保存的数据不可超过 1 MiB。如果你需要保存超出此尺寸限制的数据,你可能希望考虑挂载存储卷 或者使用独立的数据库或者文件服务。

ConfigMap创建

通过文件创建configmap

1
kubectl create configmap my-config --from-file=key1=test1.txt  --from-file=key2=test2.txt

通过文件夹创建configmap

1
kubectl create configmap dir-config --from-file=config/

通过键值对创建configmap

1
kubectl create configmap literal-config --from-literal=key1=hello --from-literal=key2=world

通过yaml文件创建

  • config.yaml
1
2
3
4
5
6
7
8
9
10
11
12
#config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
key1: hello
key2: world
# 或者使用文件为key的方式创建
data:
application.yml: |
demo2.url: http://docker-demo2.docker-demo:8080/test1

ConfigMap使用

环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Deployment
...

env:
- name: xxx
valueFrom:
configMapKeyRef:
key: 对应configmap中配置的key
name: <config_map的名>
#envFrom:
# - configMapRef:
# name: docker-demo-configmap

命令行参数

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Deployment
...
command: [ "/bin/sh","-c","echo $(KKK) "]
env:
- name: KKK
valueFrom:
configMapKeyRef:
key: 对应configmap中配置的key
name: <config_map的名>

挂载卷

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
apiVersion: v1
kind: Deployment
...
containers:
- name: my-container1
image: my-image
volumeMounts:
- name: configmap
mountPath: /build/config
subPath: application.properties
- name: my-container2
image: my-image
volumeMounts:
- name: configmap #指定名称必须与下面一致
mountPath: /build/config #容器内的挂载点(Dockerfile中的WORKDIR)
# subPath的作用是可以不直接挂载整个volume,而是挂载其中的子路径,具体如下(参考:https://blog.51cto.com/u_11791718/4205561)
#1、限制访问权限:这个Deployment样例中,my-container2容器仅能访问configmap中的application.yml属性。如果是个hostpath,则只能访问对应路径下的application.yml
#2、用于在同一个volume中为不同的容器提供不同的文件和目录访问权限,以及避免文件命名冲突:例如当前Deployment样例,my-container1和my-container2都使用到了volume-configmap,而1仅将application.properties挂载其下,2则将application.yml挂载其下
# subPath: application.yml
volumes:
- name: configmap #指定名称必须与上面一致
configMap:
name: docker-demo-configmap
# items: # 此属性一般适用于configmap/secret有多组配置文件,想要单一引用的情况. 此方式会导致mountPath目录中所有先前的文件都被删除。
# - key: application.yml # 指定configmap中的某一个配置的key
# path: application.yml # 拼接mountPath,且不能以/开头

关于环境变量生效顺序

假如一资源对象有env, envFrom

其实现逻辑是会初始化一个 Map 存放环境变量,然后按照如下步骤进行处理:

  1. 按顺序遍历 envFrom 引用的 ConfigMap 和 Secret 的 Key/Value
  2. 按顺序遍历 env 中的设置的 Key/Value
  3. 由于 Pod 默认开启了 EnableServiceLinks,最后还需要将 Service 相关变量注入

优先级是,Service 变量 > Env > EnvFrom,后者操作的内容会覆盖前者, 其中 EnvFrom 的优先级是后面覆盖前面。

这里单独说下,注入到环境变量中的 Service 相关变量:

  • 注入的范围。所在命名空间的所有 Service
  • 注入的内容。同一命名空间下,所有的服务地址、端口、协议。