Pod⽣命周期概述
Pod 遵循⼀个预定义的⽣命周期,起始于 Pending 阶段,如果⾄少其中有⼀个主要容器正常启动,则进⼊ Running,之后取决于Pod 中是否有容器以 失败状态结束⽽进⼊ Succeeded 或者 Failed 阶段。
在 Pod 运⾏期间,kubelet 能够重启容器以处理⼀些失效场景。 在 Pod 内部,Kubernetes 跟踪不同容器的状态 并确定使Pod 重新变得健康所需要采取的动作。
Pod 在其⽣命周期中只会被调度⼀次。 ⼀旦 Pod 被调度(分派)到某个节点,Pod 会⼀直在该节点运⾏,直到 Pod 停⽌或者 被终⽌。
Pod ⽣命期
和⼀个个独⽴的应⽤容器⼀样,Pod 也被认为是相对临时性(⽽不是长期存在)的实体。 Pod 会被创建、赋予⼀个唯⼀的 ID(UID),并被调度到节点,并在终⽌(根据重启策略)或删除之前⼀直运⾏在该节点。
如果⼀个节点死掉了,调度到该节点 的 Pod 也被计划在给定超时期限结束后删除。
Pod ⾃⾝不具有⾃愈能⼒。如果 Pod 被调度到某节点 ⽽该节点之后失效,或者调度操作本⾝失效,Pod
会被删除;与此类似,Pod ⽆法在节点资源 耗尽或者节点维护期间继续存活。Kubernetes 使⽤⼀种⾼级抽象,称作 控制器,来管理这些相对⽽⾔ 可随时丢弃的 Pod 实例。
任何给定的 Pod (由 UID 定义)从不会被“重新调度(rescheduled)”到不同的节点; 相反,这⼀ Pod 可以被⼀个新的、⼏乎完全相同的 Pod 替换掉。 如果需要,新 Pod 的名字可以不变,但是其 UID 会不同。
如果某物声称其⽣命期与某 Pod 相同,例如存储卷, 这就意味着该对象在此 Pod (UID 亦相同)存在期间也⼀直存在。 如果 Pod 因为任何原因被删除,甚⾄某完全相同的替代 Pod 被创建时, 这个相关的对象(例如这⾥的卷)也会被删除并重建。
⼀般将pod对象从创建⾄结束的这段时间范围成为pod的⽣命周期,它主要包含下⾯的过程:
pod创建过程
运⾏初始化容器(init container)过程(可多可少,可有可⽆)
运⾏主容器(main container)过程
容器启动后执⾏的钩⼦函数(post start),容器终⽌前执⾏的钩⼦函数( pre stop)
容器的存活性探测(liveness probe)、就绪性探测(readiness probe)
pod终⽌过程
在整个⽣命周期中,pod会出现5种状态(相位),分别如下:
取值描述
Pending(挂起)Pod 已被 Kubernetes 系统接受,但有⼀个或者多个容器尚未创建亦未运⾏。此阶段包括等待 Pod 被调度的时间和通过⽹络下载镜
像的时间,
Running(运⾏
中)
Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。⾄少有⼀个容器仍在运⾏,或者正处于启动或重启状态。
Succeeded(成
功)
Pod 中的所有容器都已成功终⽌,并且不会再重启。
Failed(失败)Pod 中的所有容器都已终⽌,并且⾄少有⼀个容器是因为失败终⽌。也就是说,容器
pending以⾮ 0 状态退出或者被系统终⽌。
Unknown(未
知)
因为某些原因⽆法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。
如果某节点死掉或者与集中其他节点失联,Kubernetes 会实施⼀种策略,将失去的节点上运⾏的所有 Pod 的 phase 设置为 Failed。创建和终⽌
pod的创建过程
1. ⽤户通过kubectl或其他api客户端提交需要创建的pod信息给apiserver
2. apiserver开始⽣成pod对象的信息,并将信息存⼊etcd,然后返回确认信息⾄客户端
3. apiserver开始反映etcd中的pod对象的变化,其他组件使⽤watch(监听)机制来跟踪检查apiserver上的变动
4. scheduler发现有新的pod对象要创建,开始为pod分配主机并将结果信息更新⾄apiserver
5. node节点上的kubelet发现有pod调度过来,尝试调⽤docker启动容器,并将结果送⾄apiserver
6. apiserver将接收到的pod状态信息存⼊etcd中
pod的终⽌过程
1. ⽤户向apiserver发送删除pod对象的命令
2. apiserver中的pod对象信息会随着时间的推移⽽更新,在宽限期内(默认是30s),pod被视为dead
3. 将pod标记为terminating(正在删除)状态
4. kubelet在监控到pod对象转为terminating状态的同时启动pod关闭过程
5. 端点控制器监控到pod对象的关闭⾏为时将其从所有匹配到此端点的service资源的端点列表中移除
6. 如果当前pod对象定义了 preStop钩⼦处理器,则在其标记为terminating后即会以同步的⽅式启动执⾏
7. pod对象中的容器进程收到停⽌信号
8. 宽限期结束后,若pod中还存在仍在运⾏的进程,那么pod对象会收到⽴即终⽌的信号
9. kubelet请求apiserver将此pod资源的宽限期设置为0,从⽽完成删除操作,此时pod对于⽤户已不可见
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论