ConfigMap供容器使用的典型用法如下:
ConfigMap以一个或多个key:value的形式保存在K8s系统中供应用使用,既可以用于表示一个变量的值(例如apploglevel=info),也可用于表示一个完整配置文件的内容(例如server.xml=)
可以通过yaml配置文件或者直接使用kubectl create configmap命令行的方式来创建ConfigMap。
下面的例子cm-appvars.yaml描述了将几个应用所需的变量定义为ConfigMap的用法:
cm-appvars.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
apploglevel: info
appdatadir: /var/data
执行kubectl create命令创建该ConfigMap:
kubectl create -f cm-appvars.yaml
configmap "cm-appvars" created
查看创建好的Configmap
kubectl get coinfigmap
NAME DATA AGE
cm-appvars 2 3s
kubectl describe configmap cm-appvars
Name: cm-appvars
Namespace: default
Labels: <none>
Annotations: <none>
Data:
====
appdatadir: 9 bytes
apploglevel: 4 bytes
kubectl get configmap cm-appvars -o yaml
apiVersion: v1
data:
appdatadir: /var/data
apploglevel: info
kind: ConfigMap
metadata:
creationTimestamp: 2016-07-28T19:57:16Z
name: cm-appvars
namespace: default
resourceVersion: "78709"
selfLink: /api/v1/namespaces/default/configmaps/cm-appvars
uid: 7bb2e9c0
下面的例子cm-appconfigfiles.yaml描述了将两个配置文件server.xml和logging.properties定义为ConfigMap的用法,设置key为配置文件的别名,value则是配置文件的全部文本内容:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appconfigfiles
data:
key-serverxml:
<?xml version="1.0" encoding="UTF-8"?>
>
>
>
key-loggingproperties: "flume.root.logger=INFO,LOGFILE,
flume.log.dir=./logs,
flume.log.file=flume.log"
执行kubectl create创建该ConfigMap:
kubectl create -f cm-appconfigfiles.yaml
configmap "cm-appconfigfiles" created
kubectl get configmap cm-appconfigfiles
NAME DATA AGE
cm-appconfigfiles 2 14s
kubectl describe configmap cm-appconfigfiles
Name: cm-appconfigfiles
Namespace: default
Labels: <none>
Annotations: <none>
Data:
====
key-loggingproperties: 1809 bytes
key-serverxml: 1686 byte
查看已经创建的ConfigMap的详细内容,可以看到两个配置文件的全文:
kubectl get configmap cm-appconfigfiles -o yaml
不使用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 NAME --from-literal=key1=value1 --from-literal=key2=value2
例一:当前目录下含有配置文件server.xml,可以创建一个包含该文件内容的ConfigMap:
kubectl create configmap cm-server.xml --from-file=server.xml
kubectl describe configmap cm-server.xml
例二:configfiles目录下包含两个配置文件server.xml和logging.properties,创建一个包含这两个文件内容的ConfigMap:
kubectl create configmap cm-appconf --from-file=configfiles
kubectl describe configmap cm-appconf
例三:使用–from-literal参数进行创建的示例如下:
kubectl create configmap cm-appenv --from-literal=loglevel=info --from-literal=appdatedir=/var/data
以创建的ConfigMap "cm-appvars"为例:
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appvars
data:
apploglevel: info
appdatadir: /var/data
在Pod “cm-test-pod”的定义中,将ConfigMap "cm-appvars"中的内容以环境变量(APPLOGLEVEL和APPDATADDIR)设置为容器内部的环境变量,容器的启动命令将现实这两个环境变量的值(“env | grep APP”)
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-test
image: busybox
command: ["/bin/sh","-c","env | grep APP"]
env:
- name: APPLOGLEVEL #定义环境变量名称
valueFrom: #key为"apploglevel"
name: cm-appvars #定义环境变量的名称
key: apploglevel
- name: APPDATADIR
valueFrom: #key "appdatadir"对应的值
configMapKeyRef:
name: cm-appvars #环境变量的值取自cm-appvars中
key: appdatadir #key为"appdatadir"
restarPolicy: Never
使用kubectl create -f命令创建该Pod,由于是测试Pod,所以该Pod在执行完启动命令后将会退出,并且不会被系统自动重启(restartPolicy=Never):
kubectl create -f cm-test-pod.yaml
使用kubectl get pods --show-all查看已经停止的Pod:
kubectl get pods --show-all
NAME READY STATUS RESTARTS AGE
cm-test-pod 0/1 Completed 0 8s
查看该Pod的日志,可以看到启动命令"env|grep APP"的执行结果如下:
kubectl logs cm-test-pod
APPDATADIR=/var/data
APPLOGLEVEL=info
说明容器内部的环境变量使用ConfigMap cm-appvars中的值进行了正确的设置。
也可以通过envFrom实现在Pod环境内将ConfigMap(也可用于Secret资源对象)中所有定义的key=value自动生成为环境变量:
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-test
image: busybox
command: ["/bin/sh","-c","env | grep APP"]
envFrom:
- configMapRef
name: cm-appvars #根据cm-appvars中的可以=value自动生成环境变量
restarPolicy: Never
通过这个定义,在容器内部将会生成如下环境变量:
APPDATADIR=/var/data
APPLOGLEVEL=info
注意:环境变量的名称受POSIX命名规范([a-zA-Z_][a-zA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来描述变量无法生成,但并不阻止Pod的启动。
下面所示的cm-appconfigfiles.yaml例子中包含两个配置文件的定义:server.xml和logging.properties
apiVersion: v1
kind: ConfigMap
metadata:
name: cm-appconfigfiles
data:
key-serverxml:
<?xml version="1.0" encoding="UTF-8"?>
>
>
>
key-loggingproperties: "flume.root.logger=INFO,LOGFILE,
flume.log.dir=./logs,
flume.log.file=flume.log"
在Pod "cm-test-app"的定义中,将ConfigMap “cm-appconfigfiles”中的内容以文件的形式mount到容器内部的/configfiles目录中去。
Pod配置文件cm-test-app.yaml的内容如下:
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
volumeMounts:
- name: serverxml # 引用volume名
moutPath: /configfiles #挂载到容器内的目录
volumes:
- name: serverxml #定义volume名
configMap:
name: cm-appconfigfiles #使用ConfigMap "cm-appconfigfiles"
items:
- key: key-serverxml # key=key-serverxml
path: server.xml # value将server.xml文件名进行挂载
- key: key-loggingproperties #key=key-loggingproperties
path: logging.properties #value将logging.properties文件名进行挂载
创建该Pod:
kubectl create -f cm-test-app.yaml
登陆容器,查看到/configfiles目录下存在server.xml和logging.properties文件,两个文件的内容就是ConfigMap "cm-appconfigfiles"中两个key定义的内容。
kubectl exec -ti cm-test-app -- bash
root@cm-test-app:/# cat /configfiles/server.xml
root@cm-test-app:/# cat /configfiles/logging.properties
如果在引用ConfigMap时不能指定items,则使用volumeMount方式在容器内的目录中为每个item生成一个文件名为key的文件。
Pod配置文件cm-test-app.yaml的内容如下:
apiVersion: v1
kind: Pod
metadata:
name: cm-test-app
spec:
containers:
- name: cm-test-app
image: kubeguide/tomcat-app:v1
imagePullPolicy: Never
ports:
- containerPort: 8080
volumeMounts:
- name: serverxml # 引用volume名
moutPath: /configfiles #挂载到容器内的目录
volumes:
- name: serverxml #定义volume名
configMap:
name: cm-appconfigfiles #使用ConfigMap "cm-appconfigfiles"
创建该Pod
kubectl create -f cm-test-app.yaml
登录容器,查看到/configfiles目录下存在key-loggingproperties和key-serverxml文件,文件的名称来自ConfigMap cm-appconfigfiles中定义的两个key的名称,文件的内容则为value的内容:
# ls /configfiles
key-serverxml key-loggingproperties
使用ConfigMap的限制条件如下: