全部产品
云市场

健康检测

更新时间:2019-12-23 15:50:28

本文将向您展示如何配置容器的存活和就绪探针。

kubelet 使用 liveness probe(存活探针)来确定何时重启容器。

例如,当应用程序处于运行状态但无法做进一步操作,liveness 探针将捕获到 deadlock,重启处于该状态下的容器,使应用程序在存在 bug 的情况下依然能够继续运行下去。

Kubelet 使用 readiness probe(就绪探针)来确定容器是否已经就绪可以接受流量。

只有当 Pod 中的容器都处于就绪状态时 kubelet 才会认定该 Pod 处于就绪状态。该信号的作用是控制哪些 Pod 应该作为 service 的后端。如果 Pod 处于非就绪状态,那么它们将会被从 service 的 load balancer 中移除。

Liveness Probe

许多长时间运行的应用程序最终会转换到 broken 状态,除非重新启动,否则无法恢复。Kubernetes 提供了 liveness probe 来检测和补救这种情况。

Readiness Probe

有时,应用程序暂时无法对外部流量提供服务。 例如,应用程序可能需要在启动期间加载大量数据或配置文件。 在这种情况下,您不想杀死应用程序,也不想发送请求。 Kubernetes 提供了 readiness probe 来检测和减轻这些情况。 Pod 中的容器可以报告自己还没有准备,不能处理 Kubernetes 服务发送过来的流量。

健康检测演示

下面以 Nginx 容器为例,展示 Liveness Probe 和 Readiness Probe 的作用

先使用 Nginx 镜像创建一个 ECI 实例,Probe 相关代码片段如下(获取完整的示例代码):

  1. //容器运行5秒后,每3秒检测一次80端口,检测超时时间为10秒,检测成功和失败的阈值均为3次
  2. CreateContainerGroupRequest.Container.ContainerProbe livenessProbe = new CreateContainerGroupRequest.Container.ContainerProbe();
  3. livenessProbe.setTcpSocketPort(80);
  4. livenessProbe.setInitialDelaySeconds(5);
  5. livenessProbe.setPeriodSeconds(3);
  6. livenessProbe.setFailureThreshold(3);
  7. livenessProbe.setSuccessThreshold(1);
  8. livenessProbe.setTimeoutSeconds(10);
  9. CreateContainerGroupRequest.Container.ContainerProbe readinessProbe = new CreateContainerGroupRequest.Container.ContainerProbe();
  10. readinessProbe.setTcpSocketPort(80);
  11. readinessProbe.setInitialDelaySeconds(5);
  12. readinessProbe.setPeriodSeconds(3);
  13. readinessProbe.setFailureThreshold(3);
  14. readinessProbe.setSuccessThreshold(3);
  15. readinessProbe.setTimeoutSeconds(10);

实例创建成功后,访问 ECI 控制台,实例事件正常

normalevent

进入容器修改 Nginx 监听端口,以模拟服务异常

terminal

大约10秒后,容器进行了重启,此时的事件如下,Liveness Probe 和 Readiness Probe 各有3次失败,之后容器进行了自动重启

failevent