Kubernetes中Pod介绍

news/2024/10/22 13:48:41/

Kubernetes中Pod介绍

1、Pod介绍

Pod 是 kubernetes 最重要的基本概念,每个 Pod 都有一个特殊的被称为根容器的 Pause 容器。Pause 容器对应

的镜像属于 kubernetes 平台的一部分,除了 Pause 容器,每个 Pod 还包含一个或多个紧密相关的用户业务容

器,Pod的组成如下所示。

在这里插入图片描述

为什么 kubernetes 会设计出一个全新的 Pod 的概念并且 Pod 有这样特殊的组成结构?

原因之一:在一组容器作为一个单元的情况下,我们难以简单地对整体进行判断及有效地行动。比如,一个容器

死亡了,此时算是整体死亡么? 是N/M的死亡率么? 引入业务无关并且不易死亡的 Pause 容器作为 Pod 的根容

器,以它的状态代表整个容器组的状态,就简单、巧妙地解决了这个难题。

原因之二:Pod 里的多个业务容器共享 Pause 容器的 IP,共享 Pause 容器挂接的 Volume,这样既简化了密切关

联的业务容器之间的通信问题,也很好地解决了它们之间的文件共享问题。

kubernetes 为每个 Pod 都分配了唯一的 IP 地址,称之为 Pod IP,一个 Pod 里的多个容器共享 Pod IP 地址。

kubernetes 要求底层网络支持集群内任意两个 Pod 之间的 TCP/IP 直接通信,这通常采用虚拟二层网络技术来实

现,例如 Flannel、Open vSwitch 等,因此我们需要牢记一点:在 kubernetes 里,一个 Pod 里的容器与另外主

机上的 Pod 容器能够直接通信。

Pod 其实有两种类型:普通的 Pod 及静态 Pod(Static Pod)。后者比较特殊,它并没被存放在 kubernetes 的 etcd

存储里,而是被存放在某个具体的 Node 上的一个具体文件中,并且只在此 Node 上启动、运行。而普通的 Pod

一旦被创建,就会被放入 etcd 中存储,随后会被 kubernetes Master 调度到某个具体的 Node 上并进行绑定,随

后该 Pod 被对应的 Node 上的 kubelet 进程实例化成一组相关的 Docker 容器并启动。在默认情况下,当 Pod 里

的某个容器停止时,kubernetes 会自动检测到这个问题并且重新启动这个 Pod (重启 Pod 里的所有容器),如果

Pod 所在的 Node 宕机,就会将这个 Node 上的所有 Pod 重新调度到其他节点上。Pod、容器与 Node 的关系如

下所示。

在这里插入图片描述

kubernetes 里的所有资源对象都可以采用 YAML 或者 JSON 格式的文件来定义或描述。

2、Pod定义详解

YAML 格式的 Pod 定义文件的完整内容如下:

在这里插入图片描述

对各属性的详细说明如下所示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Kind 为 Pod 表明这是一个 Pod 的定义,metadata 里的 name 属性为 Pod 的名称,在 metadata 里还能定义资

源对象的标签。

Pod的 IP 加上这里的容器端口(containerPort),组成了一个新的概念—Endpoint,它代表此 Pod 里的一个服务进

程的对外通信地址。一个 Pod 也存在具有多个 Endpoint 的情况,比如当我们把 Tomcat 定义为一个 Pod 时,可

以对外暴露管理端口与服务端口这两个 Endpoint。

我们所熟悉的Docker Volume在kubernetes里也有对应的概念—Pod Volume,后者有一些扩展,比如可以用分布

式文件系统 GlusterFS 实现后端存储功能;Pod Volume 是被定义在 Pod 上,然后被各个容器挂载到自己的文件

系统中的。

3、Pod的基本用法

在对 Pod 的用法进行说明之前,有必要先对 Docker 容器中应用的运行要求进行说明。

