kubernetes Pod-02 静态Pod及配置

93 阅读5分钟

静态Pod

静态Pod是Kubernetes集群中一种特殊的Pod类型,它们不是通过集群的API服务器创建和管理的,而是由运行在每个Node上的kubelet守护进程直接管理

创建静态Pod两种方式:配置文件方式和HTTP方式。

配置文件方式

# 配置文件 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 中配置静态pod的yaml文件路径

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests"
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS $KUBELET_SYSTEM_PODS_ARGS

创建yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    name: static-web
spec:
  containers:
  - name: static-web
    image: nginx
    ports:
    - name: web
      containerPort: 80

复制文件到指定工作节点的 /etc/kubernetes/manifests 目录下

scp 03.yaml node1:/etc/kubernetes/manifests

等待一会儿,本节点中将会创建Pod

# 等待一会儿,本节点中将会创建Pod
[root@master1 ~]# kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
# 查询 pod
[root@master1 ~]# kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
static-web-node1   1/1     Running   0          2m39s

在Master节点可以看到该Pod,但是不能删除

# 删除 pod
[root@master1 ~]# kubectl delete pod static-web-node1
pod "static-web-node1" deleted

[root@master1 ~]# kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
static-web-node1   1/1     Running   0          93s

删除静态Pod只能到该静态Pod所在节点,删除yaml文件

# 删除文件
rm /etc/kubernetes/manifests/03.yaml

# 查看 pod
[root@master1 ~]# kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE

http方式

设置--manifest-url,kubelet会定期从该URL地址下载Pod定义文件,并创建Pod。

容器共享Volume

同一个Pod中多个容器之间共享Pod级别的存储卷,将Volume挂载为容器内部

apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  - name: busybox
    image: busybox
    command: ["sh","-c","tail -f /logs/catalina*.log"]
    volumeMounts:
    - name: app-logs
      mountPath: /logs
  volumes:
  - name: app-logs
    emptyDir: {}

Volume名为app-logs,类型为emptyDir,将该存储卷挂载到容器内的/usr/local/tomcat/logs中,同时也挂载进容器busybox的/logs中。这样Tomcat启动时将日志写入到/usr/local/tomcat/logs文件夹中,busybox容器就可以读取到了。容器busybox启动命令为:tail -f /logs/catalina .log。这个命令是读取 catalina.log 文件,打印到控制台。

创建Pod并查询结果

# 创建 Pod
[root@master1 pod]# kubectl apply -f 01.yaml
pod/volume-pod created

# 查询结果
[root@master1 pod]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
volume-pod   2/2     Running   0          116s

查看 busybox 日志

[root@master1 pod]# kubectl logs volume-pod -c busybox
05-Mar-2024 13:12:09.116 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
05-Mar-2024 13:12:09.120 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
05-Mar-2024 13:12:09.120 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
05-Mar-2024 13:12:09.123 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
05-Mar-2024 13:12:09.437 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
05-Mar-2024 13:12:09.457 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [545] milliseconds
05-Mar-2024 13:12:09.545 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
05-Mar-2024 13:12:09.545 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
05-Mar-2024 13:12:09.555 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
05-Mar-2024 13:12:09.566 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [107] milliseconds

这个内容是tomcat生成的日志文件(catalina.2024-03-05.log),我们可以到tomcat容器中进行查看。

[root@master1 pod]# kubectl exec -it volume-pod -c tomcat -- ls /usr/local/tomcat/logs -al
total 8
drwxrwxrwx 2 root root   80 Mar  5 13:12 .
drwxr-xr-x 1 root root   18 Dec 22  2021 ..
-rw-r----- 1 root root 4962 Mar  5 13:12 catalina.2024-03-05.log
-rw-r----- 1 root root    0 Mar  5 13:12 localhost_access_log.2024-03-05.txt

文件内容可以通过命令进行查看

[root@master1 pod]# kubectl exec -it volume-pod -c tomcat -- tail /usr/local/tomcat/logs/catalina.2024-03-05.log
05-Mar-2024 13:12:09.116 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
05-Mar-2024 13:12:09.120 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
05-Mar-2024 13:12:09.120 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
05-Mar-2024 13:12:09.123 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
05-Mar-2024 13:12:09.437 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
05-Mar-2024 13:12:09.457 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [545] milliseconds
05-Mar-2024 13:12:09.545 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
05-Mar-2024 13:12:09.545 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
05-Mar-2024 13:12:09.555 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
05-Mar-2024 13:12:09.566 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [107] milliseconds

配置管理

应用部署最佳实践是程序和配置分离,这样程序可以更好的复用。应用程序打成镜像后可以用个环境变量或者是挂载文件的方式注入,kubernetes 1.2引入ConfigMap资源。 ConfigMap提供给容器使用的方法:

  • 生成为容器内的环境变量
  • 设置容器启动命令参数
  • 以volume挂载到容器内部

