Kubernetes Pod 生命周期

Pod 生命周期是其从创建开始至终止退出的事件范围。

Pod 状态

  • Pending API server 创建了 Pod 对象并已存入 etcd 中,但尚未调度完成或仍处于从镜像仓库下载镜像的过程中。
  • Running Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成。
  • Succeeded Pod 中所有的容器都已经成功终止并且不会被重启
  • Failed 所有容器都已经终止,但至少有一个容器终止失败。
  • Unknown API server 无法正常获取到 Pod 对象的状态信息,通常是由于无法与所在工作节点的 kubelet 通信导致。

Pod 创建过程

Kubernetes Pod 生命周期_第1张图片

  1. 用户通过 kubectl 或其他 API 客户端提交 Pod 对象给 API server。
  2. API server 尝试将 Pod 对象的相关信息存入 etcd 中,写入操作完成后 API server 会返回确认信息至客户端。
  3. API server 开始反映 etcd 中的状态变化。
  4. 所有的 Kubernetes 组件均使用 watch 机制来跟踪检查 API server 上的相关变化。
  5. kube-scheduler 通过其 watcher 观察到 API server 创建了新的 Pod 对象但尚未绑定至任何节点。
  6. kube-scheduler 为 Pod 对象挑选一个工作节点并将结果更新至 API server。
  7. 调度结果由 API server 更新至 etcd,而且 API server 也开始反映此 Pod 对象的调度结果。
  8. Pod 被调度的目标工作节点上的 kubelet 尝试在当前节点上启动容器,并将容器的结果状态返回至 API server。
  9. API server 将 Pod 状态信息存入 etcd。
  10. 在 etcd 确认写操作完成后,API server 将确认信息发送至相关的 kubelet。

Pod 生命周期中的行为

用户可以为 Pod 对象定义其生命周期中的多种行为。

1. init container

在应用程序的主容器启动之前运行,常用于为主容器执行一些预操作

  1. init container 运行失败将不断重启直到成功完成。
  2. init container 按定义的顺序执行。

2. lifecycle hook

在关键时刻采取某种行动。

  1. postStart 容器创建完成之后立即运行,与容器的 ENTRYPOINT 异步。
  2. preStop 容器终止前立即运行,同步,在完成前会阻塞删除容器的操作。

探针

  • ExecAction 在 Pod 中执行命令,并根据返回的状态码进行诊断,状态码 0 表示成功。
  • TCPSocketAction 与 Pod 的某端口尝试建立 TCP 连接。
  • HTTPGetAction 通过指定路由发起 HTTP GET 请求诊断,响应码为 2xx 或 3xx 时成功。
  • liveness probe(存活性检测) 用于判断 Pod 是否处于 Running 状态,如果未通过,kubelet 将杀掉 Pod 并根据 restartPolicy 决定是否将其重启。
  • readness probe(就绪性检测) 用于判断 Pod 是否准备就去并可以对外提供服务,未通过检测 Service 会将其 IP 摘除。

重启

  1. Always 一终止就重启
  2. OnFailure 仅在 Pod 出现错误时才重启
  3. Never 从不

一旦 Pod 绑定到某个节点,将永远不会被重新绑定到另外一个节点,要么被重启,要么终止,直到节点挂掉或被删除。

Pod 终止过程

当用户提交删除请求后,系统会进行强制删除操作的宽限期倒计时,并将 TERM 信息发送给 Pod 对象的每个容器中的主进程。宽限期倒计时结束后,进程将收到强制终止的 KILL 信号,Pod 对象随即也由 API server 删除。

Kubernetes Pod 生命周期_第2张图片

  1. 请求删除 Pod。
  2. API server 将 Pod 标记为 Terminating 状态。
  3. (与第 2 步同时进行)kubelet 在监控到 Pod 对象转为 Terminating 状态的同时启动 Pod 关闭过程。
  4. (与第 2 步同时进行)Service 将 Endpoint 摘除。
  5. 如果当前 Pod 对象定义了 preStop hook,则在其标记为 Terminating 后会以同步的方式执行,宽限期开始计时。
  6. Pod 中的容器进程收到 TERM 信号。
  7. 宽限期结束后,若进程仍在运行,会收到 SIGKILL 信号。
  8. kubelet 请求 API server 将此 Pod 对象的宽限期设置为 0 从而完成删除操作。

你可能感兴趣的:(kubernetes,docker,容器)