在使用 Docker 时,可以使用 docker run 命令创建并启动一个容器。而在 Kubernetes 系统中对长时间运行容器

的要求是:其主程序需要一直在前台执行。如果我们创建的 Docker 镜像的启动命令是后台执行程序,例如 Linux

脚本:nohup ./start.sh,则在 kubelet 创建包含这个容器的 Pod 之后运行完该命令,即认为 Pod 执行结束,将

立刻销毁该 Pod。如果为该 Pod 定义了 ReplicationController,则系统会监控到该 Pod 已经终止,之后根据 RC

定义中 Pod 的 replicas 副本数量生成一个新的 Pod。一旦创建新的 Pod,就在执行完启动命令后陷入无限循环的

过程中。这就是 Kubernetes 需要我们自己创建的 Docker 镜像并以一个前台命令作为启动命令的原因。

对于无法改造为前台执行的应用,也可以使用开源工具 Supervisor 辅助进行前台运行的功能。Supervisor 提供了

一种可以同时启动多个后台应用,并保持 Supervisor 自身在前台执行的机制,可以满足 Kubernetes 对容器的启

动要求。关于 Supervisor 的安装和使用,请参考官网 http://supervisord.org 的文档说明。

下面对 Pod 对容器的封装和应用进行说明。

Pod 可以由 1 个或多个容器组合而成,下面的例子中,名为 frontend 的 Pod 只由一个容器组成。

配置文件 001-frontend.yaml 的内容:

apiVersion: v1
kind: Pod
metadata:name: frontendlabels:name: frontend
spec:containers:- name: frontendimage: kubeguide/guestbook-php-frontendenv:- name: GET_HOSTS_FROMvalue: envports:- containerPort: 80
[root@master cha3]# kubectl apply -f 001-frontend.yaml
pod/frontend created
[root@master cha3]# kubectl get pod
NAME       READY   STATUS    RESTARTS   AGE
frontend   1/1     Running   0          21s

这个 frontend Pod 在成功启动之后,将启动 1 个 Docker 容器。

另一种场景是,当 frontend 和 redis 两个容器应用为紧耦合的关系,并组合成一个整体对外提供服务时,应将这

两个容器打包为一个 Pod,如下所示。

在这里插入图片描述

配置文件 002-frontend-localredis-pod.yaml 的内容如下:

apiVersion: v1
kind: Pod
metadata:name: redis-phplabels:name: redis-php
spec:containers:- name: frontendimage: kubeguide/guestbook-php-frontend:localredisports:- containerPort: 80- name: redisimage: kubeguide/redis-masterports:- containerPort: 6379

属于同一个 Pod 的多个容器应用之间相互访问时仅需要通过 localhost 就可以通信,使得这一组容器被绑定在了

一个环境中。

运行 kubectl create 命令创建该 Pod:

[root@master cha3]# kubectl create -f 002-frontend-localredis-pod.yaml
pod/redis-php created

查看已经创建的 Pod:

[root@master cha3]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
frontend    1/1     Running   0          5m9s
redis-php   2/2     Running   0          19s

可以看到 READY 信息为 2/2,表示 Pod 中的两个容器都成功运行了。

查看这个 Pod 的详细信息,可以看到两个容器的定义及创建的过程( Event 事件信息):

