Kubernetes Pod的生命周期概述
概述
在Kubernetes的世界中,Pod作为最基本的应用进程单元, 其生命周期也代表着应用进程的整个生命周期。了解其生命周期是掌握云计算中一个计算单元如何在Kubernetes世界周转的基石。
本期文章主要针对于Pod的生命周期的不同阶段进行介绍,让读者能够对Pod 从创建Pending到运行Running,然后到如何优雅的退出Terminating等整个周期有个框架性的了解,从而在实际工作中遇到问题和难题的时候能够更快定位并解决。
Pod Lifecycle
Kubernetes官方网站将Pod 的生命周期通过PodStatus 分为以下五种:
Pending | The Pod has been accepted by the Kubernetes cluster, but one or more of the containers has not been set up and made ready to run. This includes time a Pod spends waiting to be scheduled as well as the time spent downloading container images over the network. |
Running | The Pod has been bound to a node, and all of the containers have been created. At least one container is still running, or is in the process of starting or restarting. |
Succeeded | All containers in the Pod have terminated in success, and will not be restarted. |
Failed | All containers in the Pod have terminated, and at least one container has terminated in failure. That is, the container either exited with non-zero status or was terminated by the system, and is not set for automatic restarting. |
Unknown | For some reason the state of the Pod could not be obtained. This phase typically occurs due to an error in communicating with the node where the Pod should be running. |
Pending
当Pod 通过各种Controller(比如Deployment, StatefulSet, DaemonSet等)创建后,Kubernetes Scheduler 接受Pod的创建,在真正Pod 运行起来Running 之前,需要等待某些条件完成后才能进入运行起来,这些条件包括:
- 集群中有足够多的内存和CPU来运行该Pod
- Pod中定义的Container Image拉取完毕
- ...
当且仅当所以运行的条件都满足之后,Pod 才由Pending 变为Running.
Running
Running代表着Pod 正常运行的过程,其中Running 说明Pod是时时刻刻可以介绍外来请求并相应的。但是如果一个Pod中进程挂了,Kubernetes 如果更新并了解Pod的内部运行程序的最新情况呢?这个就需要最Pod上配置readinessProbe 和livenessProbe 了。通过这两个配置让你告诉kubernetes的kubelet 如何实时监控并定义你的Pod中容器的运行情况。
livenessProbe 和readinessProbe的官方定义如下:
livenessProbe
Indicates whether the container is running. If the liveness probe fails, the kubelet kills the container, and the container is subjected to its restart policy. If a container does not provide a liveness probe, the default state is Success
.
只有livenessProbe 通过,kubelet才认为该container是“活着的”,否则将直接重启container。
readinessProbe
Indicates whether the container is ready to respond to requests. If the readiness probe fails, the endpoints controller removes the Pod's IP address from the endpoints of all Services that match the Pod. The default state of readiness before the initial delay is Failure
. If a container does not provide a readiness probe, the default state is Success
.
readinessProbe是让kubelet认为你的容器是“ready for服务”的,这个跟你的业务是绑定的。
比如你的Pod里面跑的是一个Nginx 的服务器,你想要跑一个www.abcde.com网站,然后返回“ok”.只有这样才算是真正的“ready for服务”。
status:
conditions:
- type: Ready # a built in PodCondition
status: "False"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
如果readinessProbe返回False,那么对应的与网络相关的比如Service等组件会自动将该Pod 摘除下来,并将该Pod 置为“Unavailable”等并做出对应的行为。
其他类似的组件或者自定义的Controller也可以Pod.Status.Condition中的Ready项中的True or False 为基准做出对应的判断。
Succeeded Failed Unknown
这三种状态都代表Pod的非运行状态。
- Succeeded 表示Container中的进程运行结束并return 0;
- Failed 表示至少有一个Container 返回非0;
- 而其它位置的状态的过程都可以归结为Unknown的状态。
当一个Pod是一个长期运行并接受请求并相应的服务时。这三个状态的Pod都不是想要的状态,Running才是其正常大部分时间需要的。
Terminating
当用户通过kubectl 或者kube-client对某个pod 发出delete的请求的时候,Pod就会触发并进入Terminating状态。直到Pod 被彻底删除并消失。
该状态中的Pod会根据用户的配置进入优雅退出(GracefulTermination)的流程。关于该流程会专门整理一篇文章来介绍。
总结
Pod作为最基本的应用进程单元, 其生命周期也代表着应用进程的整个生命周期。根据Pod状态来得知容器进程处于不同的阶段,是最快感知Kubernetes进程的方式。
本文是概述各个状态的基本介绍,大家感兴趣的话,会对其中细节一一展开介绍。有什么问题和意见欢迎留言指正。谢谢