Kubernetes实践之深入掌握Pod——ConfigMap

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\r\n\r\n.handlers = 1catalina.org.apache.juli.FileHandler,
    java.util.logging.ConsoleHandler\r\n\r\n1catalina.org.apache.juli.FileHandler.level
    = FINE\r\n1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n1catalina.org.apache.juli.FileHandler.prefix
    = catalina.\r\n\r\n2localhost.org.apache.juli.FileHandler.level = FINE\r\n2localhost.org.apache.juli.FileHandler.directory
    = ${catalina.base}/logs\r\n2localhost.org.apache.juli.FileHandler.prefix = localhost.\r\n\r\n3manager.org.apache.juli.FileHandler.level
    = FINE\r\n3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs\r\n3manager.org.apache.juli.FileHandler.prefix
    = manager.\r\n\r\n4host-manager.org.apache.juli.FileHandler.level = FINE\r\n4host-manager.org.apache.juli.FileHandler.directory
    = ${catalina.base}/logs\r\n4host-manager.org.apache.juli.FileHandler.prefix =
    host-manager.\r\n\r\njava.util.logging.ConsoleHandler.level = FINE\r\njava.util.logging.ConsoleHandler.formatter
    = java.util.logging.SimpleFormatter\r\n\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].level
    = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers
    = 2localhost.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level
    = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers
    = 3manager.org.apache.juli.FileHandler\r\n\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level
    = INFO\r\norg.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers
    = 4host-manager.org.apache.juli.FileHandler\r\n\r\n"

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

 

posted @ 2020-05-23 21:53  Wshile  阅读(343)  评论(0编辑  收藏  举报