[root@master cha3]# kubectl describe pod redis-php
Name:         redis-php
Namespace:    default
Priority:     0
Node:         slave2/192.168.21.202
Start Time:   Sun, 02 Jul 2023 10:03:41 +0800
Labels:       name=redis-php
Annotations:  <none>
Status:       Running
IP:           10.244.140.68
IPs:IP:  10.244.140.68
Containers:frontend:Container ID:   docker://9990568e9fcd1e0cfd375a444fc6fb013daa4df7dd5dccc0c33f2ffb83dcd2b4Image:          kubeguide/guestbook-php-frontend:localredisImage ID:       docker-pullable://kubeguide/guestbook-php-frontend@sha256:37c2c1dcfcf0a51bf9531430fe057bcb1d4b94c64048be40ff091f01e384f81ePort:           80/TCPHost Port:      0/TCPState:          RunningStarted:      Sun, 02 Jul 2023 10:03:42 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qkxd6 (ro)redis:Container ID:   docker://1244ef09f32b6e5f06c14c79fc0f979533cd3dca92020022e56e05ccf490f740Image:          kubeguide/redis-masterImage ID:       docker-pullable://kubeguide/redis-master@sha256:e11eae36476b02a195693689f88a325b30540f5c15adbf531caaecceb65f5b4dPort:           6379/TCPHost Port:      0/TCPState:          RunningStarted:      Sun, 02 Jul 2023 10:03:44 +0800Ready:          TrueRestart Count:  0Environment:    <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qkxd6 (ro)
Conditions:Type              StatusInitialized       TrueReady             TrueContainersReady   TruePodScheduled      True
Volumes:kube-api-access-qkxd6:Type:                    Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds:  3607ConfigMapName:           kube-root-ca.crtConfigMapOptional:       <nil>DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type    Reason     Age    From               Message----    ------     ----   ----               -------Normal  Scheduled  2m16s  default-scheduler  Successfully assigned default/redis-php to slave2Normal  Pulled     2m15s  kubelet            Container image "kubeguide/guestbook-php-frontend:localredis" already present on machineNormal  Created    2m15s  kubelet            Created container frontendNormal  Started    2m15s  kubelet            Started container frontendNormal  Pulling    2m15s  kubelet            Pulling image "kubeguide/redis-master"Normal  Pulled     2m13s  kubelet            Successfully pulled image "kubeguide/redis-master" in 1.795814295sNormal  Created    2m13s  kubelet            Created container redisNormal  Started    2m13s  kubelet            Started container redis

这里顺便提一下 kubernetes 的 Event 概念,Event 是一个事件的记录,记录了事件的最早产生时间、最后重现

时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event 通常会被关联到某个具体的资源对象

上,是排查故障的重要参考信息。当我们发现某个 Pod 迟迟无法创建时,可以用 kubectl describe pod xxxx 来查

看它的描述信息,以定位问题的成因,一个 Event 记录信息表明 Pod 里的一个容器被探针检测为失败一次。例

如:

Events:Type     Reason     Age   From               Message----     ------     ----  ----               -------Normal   Scheduled  21s   default-scheduler  Successfully assigned default/myweb to slave2Normal   Pulling    20s   kubelet            Pulling image "kubeguide/tomcat-app:v3"Warning  Failed     0s    kubelet            Failed to pull image "kubeguide/tomcat-app:v3": rpc error: code = Unknown desc = Error response from daemon: manifest for kubeguide/tomcat-app:v3 not found: manifest unknown: manifest unknownWarning  Failed     0s    kubelet            Error: ErrImagePull

4、静态Pod

静态 Pod 是由 kubelet 进行管理的仅存在于特定 Node 上的 Pod,它们不能通过 API Server 进行管理,无法与

ReplicationController、Deployment 或者 DaemonSet 进行关联,并且 kubelet 无法对它们进行健康检查。静态

Pod 总是由 kubelet 创建的,并且总在 kubelet 所在的 Node 上运行。

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

4.1 配置文件方式

首先需要时设定 kubelet 启动参数 --pod-manifest-path 或者在 kubelet 的配置文件中设定 staticPodPath

指定的路径是kubelet监控的路径(如果k8s集群由kubeadm搭建,那默认存储在录/etc/kubernetes/manifests

下),kubelet 会定期的扫描该目录下的 YAML/JSON 文件来创建/修改/删除静态 Pod。

注意:声明文件是标准的 Pod 定义文件,以 JSON 或者 YAML 格式存储在指定目录;kubelet 扫描目录的时候会

忽略以点开头的文件。

查看当前节点 kubelet 监控静态文件的路径。

