官术网_书友最值得收藏!

3.5 Pod的配置管理

應(yīng)用部署的一個最佳實踐是將應(yīng)用所需的配置信息與程序進行分離,這樣可以使應(yīng)用程序被更好地復(fù)用,通過不同的配置也能實現(xiàn)更靈活的功能。將應(yīng)用打包為容器鏡像后,可以通過環(huán)境變量或者外掛文件的方式在創(chuàng)建容器時進行配置注入,但在大規(guī)模容器集群的環(huán)境中,對多個容器進行不同的配置將變得非常復(fù)雜。從Kubernetes 1.2開始提供了一種統(tǒng)一的應(yīng)用配置管理方案——ConfigMap。本節(jié)對ConfigMap的概念和用法進行詳細描述。

3.5.1 ConfigMap概述

ConfigMap供容器使用的典型用法如下。

(1)生成為容器內(nèi)的環(huán)境變量。

(2)設(shè)置容器啟動命令的啟動參數(shù)(需設(shè)置為環(huán)境變量)。

(3)以Volume的形式掛載為容器內(nèi)部的文件或目錄。

ConfigMap以一個或多個key:value的形式保存在Kubernetes系統(tǒng)中供應(yīng)用使用,既可以用于表示一個變量的值(例如apploglevel=info),也可以用于表示一個完整配置文件的內(nèi)容(例如server.xml=<?xml...>...)

可以通過YAML配置文件或者直接使用kubectl create configmap命令行的方式來創(chuàng)建ConfigMap。

3.5.2 創(chuàng)建ConfigMap資源對象

1.通過YAML配置文件方式創(chuàng)建

下面的例子cm-appvars.yaml描述了將幾個應(yīng)用所需的變量定義為ConfigMap的用法:

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

執(zhí)行kubectl create命令創(chuàng)建該ConfigMap:

    $kubectl create -f cm-appvars.yaml
    configmap "cm-appvars" created

查看創(chuàng)建好的ConfigMap:

    # kubectl get configmap
    NAME           DATA      AGE
    cm-appvars     2         3s

    # kubectl describe configmap cm-appvars
    Name:           cm-appvars
    Namespace:      default
    Labels:         <none>
    Annotations:    <none>

    Data
    ====
    appdatadir:     9 bytes
    apploglevel:    4 bytes

    # kubectl get configmap cm-appvars -o yaml
    apiVersion: v1
    data:
      appdatadir: /var/data
      apploglevel: info
    kind: ConfigMap
    metadata:
      creationTimestamp: 2016-07-28T19:57:16Z
      name: cm-appvars
      namespace: default
      resourceVersion: "78709"
      selfLink: /api/v1/namespaces/default/configmaps/cm-appvars
      uid: 7bb2e9c0-54fd-11e6-9dcd-000c29dc2102

下面的例子cm-appconfigfiles.yaml描述了將兩個配置文件server.xml和logging.properties定義為ConfigMap的用法,設(shè)置key為配置文件的別名,value則是配置文件的全部文本內(nèi)容:

        cm-appconfigfiles.yaml
        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"

執(zhí)行kubectl create命令創(chuàng)建該ConfigMap:

        $kubectl create -f cm-appconfigfiles.yaml
        configmap "cm-appconfigfiles" created

查看創(chuàng)建好的ConfigMap:

        # kubectl get configmap cm-appconfigfiles
        NAME                DATA      AGE
        cm-appconfigfiles   2         14s

        # kubectl describe configmap cm-appconfigfiles
        Name:           cm-appconfigfiles
        Namespace:      default
        Labels:         <none>
        Annotations:    <none>

        Data
        ====
        key-loggingproperties:  1809 bytes
        key-serverxml:          1686 bytes

查看已創(chuàng)建的ConfigMap的詳細內(nèi)容,可以看到兩個配置文件的全文:

        # kubectl get configmap cm-appconfigfiles -o yaml
        apiVersion: v1
        data:
          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"
          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>
        kind: ConfigMap
        metadata:
          creationTimestamp: 2016-07-29T00:52:18Z
          name: cm-appconfigfiles
          namespace: default
          resourceVersion: "85054"
          selfLink: /api/v1/namespaces/default/configmaps/cm-appconfigfiles
          uid: b30d5019-5526-11e6-9dcd-000c29dc2102

2.通過kubectl命令行方式創(chuàng)建

不使用YAML文件,直接通過kubectl create configmap也可以創(chuàng)建ConfigMap,可以使用參數(shù)--from-file或--from-literal指定內(nèi)容,并且可以在一行命令中指定多個參數(shù)。

(1)通過--from-file參數(shù)從文件中進行創(chuàng)建,可以指定key的名稱,也可以在一個命令行中創(chuàng)建包含多個key的ConfigMap,語法為:

        # kubectl create configmap NAME --from-file=[key=]source
    --from-file=[key=]source

