Pod生命周期
状态值 | 描述 |
---|---|
Pending | API Server已经创建该Pod,但在Pod内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程 |
Running | Pod内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态 |
Succeeded | Pod内所有容器均成功执行后退出,且不会在重启 |
Failed | Pod内所有容器均已退出,但至少有一个容器退出为失败状态 |
Unknown | 由于某种原因无法获取该Pod的状态,可能由于网络通信不畅所致 |
Pod的重启策略(RestartPolicy)
Always:当容器失效时,有kubelet自动重启改容器。
OnFailure:当容器终止运行切退出码不为0是,由kubelet自动重启改容器。
Never: 不论容器运行状态如何,kubelet都不会重启该策略。
每种控制器对Pod的重启策略要求如下:
RC和DaemonSet:必须设置为Always,需要保证该容器持续运行。
Job: OnFailuer或Never,确保容器执行完成后不再重启。
kubelet:在Pod失效时自动重启它,不论RestartPolicy设置为什么值,也不会对Pod进行健康检查。
Pod的创建过程
- 用户通过kubectl或其他API客户端提交Pod Spec给API Server。
- API Server尝试着将Pod对象的相关信息存入etcd中,待写入操作执行完成,API Server即会返回确认信息至客户端。
- API Server 开始反映etcd中的状态变化。
- 所有的Kubenetes组件均使用"watch"机制来跟踪检查API Server上的相关变动。
- kube-schedulre(调度器)通过其”watcher“觉察到API Server创建了新的Pod对象对尚未绑定至任何工作节点。
- kube-scheduler为Pod对象挑选一个工作节点并将结果信息更新至API Server。
- 调度结果信息由API Server更新至etcd存储系统,而且API Server也开始反映此Pod对象的调度结果。
- Pod被调度到的目标工作节点上的kubelet尝试在当前节点上调用Docker启动容器,并将容器的结果状态回送至API Server。
- API Server将Pod状态信息存入etcd中。
- 在etcd确认写入操作成功完成后,API Server将确认信息发送至相关kubelet,事件将通过它被接受。
Pod的终止过程
- 用户发送删除Pod对象的命令。
- API Server服务器中的Pod对象会随着时间的推移而更新,在宽限期内(默认为30秒),Pod被视为”dead“。
- 将Pod标记为”Terminating“状态。
- (与第3步同时运行)kubelet在监控到Pod对象转为”Terminating“状态的同时启动Pod关闭过程。
- (与第3步同时运行)端点控制器监控到Pod对象的关闭行为时将其从所有匹配到此端点的Service资源的端点列表中移除。
- 如果当前Pod对象定义了preStop钩子处理器,则在其标记为"terminating"后即会以同步的方式启动执行;如若宽限期结束后,preStop仍未执行结束,则第2步会被重新执行并额外获取一个时长为2秒的小宽限期。
- Pod对象中的容器进程收到TERM信号。
- 宽限期结束后,若存在任何一个仍在运行的过程,那么Pod对象即会收到SIGKILL信号。
- Kubelet请求API Server将此Pod资源的宽限期设置为0 从而完成删除操作,它变得对用户不再可见。
默认情况下,所有删除操作的宽限期都是30秒,不过, kubectl delete 命令可以使用”--grace-period=<seconds>“选项自定义其时长,若使用0值则表示直接强制删除指定的资源,不过,此时需要同时为命令使用”--force“选项。