Pod 生命周期是其从创建开始至终止退出的事件范围。
Pod 状态
- Pending API server 创建了 Pod 对象并已存入 etcd 中,但尚未调度完成或仍处于从镜像仓库下载镜像的过程中。
- Running Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成。
- Succeeded Pod 中所有的容器都已经成功终止并且不会被重启。
- Failed 所有容器都已经终止,但至少有一个容器终止失败。
- Unknown API server 无法正常获取到 Pod 对象的状态信息,通常是由于无法与所在工作节点的 kubelet 通信导致。
Pod 创建过程
- 用户通过 kubectl 或其他 API 客户端提交 Pod 对象给 API server。
- API server 尝试将 Pod 对象的相关信息存入 etcd 中,写入操作完成后 API server 会返回确认信息至客户端。
- API server 开始反映 etcd 中的状态变化。
- 所有的 Kubernetes 组件均使用 watch 机制来跟踪检查 API server 上的相关变化。
- kube-scheduler 通过其 watcher 观察到 API server 创建了新的 Pod 对象但尚未绑定至任何节点。
- kube-scheduler 为 Pod 对象挑选一个工作节点并将结果更新至 API server。
- 调度结果由 API server 更新至 etcd,而且 API server 也开始反映此 Pod 对象的调度结果。
- Pod 被调度的目标工作节点上的 kubelet 尝试在当前节点上启动容器,并将容器的结果状态返回至 API server。
- API server 将 Pod 状态信息存入 etcd。
- 在 etcd 确认写操作完成后,API server 将确认信息发送至相关的 kubelet。
Pod 生命周期中的行为
用户可以为 Pod 对象定义其生命周期中的多种行为。
1. init container
在应用程序的主容器启动之前运行,常用于为主容器执行一些预操作。
- init container 运行失败将不断重启直到成功完成。
- init container 按定义的顺序执行。
2. lifecycle hook
在关键时刻采取某种行动。
- postStart 容器创建完成之后立即运行,与容器的 ENTRYPOINT 异步。
- preStop 容器终止前立即运行,同步,在完成前会阻塞删除容器的操作。
探针
- ExecAction 在 Pod 中执行命令,并根据返回的状态码进行诊断,状态码 0 表示成功。
- TCPSocketAction 与 Pod 的某端口尝试建立 TCP 连接。
- HTTPGetAction 通过指定路由发起 HTTP GET 请求诊断,响应码为 2xx 或 3xx 时成功。
- liveness probe(存活性检测) 用于判断 Pod 是否处于 Running 状态,如果未通过,kubelet 将杀掉 Pod 并根据
restartPolicy
决定是否将其重启。 - readness probe(就绪性检测) 用于判断 Pod 是否准备就去并可以对外提供服务,未通过检测 Service 会将其 IP 摘除。
重启
- Always 一终止就重启
- OnFailure 仅在 Pod 出现错误时才重启
- Never 从不
一旦 Pod 绑定到某个节点,将永远不会被重新绑定到另外一个节点,要么被重启,要么终止,直到节点挂掉或被删除。
Pod 终止过程
当用户提交删除请求后,系统会进行强制删除操作的宽限期倒计时,并将 TERM 信息发送给 Pod 对象的每个容器中的主进程。宽限期倒计时结束后,进程将收到强制终止的 KILL 信号,Pod 对象随即也由 API server 删除。
- 请求删除 Pod。
- API server 将 Pod 标记为 Terminating 状态。
- (与第 2 步同时进行)kubelet 在监控到 Pod 对象转为 Terminating 状态的同时启动 Pod 关闭过程。
- (与第 2 步同时进行)Service 将 Endpoint 摘除。
- 如果当前 Pod 对象定义了 preStop hook,则在其标记为 Terminating 后会以同步的方式执行,宽限期开始计时。
- Pod 中的容器进程收到 TERM 信号。
- 宽限期结束后,若进程仍在运行,会收到 SIGKILL 信号。
- kubelet 请求 API server 将此 Pod 对象的宽限期设置为 0 从而完成删除操作。