(2)通過--from-file參數(shù)從目錄中進行創(chuàng)建,該目錄下的每個配置文件名都被設(shè)置為key,文件的內(nèi)容被設(shè)置為value,語法為:

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

(3)使用--from-literal時會從文本中進行創(chuàng)建,直接將指定的key#=value#創(chuàng)建為ConfigMap的內(nèi)容,語法為:

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

下面對這幾種用法舉例說明。

例如,在當前目錄下含有配置文件server.xml,可以創(chuàng)建一個包含該文件內(nèi)容的ConfigMap:

        # kubectl create configmap cm-server.xml --from-file=server.xml
        configmap "cm-server.xml" created

        # kubectl describe configmap cm-server.xml
        Name:           cm-server.xml
        Namespace:      default
        Labels:         <none>
        Annotations:    <none>

        Data
        ====
        server.xml:     6458 bytes

假設(shè)在configfiles目錄下包含兩個配置文件server.xml和logging.properties,創(chuàng)建一個包含這兩個文件內(nèi)容的ConfigMap:

        # kubectl create configmap cm-appconf --from-file=configfiles
        configmap "cm-appconf" created

        # kubectl describe configmap cm-appconf
        Name:           cm-appconf
        Namespace:      default
        Labels:         <none>
        Annotations:    <none>
        Data
        ====
        logging.properties:     3354 bytes
        server.xml:             6458 bytes

使用--from-literal參數(shù)進行創(chuàng)建的示例如下:

        # kubectl create configmap cm-appenv --from-literal=loglevel=info
    --from-literal =appdatadir=/var/data
        configmap "cm-appenv" created

        # kubectl  describe configmap cm-appenv
        Name:           cm-appenv
        Namespace:      default
        Labels:         <none>
        Annotations:    <none>

        Data
        ====
        appdatadir:     9 bytes
        loglevel:       4 bytes

容器應(yīng)用對ConfigMap的使用有以下兩種方法。

(1)通過環(huán)境變量獲取ConfigMap中的內(nèi)容。

(2)通過Volume掛載的方式將ConfigMap中的內(nèi)容掛載為容器內(nèi)部的文件或目錄。

3.5.3 在Pod中使用ConfigMap

1.通過環(huán)境變量方式使用ConfigMap

以前面創(chuàng)建的ConfigMap“cm-appvars”為例:

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

在Pod“cm-test-pod”的定義中,將ConfigMap“cm-appvars”中的內(nèi)容以環(huán)境變量(APPLOGLEVEL和APPDATADIR)方式設(shè)置為容器內(nèi)部的環(huán)境變量,容器的啟動命令將顯示這兩個環(huán)境變量的值("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             # 定義環(huán)境變量的名稱
                valueFrom:                     # key“apploglevel”對應(yīng)的值
                configMapKeyRef:
                  name: cm-appvars          # 環(huán)境變量的值取自cm-appvars:
                  key: apploglevel          # key為apploglevel
              - name: APPDATADIR              # 定義環(huán)境變量的名稱
                valueFrom:                     # key“appdatadir”對應(yīng)的值
                configMapKeyRef:
                  name: cm-appvars          # 環(huán)境變量的值取自cm-appvars
                  key: appdatadir           # key為appdatadir
            restartPolicy: Never

使用kubectl create -f命令創(chuàng)建該Pod,由于是測試Pod,所以該Pod在執(zhí)行完啟動命令后將會退出,并且不會被系統(tǒng)自動重啟(restartPolicy=Never):

          # kubectl create -f cm-test-pod.yaml
          pod "cm-test-pod" created

使用kubectl get pods --show-all查看已經(jīng)停止的Pod:

          # kubectl get pods --show-all
          NAME                READY     STATUS        RESTARTS   AGE
          cm-test-pod         0/1       Completed     0          8s

查看該Pod的日志,可以看到啟動命令“env | grep APP”的執(zhí)行結(jié)果如下:

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

說明容器內(nèi)部的環(huán)境變量使用ConfigMap cm-appvars中的值進行了正確設(shè)置。

Kubernetes從1.6版本開始,引入了一個新的字段envFrom,實現(xiàn)了在Pod環(huán)境中將ConfigMap(也可用于Secret資源對象)中所有定義的key=value自動生成為環(huán)境變量:

        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      # 根據(jù)cm-appvars中的key=value自動生成環(huán)境變量
          restartPolicy: Never

通過這個定義,在容器內(nèi)部將會生成如下環(huán)境變量:

        apploglevel=info
        appdatadir=/var/data

需要說明的是,環(huán)境變量的名稱受POSIX命名規(guī)范([a-zA-Z_][a-zA-Z0-9_]*)約束,不能以數(shù)字開頭。如果包含非法字符,則系統(tǒng)將跳過該條環(huán)境變量的創(chuàng)建,并記錄一個Event來提示環(huán)境變量無法生成,但并不阻止Pod的啟動。

2.通過volumeMount使用ConfigMap

在如下所示的cm-appconfigfiles.yaml例子中包含兩個配置文件的定義:server.xml和logging.properties。

        cm-appconfigfiles.yaml
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: cm-serverxml
        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"

在Pod“cm-test-app”的定義中,將ConfigMap“cm-appconfigfiles”中的內(nèi)容以文件的形式mount到容器內(nèi)部的/configfiles目錄下。Pod配置文件cm-test-app.yaml的內(nèi)容如下:

        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           # 掛載到容器內(nèi)的目錄
          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文件名進行掛載

創(chuàng)建該Pod:

        # kubectl create -f cm-test-app.yaml
        pod "cm-test-app" created

登錄容器,查看到在/configfiles目錄下存在server.xml和logging.properties文件,它們的內(nèi)容就是ConfigMap“cm-appconfigfiles”中兩個key定義的內(nèi)容:

        # kubectl exec -ti cm-test-app -- bash
        root@cm-test-app:/# cat /configfiles/server.xml
        <?xml version='1.0' encoding='utf-8'?>
        <Server port="8005" shutdown="SHUTDOWN">
        ......

        root@cm-test-app:/# cat /configfiles/logging.properties
        handlers = 1catalina.org.apache.juli.AsyncFileHandler,
    2localhost.org.apache.juli.AsyncFileHandler,
    3manager.org.apache.juli.AsyncFileHandler,
    4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler
        ......

如果在引用ConfigMap時不指定items,則使用volumeMount方式在容器內(nèi)的目錄下為每個item都生成一個文件名為key的文件。

Pod配置文件cm-test-app.yaml的內(nèi)容如下:

        apiVersion: v1
        kind: Pod
        metadata:
          name: cm-test-app
        spec:
          containers:
          - name: cm-test-app
            image: kubeguide/tomcat-app:v1
            imagePullPolicy: Never
            ports:
            - containerPort: 8080
            volumeMounts:
            - name: serverxml               # 引用Volume的名稱
              mountPath: /configfiles      # 掛載到容器內(nèi)的目錄
          volumes:
          - name: serverxml                 # 定義Volume的名稱
            configMap:
              name: cm-appconfigfiles      # 使用ConfigMap“cm-appconfigfiles”

創(chuàng)建該Pod:

        # kubectl create -f cm-test-app.yaml
        pod "cm-test-app" created

登錄容器,查看到在/configfiles目錄下存在key-loggingproperties和key-serverxml文件,文件的名稱來自在ConfigMap cm-appconfigfiles中定義的兩個key的名稱,文件的內(nèi)容則為value的內(nèi)容:

        # ls /configfiles
        key-loggingproperties  key-serverxml

3.5.4 使用ConfigMap的限制條件

使用ConfigMap的限制條件如下。

◎ ConfigMap必須在Pod之前創(chuàng)建。

◎ ConfigMap受Namespace限制,只有處于相同Namespace中的Pod才可以引用它。

◎ ConfigMap中的配額管理還未能實現(xiàn)。

◎ kubelet只支持可以被API Server管理的Pod使用ConfigMap。kubelet在本Node上通過--manifest-url或--config自動創(chuàng)建的靜態(tài)Pod將無法引用ConfigMap。

◎ 在Pod對ConfigMap進行掛載(volumeMount)操作時,在容器內(nèi)部只能掛載為“目錄”,無法掛載為“文件”。在掛載到容器內(nèi)部后,在目錄下將包含ConfigMap定義的每個item,如果在該目錄下原來還有其他文件,則容器內(nèi)的該目錄將被掛載的ConfigMap覆蓋。如果應(yīng)用程序需要保留原來的其他文件,則需要進行額外的處理。可以將ConfigMap掛載到容器內(nèi)部的臨時目錄,再通過啟動腳本將配置文件復(fù)制或者鏈接到(cp或link命令)應(yīng)用所用的實際配置目錄下。

主站蜘蛛池模板: 贵德县| 金华市| 逊克县| 微博| 厦门市| 阳春市| 凤翔县| 阿拉善盟| 什邡市| 金沙县| 拜城县| 都兰县| 通辽市| 琼海市| 钦州市| 合水县| 新平| 清涧县| 六枝特区| 呼玛县| 五家渠市| 清水县| 湘阴县| 响水县| 黔南| 渭南市| 柘城县| 辽阳市| SHOW| 余庆县| 射阳县| 渝北区| 桦川县| 台北市| 永和县| 水富县| 屏东市| 襄樊市| 平乡县| 杭锦后旗| 远安县|