ConfigMap
ConfigMap供容器使用的典型用法如下:
(1)生成为容器内的环境变量
(2)设置容器启动命令的启动参数(需设置为环境变量)
(3)以Volume的形式挂载为容器内部的文件或目录
创建ConfigMap资源对象
通过YAML配置文件方式创建
[root@lab-26 test]# vi cm-appvars.yaml apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars namespace: default data: apploglevel: info appdatadir: /var/data
查看
[root@lab-26 test]# kubectl describe configmap cm-appvars [root@lab-26 test]# kubectl describe configmap cm-appvars -o yaml
通过kubectl命令行方式创建
[root@lab-26 test]# kubectl create cm cm-server.xml --from-file=server.xml
假设在configfiles目录下包含两个配置文件server.xml和 logging.properties,创建一个包含这两个文件内容的ConfigMap:
[root@lab-26 test]# kubectl create cm cm-appconf --from-file=configfiles
在Pod中使用ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: cm-appvars namespace: default data: apploglevel: info appdatadir: /var/data
在Pod“cm-test-pod”的定义中,将ConfigMap“cm-appvars”中的内容 以环境变量(APPLOGLEVEL和APPDATADIR)方式设置为容器内部 的环境变量,容器的启动命令将显示这两个环境变量的值("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"对应的值 configMapKeyRef: name: cm-appvars # 环境变量的值取自cm-appvars key: apploglevel # key 为apploglevel - name: APPDATADIR # 定义环境变量名称 valueFrom: # key "appdatadir"对应的值 configMapKeyRef: name: cm-appvars # 境变量的值取自cm-appvars key: appdatadir # key 为 appdatadir" restartPolicy: Never
由于是测试Pod,所以该Pod在 执行完启动命令后将会退出,并且不会被系统自动重启(restartPolicy=Never)
查看该Pod的日志,可以看到启动命令“env | grep APP”的执行结果
[root@lab-26 test]# kubectl logs cm-test-pod APPDATADIR=/var/data APPLOGLEVEL=info
Kubernetes从1.6版本开始,引入了一个新的字段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" ] envFrom: - configMapRef name: cm-appvars # 根据cm-appvars中的key=value自动生成环境变量 restartPolicy: Never
需要说明的是,环境变量的名称受POSIX命名规范([a-zA-Z_][a- zA-Z0-9_]*)约束,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个Event来提示环境变量无法生成,但并不阻止Pod的启动。
通过volumeMount使用ConfigMap
在如下所示的cm-appconfigfiles.yaml例子中包含两个配置文件的定义:server.xml和logging.properties。
apiVersion: v1 kind: ConfigMap metadata: name: cm-appconfigfiles data: key-serverxml: | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx key-loggingproperties: "handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler .handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler 1catalina.org.apache.juli.FileHandler.level = FINE 1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 1catalina.org.apache.juli.FileHandler.prefix = catalina. 2localhost.org.apache.juli.FileHandler.level = FINE 2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 2localhost.org.apache.juli.FileHandler.prefix = localhost. 3manager.org.apache.juli.FileHandler.level = FINE 3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 3manager.org.apache.juli.FileHandler.prefix = manager. 4host-manager.org.apache.juli.FileHandler.level = FINE 4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 4host-manager.org.apache.juli.FileHandler.prefix = host-manager. java.util.logging.ConsoleHandler.level = FINE java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler "
在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的名称 mountPath: /configfiles # 挂载到容器内的目录 volumes: - name: serverxml # 定义Volume的名称 configMap: name: cm-appconfigfiles # 使用挂载的cm cm-appconfigfiles items: - key: key-serverxml # key=key-serverxml path: server.xml # 将文件命名为server.xml - key: key-loggingproperties # key=key-loggingproperties path: logging.properties # 将文件命名为logging.properties
登录容器查看,确认无误
root@cm-test-app:~# ls /configfiles/ logging.properties server.xml
如果在引用ConfigMap时不指定items,则使用volumeMount方式在 容器内的目录下为每个item都生成一个文件名为key的文件。
volumeMounts: - name: serverxml # 引用Volume的名称 mountPath: /configfiles # 挂载到容器内的目录 volumes: - name: serverxml # 定义Volume的名称 configMap: name: cm-appconfigfiles # 使用挂载的cm cm-appconfigfiles
使用ConfigMap的限制条件
使用ConfigMap的限制条件如下:
- ConfigMap必须在Pod之前创建
- ConfigMap受Namespace限制,只有处于相同Namespace中的 Pod才可以引用它
- ConfigMap中的配额管理还未能实现
- kubelet只支持可以被API Server管理的Pod使用ConfigMap。 kubelet在本Node上通过 --manifest-url或--config自动创建的静态Pod将无 法引用ConfigMap
- 在Pod对ConfigMap进行挂载(volumeMount)操作时,在容器 内部只能挂载为“目录”,无法挂载为“文件”。在挂载到容器内部后,在 目录下将包含ConfigMap定义的每个item,如果在该目录下原来还有其他文件,则容器内的该目录将被挂载的ConfigMap覆盖。如果应用程序 需要保留原来的其他文件,则需要进行额外的处理。可以将ConfigMap 挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接 到(cp或link命令)应用所用的实际配置目录下