带你玩转kubernetes-k8s(第13篇:k8s-深入掌握Pod-在Pod中使用ConfigMap)

昨天带着大家一起使用三种方式创建了ConfigMap,今天我就带着大家一起来学习在Pod中使用ConfigMap。

在Pod中使用ConfigMap

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

 

带你玩转kubernetes-k8s(第13篇:k8s-深入掌握Pod-在Pod中使用ConfigMap)_第1张图片

 

以前面创建的ConfigMap“cm-appenv”为例:根据上图中的部分内容填写下面yaml

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 “apploglever”对应的值
            configMapKeyRef:
              name: cm-appenv      # 环境变量的值取自 cm-appenv
              key: loglevel        # key为 loglever
        - name: APPDATADIR         # 定义环境变量的名称
          valueFrom:               # key “appdatadir”对应的值
            configMapKeyRef:
              name: cm-appenv      # 环境变量的值取自 cm-appenv
              key: appdatadir      # key为appdatadir
  restartPolicy: Never

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

  状态为Completed ,Pod已经停止了。

查看该Pod的厉害,可以看到启动命令 “env | grep APP”

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

       envFrom实现了在Pod环境中将ConfigMap(也可用于Secret资源对象)中所有定义的key=value自动生成为环境变量:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-pod3
spec:
  containers:
    - name: cm-test3
      image: busybox
      command: [ "/bin/sh", "-c", "env | grep APP" ]
      envFrom:
        - configMapRef:
            name: cm-appenv
  restartPolicy: Never

由于我们是k8s1.14所以没有办法实现,这点大家了解就好了。

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

2.通过volumeMount使用ConfigMap

在如下所示的cm-appconfigfiles.yaml例子中包含两个配置文件的定义:server.xml和logging.properties。我们上节已经创建了。

      在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: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml
      mountPath: /configfiles
  volumes:
  - name: serverxml
    configMap:
      name: cm-appconfigfiles
      items:
      - key: key-serverxml
        path: server.xml
      - key: key-loggingproperties
        path: logging.properties

进入容器,查看到在/configfiles目录下存在server.xml和logging.properties文件,它们的内容就是ConfigMap“cm-appconfigfiles”中两个key定义的内容:

带你玩转kubernetes-k8s(第13篇:k8s-深入掌握Pod-在Pod中使用ConfigMap)_第2张图片

 

 

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

实例如下:

apiVersion: v1
kind: Pod
metadata:
  name: cm-test-app2
spec:
  containers:
  - name: cm-test-app2
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: serverxml
      mountPath: /configfiles
  volumes:
  - name: serverxml
    configMap:
      name: cm-appconfigfiles

 

带你玩转kubernetes-k8s(第13篇:k8s-深入掌握Pod-在Pod中使用ConfigMap)_第3张图片

使用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命令)应用所用的实际配置目录下。

 

小结:

       大家看到这里的时候,大家已经基本掌握了ConfigMap的用法了。

       谢谢大家的支持~

你可能感兴趣的:(kubernetes)