ConfigMap的结构为key:value,可以是一个变量(createdUser=huo-l),也可以是一个文件(server.xml=<?xml...>...)。

创建ConfigMap两种方式:

  • yaml文件方式
  • 命令方式:kubectl create configmap
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-appvars
data:
  apploglevel: info
  appdatadir: /var/dat

创建并查看结果

[root@master1 pod]# kubectl apply -f 02.yaml
configmap/cm-appvars created

[root@master1 pod]# kubectl get cm
NAME               DATA   AGE
cm-appvars         2      62s

[root@master1 pod]# kubectl describe cm cm-appvars
Name:         cm-appvars
Namespace:    pod-ns
Labels:       <none>
Annotations:  <none>

Data
====
apploglevel:
----
info
appdatadir:
----
/var/data
Events:  <none>

查看详情

[root@master1 pod]# kubectl describe cm cm-appvars
Name:         cm-appvars
Namespace:    pod-ns
Labels:       <none>
Annotations:  <none>

Data
====
apploglevel:
----
info
appdatadir:
----
/var/data
Events:  <none>
[root@master1 pod]# ^C
You have new mail in /var/spool/mail/root
[root@master1 pod]# kubectl get cm cm-appvars -o yaml
apiVersion: v1
data:
  appdatadir: /var/data
  apploglevel: info
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"appdatadir":"/var/data","apploglevel":"info"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm-appvars","namespace":"pod-ns"}}
  creationTimestamp: "2024-03-05T13:31:03Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:appdatadir: {}
        f:apploglevel: {}
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
    manager: kubectl-client-side-apply
    operation: Update
    time: "2024-03-05T13:31:03Z"
  name: cm-appvars
  namespace: pod-ns
  resourceVersion: "12399"
  uid: 3f148526-95ca-4eda-bec5-60fdf60071e1

通过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"

运行并查看结果

[root@master1 pod]# kubectl apply -f 03.yaml
configmap/cm-appconfigfiles created

[root@master1 pod]# kubectl get cm
NAME                DATA   AGE
cm-appconfigfiles   2      43s

[root@master1 pod]# kubectl get cm -o yaml
apiVersion: v1
items:
- 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:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"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":"\u003c?xml version='1.0' encoding='utf-8'?\u003e\n\u003cServer port=\"8005\" shutdown=\"SHUTDOWN\"\u003e\n  \u003cListener className=\"org.apache.catalina.startup.VersionLoggerListener\" /\u003e\n  \u003cListener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" /\u003e\n  \u003cListener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" /\u003e\n  \u003cListener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" /\u003e\n  \u003cListener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" /\u003e\n  \u003cGlobalNamingResources\u003e\n    \u003cResource name=\"UserDatabase\" auth=\"Container\"\n              type=\"org.apache.catalina.UserDatabase\"\n              description=\"User database that can be updated and saved\"\n              factory=\"org.apache.catalina.users.MemoryUserDatabaseFactory\"\n              pathname=\"conf/tomcat-users.xml\" /\u003e\n  \u003c/GlobalNamingResources\u003e\n\n  \u003cService name=\"Catalina\"\u003e\n    \u003cConnector port=\"8080\" protocol=\"HTTP/1.1\"\n               connectionTimeout=\"20000\"\n               redirectPort=\"8443\" /\u003e\n    \u003cConnector port=\"8009\" protocol=\"AJP/1.3\" redirectPort=\"8443\" /\u003e\n    \u003cEngine name=\"Catalina\" defaultHost=\"localhost\"\u003e\n      \u003cRealm className=\"org.apache.catalina.realm.LockOutRealm\"\u003e\n        \u003cRealm className=\"org.apache.catalina.realm.UserDatabaseRealm\"\n               resourceName=\"UserDatabase\"/\u003e\n      \u003c/Realm\u003e\n      \u003cHost name=\"localhost\"  appBase=\"webapps\"\n            unpackWARs=\"true\" autoDeploy=\"true\"\u003e\n        \u003cValve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\"\n               prefix=\"localhost_access_log\" suffix=\".txt\"\n               pattern=\"%h %l %u %t \u0026quot;%r\u0026quot; %s %b\" /\u003e\n\n      \u003c/Host\u003e\n    \u003c/Engine\u003e\n  \u003c/Service\u003e\n\u003c/Server\u003e\n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm-appconfigfiles","namespace":"pod-ns"}}
    creationTimestamp: "2024-03-05T13:35:50Z"
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:data:
          .: {}
          f:key-loggingproperties: {}
          f:key-serverxml: {}
        f:metadata:
          f:annotations:
            .: {}
            f:kubectl.kubernetes.io/last-applied-configuration: {}
      manager: kubectl-client-side-apply
      operation: Update
      time: "2024-03-05T13:35:50Z"
    name: cm-appconfigfiles
    namespace: pod-ns
    resourceVersion: "12829"
    uid: 5857a760-620c-4c56-92c5-48b49207d679