使用 systemctl cat kubelet 命令查看通过 systemd 配置的与 kubelet 有关的所有配置文件的路径与内容。

[root@master ~]# systemctl cat kubelet
# /usr/lib/systemd/system/kubelet.service
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
Wants=network-online.target
After=network-online.target[Service]
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10[Install]
WantedBy=multi-user.target# /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/et
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS v
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user sho
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be so
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

通过查看配置文件 /var/lib/kubelet/config.yaml 可以当前节点 kubelet 监控静态文件的路径为:

/etc/kubernetes/manifests

[root@master cha3]# cat /var/lib/kubelet/config.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:anonymous:enabled: falsewebhook:cacheTTL: 0senabled: truex509:clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:mode: Webhookwebhook:cacheAuthorizedTTL: 0scacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests # 该路径
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
[root@master cha3]# ls /etc/kubernetes/manifests
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

在目录 /etc/kubernetes/manifests 中放入 003-static-web.yaml 文件,内容如下:

apiVersion: v1
kind: Pod
metadata:name: static-weblabels:name: static-web
spec:containers:- name: static-webimage: nginxports:- name: webcontainerPort: 80

等待一会儿,查看本机中已经启动的容器:

[root@master cha3]# docker ps | grep static-web
2162d73def94   nginx                                                 "/docker-entrypoint.…"   25 seconds ago      Up 25 seconds                                                  k8s_static-web_static-web-master_default_d281bcc9e1031be157468bab81ab2b96_0
59252476a5ef   registry.aliyuncs.com/google_containers/pause:3.4.1   "/pause"                 43 seconds ago      Up 41 seconds                                                  k8s_POD_static-web-master_default_d281bcc9e1031be157468bab81ab2b96_0

可以看到一个 Nginx 容器已经被 kubelet 成功创建了出来。

到 Master 上查看 Pod 列表,可以看到这个 static pod:

[root@master cha3]# kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
frontend            1/1     Running   0          53m
redis-php           2/2     Running   0          48m
static-web-master   1/1     Running   0          88s # 该pod

修改 Static Pod 直接修改当前节点 kubelet 监控静态文件的目录下 Pod 声明文件即可自动修改静态Pod配置。

由于静态 Pod 无法通过 API Server 直接管理,所以在 Master 上尝试删除这个 Pod 时,会使其变成 Pending 状

态,且不会被删除。

[root@master cha3]# kubectl delete pod static-web-master
pod "static-web-master" deleted
[root@master cha3]# kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
frontend            1/1     Running   0          55m
redis-php           2/2     Running   0          50m
static-web-master   0/1     Pending   0          4s

过一会 kubelet 会自动重启 Pod:

[root@master cha3]# kubectl get pods
NAME                READY   STATUS    RESTARTS   AGE
frontend            1/1     Running   0          56m
redis-php           2/2     Running   0          51m
static-web-master   1/1     Running   0          49s

删除该 Pod 的操作只能是到其所在节点上将其定义文件 003-static-web.yaml

/etc/kubernetes/manifests目录下删除。

[root@master cha3]# rm -f /etc/kubernetes/manifests/003-static-web.yaml

再次查看 Pod:

[root@master cha3]# kubectl get pods
NAME        READY   STATUS    RESTARTS   AGE
frontend    1/1     Running   0          58m
redis-php   2/2     Running   0          53m

4.2 HTTP方式

通过设置 kubelet 的启动参数 --manifest-url,kubelet 将会定期从该 URL 地址下载 Pod 的定义文件,并

以 .yaml 或 .json 文件的格式进行解析,然后创建 Pod,其实现方式与配置文件方式是一致的。

Environment="KUBELET_SYSTEM_PODS_ARGS=--manifest-url=<manifest-url>"

重启节点 kubelet 服务使配置生效:

systemctl daemon-reload
systemctl restart kubelet

5、Pod容器共享Volume

