zoukankan      html  css  js  c++  java
  • 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
    
    .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命令)应用所用的实际配置目录下
  • 相关阅读:
    Linux高并发内核优化-TougheRadius
    Zabbix 4.0 配置邮件报警功能
    Zabbix Agent 4.0 Windows 安装配置
    zabbix4.0前端个性化设置
    zabbix 4.0中文图形界面乱码问题
    Zabbix4.0系统告警“More than 75% used in the configuration cache”
    Zabbix4.0配置SNMP监控
    Zabbix4.0 SNMP安装
    Zabbix4.0添加cisco交换机基本监控步骤
    深入.NET框架
  • 原文地址:https://www.cnblogs.com/Wshile/p/12944652.html
Copyright © 2011-2022 走看看