- apiVersion: v1
  data:
    appdatadir: /var/data
    apploglevel: info
  kind: ConfigMap
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","data":{"appdatadir":"/var/data","apploglevel":"info"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"cm-appvars","namespace":"pod-ns"}}
    creationTimestamp: "2024-03-05T13:31:03Z"
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:data:
          .: {}
          f:appdatadir: {}
          f:apploglevel: {}
        f:metadata:
          f:annotations:
            .: {}
            f:kubectl.kubernetes.io/last-applied-configuration: {}
      manager: kubectl-client-side-apply
      operation: Update
      time: "2024-03-05T13:31:03Z"
    name: cm-appvars
    namespace: pod-ns
    resourceVersion: "12399"
    uid: 3f148526-95ca-4eda-bec5-60fdf60071e1
- apiVersion: v1
  data:
    ca.crt: |
      -----BEGIN CERTIFICATE-----
      MIIC5zCCAc+gAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl
      cm5ldGVzMB4XDTI0MDMwNDEzMjIxOVoXDTM0MDMwMjEzMjIxOVowFTETMBEGA1UE
      AxMKa3ViZXJuZXRlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALSb
      K2TkbK2oea22dvCr/OXdelSRESKiIAf9xxmBEhLL3g6hNTYlwGSOsaJXljC7otBP
      0P0ikrU3Xxvk8jNISPBNxtQ6n3vFvJdREnpsSPEesYvhsonJCexZFpPyRN39wZJF
      8ZsvQn3OQ1K36KV7+Sse5QijOOFrY6SqodjK27cVcHk9Ul3jBTrTe9zeoA3PFnuP
      r44FUlxiEoqGhcdXBVwAbmzN7trKDdT0CjxwHlgHSHoGenxhr/U8AyrNBCVyzNiy
      xmTrtY1ulhSc/n8zBVvm93M22/XN1LjLZQsClMgbiTyOzOToDOqvHfTynckgJO+f
      N7dEw6XA/pe3pZuCTqECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgKkMA8GA1UdEwEB
      /wQFMAMBAf8wHQYDVR0OBBYEFGto01v4rfUmU77QQMxQTqWsZjqAMA0GCSqGSIb3
      DQEBCwUAA4IBAQBlbaDOCnxXMGCu/Vv6krqdgbOkZ0x1NL9DHwpE1bHmb82UUv1G
      snQIVzmUCY6Rp8F8Vvyv68w7SmwXo31RnRA+B1NqqiK1/cr2+ygHeybKMtIIBRHI
      GMktvXYVzEHH3dniAOpGm8ei97JkRDZhKI/R2RuV/yay6vYKA9gY6kDwYRc0o/Q9
      WgHZ23Md+n/PXRAFnVon0N1ywbPAKDNeayfEobn6di9VQYc1p5uLVifUJt64h653
      APO1N6A8YfoFa+kCjZuZkXq7i3Irhexj/oRYKneF+MZwu/Wi3j3xCZkn2dKo7MBl
      MaGaRRcRcNIpSAgUsnNAk8RAAQEtUesKoM4S
      -----END CERTIFICATE-----
  kind: ConfigMap
  metadata:
    creationTimestamp: "2024-03-05T13:09:57Z"
    managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
      fieldsV1:
        f:data:
          .: {}
          f:ca.crt: {}
      manager: kube-controller-manager
      operation: Update
      time: "2024-03-05T13:09:57Z"
    name: kube-root-ca.crt
    namespace: pod-ns
    resourceVersion: "10469"
    uid: 9a350e26-b18e-46ac-9a5b-62862fcf6780
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

创建Pod,将如上的ConfigMap挂载到容器的/configfiles目录下

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
      mountPath: /configfiles
  volumes:
  - name: serverxml
    configMap:
      name: cm-appconfigfiles
      items:
      - key: key-serverxml
        path: serverxml
      - key: key-loggingproperties
        path: logging.properties

创建并查询结果

[root@master1 pod]# kubectl apply -f 04.yaml
pod/cm-test-app created

[root@master1 pod]# kubectl get pod
NAME          READY   STATUS    RESTARTS   AGE
cm-test-app   1/1     Running   0          41s

# 进入到容器中,查看容器的/connfigfiles目录下的内容
[root@master1 pod]#  kubectl exec -it cm-test-app /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.


# more 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>

如果在引用ConfigMap时,不知道items,则在容器的目录下将挂载该ConfigMap的所有key的文件。

使用ConfigMap的限制:

  • ConfigMap必须在Pod创建之前创建。
  • ConfigMap有Namespace限制。
  • kebelet只支持API Server管理的Pod使用ConfigMap,不支持静态Pod。
  • Pod挂载ConfigMap,只支持挂载目录,如果挂载的目录下有其他的文件,整个目录将被覆盖。例如,如果挂载到容器的/etc目录,那么整个容器启动将会失败。因为容器没有/etc目录,是启动不起来的