同一个 Pod 中的多个容器能够共享 Pod 级别的存储卷 Volume。Volume 可以被定义为各种类型,多个容器各自

进行挂载操作,将一个 Volume 挂载为容器内部需要的目录,如下所示。

在这里插入图片描述

在下面的例子中,在 Pod 内包含两个容器:tomcat 和 busybox,在 Pod 级别设置 Volume “app-logs”,用于

tomcat 向其中写日志文件,busybox 读日志文件。

配置文件 004-pod-volume-applogs.yaml 的内容如下:

apiVersion: v1
kind: Pod
metadata:name: volume-pod
spec:containers:- name: tomcatimage: tomcatports:- containerPort: 8080volumeMounts:- name: app-logsmountPath: /usr/local/tomcat/logs- name: busyboximage: busyboxcommand: ["sh", "-c", "tail -f /logs/catalina*.log"]volumeMounts:- name: app-logsmountPath: /logsvolumes:- name: app-logsemptyDir: {}
[root@master cha3]# kubectl create -f 004-pod-volume-applogs.yaml
pod/volume-pod created[root@master cha3]# kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
frontend     1/1     Running   0          79m
redis-php    2/2     Running   0          74m
volume-pod   2/2     Running   0          50s

这里设置的 Volume 名为 app-logs,类型为 emptyDir,也可以设置为其他类型,挂载到 tomcat 容器内的

/usr/local/tomcat/logs 目录,同时挂载到 logreader 容器内的 /logs 目录。

tomcat 容器在启动后会向 /usr/local/tomcat/logs 目录写文件,logreader 容器就可以读取其中的文件了。

logreader 容器的启动命令为 tail -f /logs/catalina*.log,我们可以通过 kubectl logs 命令查看

logreader 容器的输出内容:

[root@master cha3]# kubectl logs volume-pod -c busybox
02-Jul-2023 03:17:28.766 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
02-Jul-2023 03:17:28.785 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
02-Jul-2023 03:17:29.134 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.157 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [731] milliseconds
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
02-Jul-2023 03:17:29.254 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.263 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [105] milliseconds

这个文件为 tomcat 生成的日志文件 /usr/local/tomcat/logs/catalina.<date>.log 的内容。登录 tomcat

容器进行查看:

[root@master cha3]# kubectl exec -ti volume-pod -c tomcat -- /bin/bash
root@volume-pod:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@volume-pod:/usr/local/tomcat#
root@volume-pod:/usr/local/tomcat# ls logs
catalina.2023-07-02.log  localhost_access_log.2023-07-02.txt
root@volume-pod:/usr/local/tomcat# exit
exit
[root@master cha3]# kubectl exec -ti volume-pod -c tomcat -- ls /usr/local/tomcat/logs
catalina.2023-07-02.log  localhost_access_log.2023-07-02.txt
[root@master cha3]# kubectl exec -ti volume-pod -c tomcat -- tail /usr/local/tomcat/logs/catalina.2023-07-02.log
02-Jul-2023 03:17:28.766 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
02-Jul-2023 03:17:28.785 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
02-Jul-2023 03:17:29.134 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.157 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [731] milliseconds
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
02-Jul-2023 03:17:29.254 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.263 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [105] milliseconds

查看 busybox:

[root@master cha3]# kubectl exec -ti volume-pod -c busybox -- ls
bin   dev   etc   home  logs  proc  root  sys   tmp   usr   var
[root@master cha3]# kubectl exec -ti volume-pod -c busybox -- ls logs
catalina.2023-07-02.log              localhost_access_log.2023-07-02.txt
[root@master cha3]# kubectl exec -ti volume-pod -c busybox -- tail /logs/catalina.2023-07-02.log
02-Jul-2023 03:17:28.766 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
02-Jul-2023 03:17:28.781 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
02-Jul-2023 03:17:28.785 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
02-Jul-2023 03:17:29.134 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.157 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [731] milliseconds
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
02-Jul-2023 03:17:29.243 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
02-Jul-2023 03:17:29.254 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
02-Jul-2023 03:17:29.263 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [105] milliseconds

