Sidecar 健康检查

Dapr sidecar 健康检查

Dapr 提供了一种方法,通过 HTTP /healthz 端点 来确定其健康状态。通过这个端点,daprd 进程或 sidecar 可以:

  • 检查整体健康状况
  • 在初始化期间确认 Dapr sidecar 的就绪状态
  • 在 Kubernetes 中确定就绪和存活状态

在本指南中,您将了解 Dapr /healthz 端点如何与应用托管平台(如 Kubernetes)以及 Dapr SDK 的健康检查功能集成。

下图展示了 Dapr sidecar 启动时,healthz 端点和应用通道初始化的步骤。

Dapr 检查出站健康连接的图示。

出站健康端点

如上图中的红色边界线所示,v1.0/healthz/ 端点用于等待以下情况:

  • 所有组件已初始化;
  • Dapr HTTP 端口可用;并且,
  • 应用通道已初始化。

这用于确认 Dapr sidecar 的完整初始化及其健康状况。

您可以通过设置 DAPR_HEALTH_TIMEOUT 环境变量来控制健康检查的超时时间,这在高延迟环境中可能很重要。

另一方面,如上图中的绿色边界线所示,当 v1.0/healthz/outbound 端点返回成功时:

  • 所有组件已初始化;
  • Dapr HTTP 端口可用;但,
  • 应用通道尚未建立。

在 Dapr SDK 中,waitForSidecar/wait_until_ready 方法(取决于您使用的 SDK)用于通过 v1.0/healthz/outbound 端点进行此特定检查。使用这种方法,您的应用程序可以在应用通道初始化之前调用 Dapr sidecar API,例如,通过 secret API 读取 secret。

如果您在 SDK 上使用 waitForSidecar/wait_until_ready 方法,则会执行正确的初始化。否则,您可以在初始化期间调用 v1.0/healthz/outbound 端点,如果成功,您可以调用 Dapr sidecar API。

支持出站健康端点的 SDK

目前,v1.0/healthz/outbound 端点在以下 SDK 中得到支持:

健康端点:与 Kubernetes 的集成

当将 Dapr 部署到像 Kubernetes 这样的托管平台时,Dapr 健康端点会自动为您配置。

Kubernetes 使用 就绪存活 探针来确定容器的健康状况。

存活性

kubelet 使用存活探针来判断何时需要重启容器。例如,存活探针可以捕获死锁(一个无法进展的运行应用程序)。在这种状态下重启容器可以帮助提高应用程序的可用性,即使存在错误。

如何在 Kubernetes 中配置存活探针

在 pod 配置文件中,存活探针被添加到容器规范部分,如下所示:

    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3

在上述示例中,periodSeconds 字段指定 kubelet 应每 3 秒执行一次存活探针。initialDelaySeconds 字段告诉 kubelet 应在执行第一次探针前等待 3 秒。为了执行探针,kubelet 向在容器中运行并监听端口 8080 的服务器发送 HTTP GET 请求。如果服务器的 /healthz 路径的处理程序返回成功代码,kubelet 认为容器是存活且健康的。如果处理程序返回失败代码,kubelet 会杀死容器并重启它。

任何介于 200 和 399 之间的 HTTP 状态代码表示成功;任何其他状态代码表示失败。

就绪性

kubelet 使用就绪探针来判断容器何时准备好开始接受流量。当所有容器都准备好时,pod 被认为是就绪的。就绪信号的一个用途是控制哪些 pod 被用作 Kubernetes 服务的后端。当 pod 未就绪时,它会从 Kubernetes 服务负载均衡器中移除。

如何在 Kubernetes 中配置就绪探针

就绪探针的配置与存活探针类似。唯一的区别是使用 readinessProbe 字段而不是 livenessProbe 字段:

    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 3
      periodSeconds: 3

Sidecar 注入器

在与 Kubernetes 集成时,Dapr sidecar 被注入了一个 Kubernetes 探针配置,告诉它使用 Dapr healthz 端点。这是由 “Sidecar 注入器” 系统服务完成的。与 kubelet 的集成如下面的图示所示。

Dapr 服务交互的图示

Dapr sidecar 健康端点如何与 Kubernetes 配置

如上所述,此配置由 Sidecar 注入器服务自动完成。本节描述了在存活和就绪探针上设置的具体值。

Dapr 在端口 3500 上有其 HTTP 健康端点 /v1.0/healthz。这可以与 Kubernetes 一起用于就绪和存活探针。当 Dapr sidecar 被注入时,存活和就绪探针在 pod 配置文件中配置为以下值:

    livenessProbe:
      httpGet:
        path: v1.0/healthz
        port: 3500
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds : 5
      failureThreshold : 3
    readinessProbe:
      httpGet:
        path: v1.0/healthz
        port: 3500
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds : 5
      failureThreshold: 3

延迟优雅关闭

Dapr 提供了一个 dapr.io/block-shutdown-duration 注释或 --dapr-block-shutdown-duration CLI 标志,它会延迟完整的关闭过程,直到指定的持续时间,或直到应用报告为不健康,以较早者为准。

在此期间,所有订阅和输入绑定都会关闭。这对于需要在其自身关闭过程中使用 Dapr API 的应用程序非常有用。

适用的注释或 CLI 标志包括:

  • --dapr-graceful-shutdown-seconds/dapr.io/graceful-shutdown-seconds
  • --dapr-block-shutdown-duration/dapr.io/block-shutdown-duration

注释和参数指南 中了解更多关于这些及其使用方法。

相关链接