Pod是Kubernetes中服务运行的最小单元,所有我们有必要对它的生命周期做更详细的了解。

Pod的状态

Pod有如下几种状态,通过kubelet get pod获取status字段查看

状态 描述
Pending Pod已被Kubernetes系统接受,但容器镜像还未创建。 这包括调度之前的时间以及下载镜像所花费的时间。
Running Pod已绑定到节点,并且已创建所有容器。 至少有一个容器仍在运行,或者正在启动或重新启动。
Succeeded Pod中的所有容器都已成功终止,并且不会重新启动。
Failed Pod中的所有容器都已终止,并且至少有一个容器已终止失败。 也就是说,容器要么退出非零状态,要么被系统终止。
Unknown 由于某种原因,无法获得Pod的状态,这通常是由于与Pod的主机通信时出错。

Pod有一个PodStatus,它有一个PodConditions数组,描述Pod是否通过数组条件。 PodCondition数组的每个元素都有六个可能的字段:

  • lastProbeTime:提供上次探测Pod条件的时间戳。
  • lastTransitionTime:提供Pod最后一次从一种状态转换到另一种状态的时间戳。
  • message:是一条人类可读的消息,指示有关转换的详细信息。
  • reason:这是条件最后一次转换的独特,单字,CamelCase的原因
  • status:状态字段是一个字符串,可能的值为“True”,“False”和“Unknown”。
  • type:是一个包含以下可能值的字符串:
    • PodScheduled:Pod已被调度到一个节点;
    • Ready:Pod能够提供请求,应该添加到所有匹配服务的负载平衡池中;
    • Initialized:所有init容器都已成功启动;
    • Unschedulable:调度程序现在无法调度Pod,例如由于缺乏资源或其他限制;
    • ContainersReady:Pod中的所有容器都准备好了。

容器探针

探针是由容器上的kubelet定期执行的探测诊断。 为了执行诊断,kubelet调用Container实现的Handler。 有三种类型的探针程序:

  • ExecAction:在Container内执行指定的命令。 如果命令以状态代码0退出,则认为诊断成功。
  • TCPSocketAction::对指定端口上的Container的IP地址执行TCP检查。 如果端口打开,则诊断被认为是成功的。
  • HTTPGetAction:对指定端口和路径上的Container的IP地址执行HTTP Get请求。 如果响应的状态代码大于或等于200且小于400,则认为诊断成功。

每个探针都有如下三种结果:

  • Success:容器探测成功
  • Failure:容器探测失败
  • Unknown:探测操作失败,不采取任何措施

在运行容器时,kubelet可以选择性地执行和响应两种探测器:

  • livenessProbe:指示Container是否正在运行。 如果存活探测失败,则kubelet会杀死Container,并且Container将受其重启策略的约束。 如果Container未提供存活探测,则默认状态为Success。
  • readinessProbe:指示Container是否已准备好为请求提供服务。 如果准备就绪的探测失败,则Endpoints端点控制器会从与Pod匹配的所有服务的端点中删除Pod的IP地址。 初始延迟之前的默认准备状态是失败。 如果Container未提供就绪状态探测,则默认状态为“成功”。

那么什么时候应该使用这二种探针呢?

  1. 如果你的Container中的进程在遇到问题或变得不健康时能够自行停止,则你不一定需要livenessProbe探测器; kubelet将根据Pod的restartPolicy自动执行正确的操作。

  2. 如果你希望在探测失败时杀死并重新启动Container,则指定livenessProbe存活探测,并指定restartPolicy为Always或OnFailure。

  3. 如果你只想在探测成功时开始向Pod发送流量,请指定readinessProbe就绪探测。 在这种情况下,就绪探测可能与存活探测相同,但规范中存在准备探测意味着Pod将在不接收任何流量的情况下启动,并且仅在探测开始成功后才开始接收流量。 如果Container需要在启动期间处理大型数据,配置文件或迁移,请指定readinessProbe就绪探针。

  4. 如果你希望Container能够自行维护,你可以指定一个readinessProbe就绪探针,用于检查特定于就绪状态的端点,该端点与存活探针不同。

  5. 请注意,如果你只想在删除Pod时排除请求,则不一定需要就绪探测; 在删除时,无论就绪探针是否存在,Pod都会自动将其置于未就绪状态。 Pod在等待Pod中的容器停止时仍处于未就绪状态

容器状态

Pod中的容器有三种可能的状态:等待、运行和终止。要检查容器的状态,可以使用kubectl describe pod [pod NAME]。该Pod中的每个容器都显示状态

  • Waiting:容器的默认状态。 如果容器未处于Running或Terminated状态,则它处于Waiting状态。 处于等待状态的容器仍然运行其所需的操作,如拉动镜像,应用secret等。随着此状态,将显示有关状态的消息和原因以提供更多信息。
  • Running:表示容器正常运行。 一旦容器进入Running,就会执行postStart钩子(如果有的话)。 此状态还显示容器进入运行状态的时间。
  • Terminated:表示容器已完成执行并已停止运行。 容器在成功完成执行或由于某种原因失败时进入此状态。 此时会显示原因和退出代码,以及容器的开始和结束时间。 在容器进入Terminated之前,会执行preStop钩子(如果有)。