应用所需的配置信息与程序进行分离,这样可以使应用程序被更好地复用,通过不同的配置也能实现更灵活的功能
ConfigMap概述
(1) 什么是ConfigMap
ConfigMap 是以Key-Value的形式存储在Kubernetes中,用于描述一个变量的值或者是完整配置文件内容。
通常用Yaml文件,或者kubectl create configmap命令行的方式创建。
(2) ConfigMap的应用
ConfigMap供容器使用的典型用法如下。
a. 生成为容器内的环境变量。
b. 设置容器启动命令的启动参数(需设置为环境变量)。
c. 以Volume的形式挂载为容器内部的文件或目录。
创建ConfigMap资源对象
1.通过YAML配置文件方式创建
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvers
data:
apploglevel: info
appdatadir: /var/data
创建命令:
kubectl create -f cm-appvars.yaml
2.通过kubectl命令行方式创建
不使用YAML文件,直接通过kubectl create configmap也可以创建ConfigMap,可以使用参数--from-file或--from-literal指定内容,并且可以在一行命令中指定多个参数。
(1)通过--from-file参数从文件中进行创建,可以指定key的名称,也可以在一个命令行中创建包含多个key的ConfigMap,语法为:
kubectl create configmap Name --from-file=[key=]source --from-file=[key=]source
(2)通过--from-file参数从目录中进行创建,该目录下的每个配置文件名都被设置为key,文件的内容被设置为value,语法为:
kubectl create configmap Name --from-file=config-files-dir
(3)使用--from-literal时会从文本中进行创建,直接将指定的key#=value#创建为ConfigMap的内容,语法为:
kubectl create configmap --from-literal=key=value ...
在Pod中使用ConfigMap
容器应用对ConfigMap的使用有以下两种方法。
1.通过环境变量方式使用ConfigMap
env:
-name: APPLOGLEVEL #定义变量名称
valuefrom:
configmapkeyref:
name: cm-appvars #环境变量取自的configmap名称
key: apploglevel # 变量的key
Kubernetes从1.6版本开始,引入了一个新的字段envFrom,实现了在Pod环境中将ConfigMap(也可用于Secret资源对象)中所有定义的key=value自动生成为环境变量:
envFrom:
- configMapRef:
name: cm-appvars #加载所有cm-appvars的kv到自动生成环境变量
- 注意:环境变量的名称受POSIX命名规范([a-zA-Z_][a-zA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来提示环境变量无法生成,但并不阻止Pod的启动。
2.通过volumeMount使用ConfigMap
Containers:
- name: testabc
...
volumeMounts:
- name: serverxml #挂载的volume名称
mountPath: /configfiles #挂载到容器内的目录
Volumes:
- name: serverxml #volume 名称
configMap:
name: cm-appconfigfiles #使用的configmap
使用ConfigMap的限制条件
- ConfigMap必须在Pod之前创建。
- ConfigMap受Namespace限制,只有处于相同Namespace中的Pod才可以引用它。
- ConfigMap中的配额管理还未能实现。
- 静态Pod无法饮用ConfigMap
- a. 用挂载,内部只能为目录,无法挂载为文件
b. 目录原先有文件会被覆盖
c. 如果需要保留目录下其他文件,可以cm挂载到临时目录,然后用文件肤质或者链接到实际配置目录下。
TODO 什么是配额管理,后边在资源管理会讲。