6、总结

本节最后给出 Pod 及 Pod 周边对象的示意图作为总结,如下所示,后面部分还会涉及这张图里的对象和概念,

以进一步加强理解。

在这里插入图片描述


http://www.ppmy.cn/news/703777.html

相关文章

2015百度沸点榜单

2015年度百度沸点热搜榜单&#xff0c;这份由百度6亿用户历时一年&#xff0c;用搜索行为“投票”决选出来的最终榜单&#xff0c;直观地呈现了2015年网民关注热点。榜单显示&#xff0c;2015年度&#xff0c;网民最关注的事件是大阅兵&#xff0c;最火的电视剧是花千骨&#x…

Summary

感觉NOI之前肯定来不及把所有的题都一个个发成题解了。。 把做过的题随便溜一遍吧。。。。 这两天还会更新一大波内容 网络流&#xff1a; 1.和时间有关的问题&#xff1a;按照时间拆点&#xff0c;分层图 BZOJ1189 紧急疏散 SD二轮集训D3T3 第三题 BZOJ1570 Blue Mary的…

「题单」网络流『最大流/最小割』

由于最大流最小割 这里不另起一博客 但会标记 模板/假模板 洛谷P1343 地震逃生『提高/省选-』『最大流』 题解洛谷P2740 [USACO4.2]草地排水Drainage Ditches『提高/省选-』『最大流』洛谷P2936 [USACO09JAN]全流Total Flow『提高/省选-』『最大流』洛谷P3376 【模板】网络最大…

装了 Linux 之后就感到迷茫、不知该干什么的朋友看过来

很多朋友装了 Linux&#xff0c;看着全新的菜单样式、陌生的程序&#xff0c;一下子脑袋就空了&#xff08;特别是系统未安装中文语言支持时&#xff09;&#xff0c;不知该干点什么&#xff0c;于是一种强烈的想法涌上心头——还是先回瘟到死玩一会儿游戏再说吧~ 在这&#x…

《科技之巅3》读书笔记

文章目录 书籍信息人工智能&#xff0c;“吃一堑长一智”的机器人机交互&#xff0c;为解决“交流障碍”问题而生硬件与算法&#xff0c;好马还需好鞍模式创新&#xff0c;赋予技术新的定义云与数据共享&#xff0c;灵活应对信息的爆发式增长“机器人”&#xff0c;从电影和小说…

如何通过用户场景分析挖掘需求痛点?4大角度

在我们日常需求分析过程中&#xff0c;往往忽视对用户场景的深入分析和挖掘&#xff0c;造成伪需求和需求缺失等问题。 而真正的用户需求&#xff0c;只有在对应的应用场景下才会真正呈现出来。因此我们需要重视对用户场景分析&#xff0c;深入挖掘用户需求痛点。而在对用户场景…

[Unity2D入门教程]简单制作仿植物大战僵尸游戏之①搭建场景

布置场景&#xff1a; 众所周知&#xff0c;植物大战僵尸非常好玩&#xff0c;所以我们来制作一款类似的&#xff0c;名字就叫Glitch Garden。 布置场景需要用到很多素材&#xff0c;这里我们在GitHub中找到一位老师的素材并把需要的导入到project面板中 GitHub - CompleteUni…

植物大战僵尸tv版显示无法连接服务器,打开植物大战僵尸提示网络异常或者连接不上...

打开植物大战僵尸提示网络异常或者连接不上&#xff0c;相信大家在玩植物大战僵尸的过程中&#xff0c;经常会遇到这样的问题&#xff0c;下面ourplay小编就简单为大家介绍几种常见的解决方案。 植物大战僵尸游戏简介 《植物大战僵尸》是游戏菜单一个看似简单实则极富策略性的小…