Pod中container的状态小结
Contents
一 pod中container的状态包含哪些内容
- container id;
- container image id;
- lastState:如果该container发生过重启,那么它在重启之前的状态;
- container name;
- 是否ready;
- 重启次数;
- 是否启动;
- container state;
二 pod中container可能有哪些状态
三 如何查看pod中container的状态
由于container status是在其所在pod的yaml文件中的status字段下的containerStatuses字段的。所以,我们可以通过获取pod的yaml文件来查看container状态。
kubectl get pod pod_name -o yaml;
四 pod中container status字段中的lastState表示什么意思
表示当前container如果发生过重启的话,那么它在重启之前的状态的详细信息。如果该container没有发生过重启,那么该字段值为空,用{}表示。
实验如下,我们的pod curl中的container main发生重启前后,查看其状态发生的变化。
1 查看pod状态,curl没有发生重启
[root@master-node ~]# kubectl get pods -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES curl 1/1 Running 0 11d 10.244.2.245 node-2 <none> <none> curl-with-ambassador 2/2 Running 0 33d 10.244.1.47 node-1 <none> <none> downward 1/1 Running 0 34d 10.244.1.45 node-1 <none> <none> fortune-configmap-volume 2/2 Running 0 41d 10.244.2.235 node-2 <none> <none> fortune-https 2/2 Running 0 41d 10.244.2.236 node-2 <none> <none> my-job-jfhz9 0/1 Completed 0 11d 10.244.2.244 node-2 <none> <none> [root@master-node ~]#
2 pod重启前,查看其container状态:
[root@master-node ~]# kubectl get pod curl -oyaml apiVersion: v1 kind: Pod metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"curl","namespace":"default"},"spec":{"containers":[{"command":["sleep","9999999"],"image":"rancher/curl","name":"main"}]}} creationTimestamp: "2022-05-09T15:23:37Z" name: curl ... status: conditions: containerStatuses: - containerID: docker://9d56be349349b7581a4178b11895167b5be8c1c68ce1630f440389a1e8257a35 image: docker.io/rancher/curl:latest imageID: docker-pullable://docker.io/rancher/curl@sha256:85aea1846e2e9b921629e9c3adf0c5aa63dbdf13aa84d4dc1b951982bf42d1a4 lastState: {} #container在重启之前,上一次的状态是什么 name: main ready: true restartCount: 0 started: true state: running: startedAt: "2022-05-09T15:23:50Z" hostIP: 172.16.11.161 phase: Running podIP: 10.244.2.245 podIPs: - ip: 10.244.2.245 qosClass: BestEffort startTime: "2022-05-09T15:23:37Z" [root@master-node ~]#
此时,看到lastState字段值是空的,用{}表示。
3 到worker节点上,重启container:
这里,通过手工杀掉container,然后Kubernetes会自动启动1个新的container。重启前,container的id是9d56be349349,重启后,id是1a6248a37743。
[root@node-2 ~]# docker ps|grep curl 9d56be349349 docker.io/rancher/curl@sha256:85aea1846e2e9b921629e9c3adf0c5aa63dbdf13aa84d4dc1b951982bf42d1a4 "sleep 9999999" 11 days ago Up 11 days k8s_main_curl_default_6ce37a07-b540-49e7-a945-01cf58e58895_0 0cb54d805405 registry.aliyuncs.com/google_containers/pause:3.5 "/pause" 11 days ago Up 11 days k8s_POD_curl_default_6ce37a07-b540-49e7-a945-01cf58e58895_0 [root@node-2 ~]# docker stop 9d56 9d56 [root@node-2 ~]# docker ps|grep curl 1a6248a37743 docker.io/rancher/curl@sha256:85aea1846e2e9b921629e9c3adf0c5aa63dbdf13aa84d4dc1b951982bf42d1a4 "sleep 9999999" 10 seconds ago Up 9 seconds k8s_main_curl_default_6ce37a07-b540-49e7-a945-01cf58e58895_1 0cb54d805405 registry.aliyuncs.com/google_containers/pause:3.5 "/pause" 11 days ago Up 11 days k8s_POD_curl_default_6ce37a07-b540-49e7-a945-01cf58e58895_0 [root@node-2 ~]#
4 回到master node再次查看pod中的container状态:
注意,查看lastState字段的变化。
[root@master-node ~]# kubectl get pod curl -oyaml apiVersion: v1 kind: Pod ... status: conditions: - lastProbeTime: null lastTransitionTime: "2022-05-09T15:23:37Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2022-05-21T06:56:40Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2022-05-21T06:56:40Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2022-05-09T15:23:37Z" status: "True" type: PodScheduled containerStatuses: - containerID: docker://1a6248a377436d56923d8e2188801d0721acce386564c011bd8b6669e79709df image: docker.io/rancher/curl:latest imageID: docker-pullable://docker.io/rancher/curl@sha256:85aea1846e2e9b921629e9c3adf0c5aa63dbdf13aa84d4dc1b951982bf42d1a4 lastState: #container发生重启之后,可以看到关于重启之前的更多信息 terminated: containerID: docker://9d56be349349b7581a4178b11895167b5be8c1c68ce1630f440389a1e8257a35 exitCode: 137 finishedAt: "2022-05-21T06:56:33Z" reason: Error startedAt: "2022-05-09T15:23:50Z" name: main ready: true restartCount: 1 started: true state: running: startedAt: "2022-05-21T06:56:39Z" hostIP: 172.16.11.161 phase: Running podIP: 10.244.2.245 podIPs: - ip: 10.244.2.245 qosClass: BestEffort startTime: "2022-05-09T15:23:37Z" [root@master-node ~]#
五 查看包含initContainer的pod和所有containers状态的例子
通过执行作者提供的示例(代码仓库地址是:https://github.com/luksa/kubernetes-in-action-2nd-edition.git ),创建包含initContainer的pod,该pod的完整代码如下:
[root@master-node Chapter05]# pwd /root/kubernetes-in-action-2nd-edition/Chapter05 [root@master-node Chapter05]# ll 总用量 36 drwxr-xr-x 2 root root 68 5月 21 14:53 init-demo-0.1 drwxr-xr-x 3 root root 66 5月 21 14:53 kiada-0.2 drwxr-xr-x 2 root root 104 5月 21 14:53 kiada-ssl-proxy-0.1 drwxr-xr-x 2 root root 68 5月 21 14:53 network-connectivity-checker-0.1 -rw-r--r-- 1 root root 566 5月 21 14:53 pod.kiada-init.custom-ip.yaml -rw-r--r-- 1 root root 507 5月 21 14:53 pod.kiada-init-slow.yaml -rw-r--r-- 1 root root 481 5月 21 14:53 pod.kiada-init.yaml -rw-r--r-- 1 root root 337 5月 21 14:53 pod.kiada-ssl.yaml -rw-r--r-- 1 root root 224 5月 21 14:53 pod.kiada-stdin-once.yaml -rw-r--r-- 1 root root 217 5月 21 14:53 pod.kiada-stdin-tty.yaml -rw-r--r-- 1 root root 199 5月 21 14:53 pod.kiada-stdin.yaml -rw-r--r-- 1 root root 177 5月 21 14:53 pod.kiada.yaml -rw-r--r-- 1 root root 2494 5月 21 14:53 README.md [root@master-node Chapter05]# cat pod.kiada-init.yaml apiVersion: v1 kind: Pod metadata: name: kiada-init spec: initContainers: - name: init-demo image: luksa/init-demo:0.1 - name: network-check image: luksa/network-connectivity-checker:0.1 containers: - name: kiada image: luksa/kiada:0.2 stdin: true ports: - name: http containerPort: 8080 - name: envoy image: luksa/kiada-ssl-proxy:0.1 ports: - name: https containerPort: 8443 - name: admin containerPort: 9901 [root@master-node Chapter05]#
然后通过kubectl get pod kiada-init -oyaml 来查看pod的state和状态、以及container和initContainer的状态。这里,篇幅限制,只贴出重要的信息:
[root@master-node ~]# kubectl get pod kiada-init -oyaml apiVersion: v1 kind: Pod metadata: spec: containers: - image: luksa/kiada:0.2 imagePullPolicy: IfNotPresent name: kiada #pod中的第1个container ... - image: luksa/kiada-ssl-proxy:0.1 imagePullPolicy: IfNotPresent name: envoy #pod中的第2个container ... initContainers: - image: luksa/init-demo:0.1 imagePullPolicy: IfNotPresent name: init-demo #pod中的第1个initContainer ... - image: luksa/network-connectivity-checker:0.1 imagePullPolicy: IfNotPresent name: network-check #pod中的第2个initContainer ... status: conditions: #pod的conditions - lastProbeTime: null lastTransitionTime: "2022-05-22T08:17:02Z" status: "True" type: Initialized - lastProbeTime: null lastTransitionTime: "2022-05-22T08:18:32Z" status: "True" type: Ready - lastProbeTime: null lastTransitionTime: "2022-05-22T08:18:32Z" status: "True" type: ContainersReady - lastProbeTime: null lastTransitionTime: "2022-05-22T08:16:42Z" status: "True" type: PodScheduled containerStatuses: #pod中第1个container的状态 - containerID: docker://a99ca ... - containerID: docker://cded #pod中第2个container的状态 ... initContainerStatuses: - containerID: docker://83bf #pod中第1个initcontainer的状态 ... - containerID: docker://1984 #pod中第2个initcontainer的状态 phase: Running #pod的phase字段。
这里,可以看到在pod的yaml文件中,如果包含有initContainer的话,可以看到initContainer的状态。
六 参考
《Kubernetes in Action Second Edition》 Marko luksa
Chapter 06 managing the lifecycle of the Pod’s containers P146–P148.
延伸阅读:
上一篇文章中,我们涉及到了 如何查看和分析Kubernetes中pod的phase、conditions?它们有什么作用?
2条评论
Pingback:
Pingback: