Kubernetes--Pod管理与配置apiVersion: v1kind: ConfigMapmetadata: name: cm-appvarsdata: apploglevel:

一、Pod的配置管理       应用部署的最佳实践就是将应用所需的配置信息与程序分离,这样应用程序可以更好的被复用,通过不同配置可以实现更好的功能。将应用程序打包成容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器环境中,对多个容器进行不同配置将变得非常复杂,K8S在1.2版本提供了一种统一配置管理方案---ConfigMap。 1.ConfigMap概述       ConfigMap供容器使用的典型用法:         (1)  生成容器内的环境变量         (2) 设置容器启动命令启动参数(需设置为环境变量)         (3) 以 volume形式挂载为容器内部        ConfigMap 以一个或多个key:value的形式保存在K8S系统*应用使用,既可以用于表示一个变量的值(例如 apploglevel=info),也可以用于表示一个完整的配置文件的内容(例如 server.xml=<?xml>)可以通过YAML文件或者使用kubectl create configmap命令行形式创建ConfigMap。 2.创建ConfigMap资源对象
  • 通过yaml文件创建
  • apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cm-appvars
    data:
      apploglevel: info
      appdatadir: /var/data

    Kubernetes--Pod管理与配置apiVersion: v1kind: ConfigMapmetadata: name: cm-appvarsdata: apploglevel:

  • 将两个配置文件server.xml和logging.properties定义为ConfigMap:  

  • apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cm-appconfigfiles
    data:
      key-serverxml: |
        <?xml version='1.0' encoding='utf-8'?>
        <Server port="8005" shutdown="SHUTDOWN">
          <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
          <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
          <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
          <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
          <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
          <GlobalNamingResources>
            <Resource name="UserDatabase" auth="Container"
                      type="org.apache.catalina.UserDatabase"
                      description="User database that can be updated and saved"
                      factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                      pathname="conf/tomcat-users.xml" />
          </GlobalNamingResources>
    
          <Service name="Catalina">
            <Connector port="8080" protocol="HTTP/1.1"
                       connectionTimeout="20000"
                       redirectPort="8443" />
            <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
            <Engine name="Catalina" defaultHost="localhost">
              <Realm className="org.apache.catalina.realm.LockOutRealm">
                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
                       resourceName="UserDatabase"/>
              </Realm>
              <Host name="localhost"  appBase="webapps"
                    unpackWARs="true" autoDeploy="true">
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log" suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
    
              </Host>
            </Engine>
          </Service>
        </Server>
      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"

    Kubernetes--Pod管理与配置apiVersion: v1kind: ConfigMapmetadata: name: cm-appvarsdata: apploglevel:

    • 通过命令行方式创建

         可以直接通过 kubectl create configmap 创建ConfigMap,也可以使用参数--from-file或--from-literal指定内容,并且可以在一行命令中指定多个参数。

      (1)通过--from-file参数从文件中进行创建,可以指定key名字,也可以在一个命令行中创建多个key的ConfigMap
    kubectl create config NAME --from-file=[key=] source --from-file=[key=] source

    2)通过--from-file参数在目录下进行创建,该目录下的每个配置文件名都被设置为key,文件的内容被设置为value,

    kubectl create configmap NAME --from-file=config-files-dir

    (3)使用--from-literal 时会从文本中进行创建,直接指定的key#=value#创建为ConfigMap内容

    kubectl create configmap NAME --from-literal=key1=value1 --from-literal=key2=value2

    3.在Pod中使用ConfigMap资源对象    将ConfigMap "cm-appvars"中的内容以环境变量方式设置为容器内部的环境变量,容器的启动命令显示这两个环境变量

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

    查看Pod日志可以看出,ConfigMap值进行了正确配置Kubernetes--Pod管理与配置apiVersion: v1kind: ConfigMapmetadata: name: cm-appvarsdata: apploglevel:

        在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自动生成环境变量
      restartPolicy: Never

    通过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进行挂载
    

    Kubernetes--Pod管理与配置apiVersion: v1kind: ConfigMapmetadata: name: cm-appvarsdata: apploglevel:

        进入到Pod  cm-test-app 中的 cm-test-app container在/configfile目录下可以看到挂载的两个文件。

    4.使用ConfigMap的限制条件

    ConfigMap必须在Pod之前创建,Pod才能引用它   ConfigMap受命名空间限制,只有处于同一个命名空间的Pod才能引用它 ConfigMap无法用于静态pod 如果pod使用evnFrom基于ConfigMap定义环境变量,则无效的环境变量名称将会忽略,并记录在事件中

上一篇:【MATLAB深度学习工具箱】学习笔记--鸢尾花聚类Iris Clustering


下一篇:【渝粤教育】广东开放大学 学前儿童保育学 形成性考核 (40)