Pod使用ConfigMap的两种方式

(1) 通过环境变量方式使用 ConfigMap

以前面创建的 ConfigMap “cm-appvars”为例 :

# vim cm-appvars.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  apploglevel: info
  appdatadir: /var/data

在 Pod “cm-test-pod”的定义中,将 ConfigMap “cm-appvars”中的内容以环境变量 (APPLOGLEVELAPPDATADIR)设置为容器内部的环境变量,容器的启动命令将显示这两个环境变量的值(“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:
        configMapKeyRef:
          name: cm-appvars
          key: appdatadir
  restartPolicy: Never

使用 kubectl create -f 命令创建该 Pod,由于是测试 Pod,所以该Pod在执行完启动命令后将会退出,井且不会被系统自动重启(restartPolicy=Never):

kubectl create -f cm-test-pod.yaml
pod ” cm-test-pod” created

使用kubectl get pods --show-all查看己经停止的 Pod:

kubectl get pods --show-all
Flag --show-all has been deprecated, will be removed in an upcoming release
NAME                                      READY     STATUS      RESTARTS   AGE
cm-test-pod                               0/1       Completed   0          4m

查看该 Pod 的日志,可以看到启动命令 env | grep APP 的执行结果如下:

kubectl logs cm-test-pod
APPDATADIR=/var/data
APPLOGLEVEL=info

说明容器内部的环境变量使用 ConfigMap cm-appvars 中的值进行了正确的设置。

从 Kubernetes vl.6 开始,引入了一个新的字段 envFrom,实现在 Pod 环境内将 ConfigMap (也可用于 Secret 资源对象〉中所有定义的key=value自动生成为环境变量:

 
apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod-env
spec:
  containers:
    - name: cm-test
      image: busybox
      command: ["/bin/sh","-c","env"]
      envFrom:
      - configMapRef:
         name: cm-appvars   # 根据 cm-appvars 中的 key=value 自动生成环境变量
  restartPolicy: Never

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

# kubectl logs cm-test-pod-env
apploglevel=info
appdatadir=/var/data

需要说明的是 ,环境变量的名称受 POSIX 命名规范([a-zA-Z][a-zA-Z0-9]*)约束 ,不能以数字开头。如果包含非法字符,则系统将跳过该条环境变量的创建,并记录一个 Event 来描 述环境变量无法生成,但并不阻止 Pod 的启动。

(2)通过 volumeMount 使用 ConfigMap

在pod "cm-test-app"定义中,将configmap "cm-appconfigfile"中的内容以文件形式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
      configMap:
        name: cm-appconfigfiles                  # 使用configmap定义的的cm-appconfigfile
        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
Pod "cm-test-app"created  

登录容器查看configfiles目录下的server.xmllogging.properties文件,他们的内容就是configmap “cm-appconfigfile”中定义的两个key的内容

 
# kubectl exec -ti cm-test-app -- bash

# cat /configfiles/server.xml
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder charset="utf-8"> <!-- encoder 可以指定字符集,对于中文输出有意义 --> <!-- %.-1level 只显示信息级别的首字母,%-5level 左对齐显示信息级别全称 --> <!-- 如需自定义关键字,用 %mdc{键名} 表示,程序中用MDC.put("键名","键值")设置,可动态设置 [%logger:%line]--> <Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] %logger %line --%mdc{client} [%X{TRACE_LOG_ID}] %msg%n</Pattern> </encoder> </appender>root@cm-test-app:/usr/local/tomcat# 

# cat /configfiles/logging.properties 
java -Xms1024m -Xmx2048m -Xmn1536m -Xss256k -XX:MaxPermSize=128m -XX:+UseConcMarr kSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XXX :+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/tmp/jvm.log -XX:+HH eapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmm xremote.port=4445 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.. jmxremote.authenticate=false -XX:HeapDumpPath=/tmp/heapdump.hprof -jar /data/appp deploy/$ENVIRONMENT/${PROJECT_JAR} >$jetty_log_path/$PROJECT_NAME.log

如果在引用 ConfigMap 时不指定 items,则将使用 volumeMount 方式在容器内的目录中为每个item生成一个文件名为key的文件。

Pod配置文件cm-test-app2.yaml内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app2
spec:
  containers:
  - name: cm-test-app2
    image: kubeguide/tomcat-app:v1
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml                          # 引用volume名
      mountPath: /configfiles                  # 挂载到容器内部目录
  volumes:
  - name: serverxml                            # 定义 volume 名
    configMap:
      name: cm-appconfigfiles                  # 使用configmap定义的的cm-appconfigfile

创建该Pod:

#kubectl create -f cm-test-app2.yaml
Pod "cm-test-app2"created  

登录容器,查看到/configfiles目录下存在key-loggingpropertieskey-serverxml文件,文件的名称来自 ConfigMap cm-appconfigfiles 中定义的两个key
的名称,文件的内容则为 value 的内容:

# ls /configfiles
key-loqqingproperties key-serverxml

使用ConfigMap的条件限制

  • configmap必须在pod之前创建
  • configmap也可以定义为属于某个Namespace,只有处于相同namespaces中的pod可以引用
  • kubelet只支持可以被API Server管理的Pod使用ConfigMap。
  • kubelet在本Node上通过--manifest-url--config自动创建的静态 Pod 将无法引用 Conf1gMap。
  • 在 Pod 对 ConfigMap 进行挂载(volumeMount)操作时,容器内部只能挂载为“目录”, 无法挂载为“文件”。在挂载到容器内部后,目录中将包含 ConfigMap 定义的每个item,如果该目录下原来还有其他文件,则容器内的该目录将会被挂载的 ConfigMap 覆盖。 如果应用程序需要保留原来的其他文件,则需要进行额外的处理。可以将 ConfigMap 挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接到(cp或link命令)应用所用的实际配置目录下。
 
 

 
posted @ 2022-03-22 18:05  Mr.peter  阅读(1207)  评论(0编辑  收藏  举报