静态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 "%r" %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 "%r" %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 "%r" %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目录,是启动不起来的