如何在Pod中使用ConfigMap

容器应用对ConfigMap的使用有如下两种方法:node

  1. 经过环境变量获取ConfigMap中的内容api

  2. 经过volume挂载的方式将ConfigMap中的内容挂载为容器内部的文件或目录tomcat

经过环境变量的方式使用ConfigMap:bash

k8s 1.6版本开始,引入了envFrom字段,实现了在Pod环境中将ConfigMap中全部定义的key=value自动生成为环境变量:app

cat cm-appvars.yamlide

apiVersion: v1ui

kind: ConfigMapurl

metadata:spa

  name: cm-appvarsrest

data:

  apploglevel: info

  appdatadir: /var/data

cat cm-test-pod.yaml

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

  restartPolicy: Never

经过这个定义,在容器内部将会生成以下环境变量:

 apploglevel=info

 appdatadir=/var/data

注意:环境变量的名称受POSIX命令规范约束,不能以数字开头,若是包含非法字符,则系统将跳过该条环境变量的建立,并记录Event来提示环境变量没法生成,但并不阻止Pod的启动。


经过 volumeMount 使用ConfigMap

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                               #使用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文件名进行挂载

建立容器后,登陆容器,查看到在/configfiles 目录下存在server.xml和logging.properties文件,它们的内容就是ConfigMap“cm-appconfigfiles中两个key定义的内容。

k exec -it cm-test-app /bin/bash

spacer.gif

若是在引用ConfigMap时不指定items,则使用volumeMount方式在容器内的目录下为每一个item都生成一个文件名以key开头的文件。

spacer.gif

使用ConfigMap 的限制条件

  • configmap必须在Pod以前建立。

  • configmap受namespace限制,只有处于相同namespace中的pod才能够引用它。

  • configmap中的配额管理还未能实现。

  • kubelet只支持能够被API Server管理的Pod使用ConfigMap。kebelet在本地node上经过--manifest-url或--config自动建立的静态pod将没法引用configmap

  • 在pod对configmap进行挂载(volumeMount)操做时,在容器内部只能挂载为“目录”,没法挂载为“文件”。在挂载到容器内部后,在目录下将包含configmap定义的每一个item,若是在该目录下原来还有其余文件,则容器内的目录将被挂载的configmap覆盖。若是应用程序须要保留原来的其余文件,则须要进行额外的处理。能够将configmap挂载到容器内部的临时目录,再经过启动脚本将配置文件复制或者连接到(cp 或 link 命令)应用所用的实际配置目录下。

相关文章
相关标签/搜索