如何为 Azure Spring Apps 中托管的应用配置运行状况探测和正常终止期

注意

基本标准计划于 2025 年 3 月 17 日进入退休期。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划于 2024 年 9 月 30 日进入停用期,并将在 2025 年 3 月底之前完全关闭。

本文介绍如何使用运行状况探测和正常终止期自定义在 Azure Spring Apps 中运行的应用。

探测是 Azure Spring Apps 在应用实例上定期执行的诊断活动。 为了执行诊断,Azure Spring Apps 将执行以下操作之一:

  • 在应用实例中执行你选择的任意命令。
  • 建立 TCP 套接字连接。
  • 发出 HTTP 请求。

Azure Spring Apps 为每个应用程序提供默认运行状况探测规则。 本文将介绍如何使用三种运行状况探测自定义应用程序:

  • 运行情况探测确定何时重启应用程序。 例如,运行情况探测可以识别死锁,例如当应用程序正在运行但无法取得进展时。 重启处于死锁状态的应用程序能使该应用程序在出错的情况下仍然可用。

  • 就绪情况探测确定应用实例何时准备好开始接受流量。 例如,就绪情况探测可以控制哪些应用实例用作应用程序的后端。 当应用实例未准备就绪时,将从 Kubernetes 服务发现中删除该实例。 有关详细信息,请参阅发现并注册 Spring Boot 应用程序

  • 启动探测确定应用程序何时已启动。 在成功启动之前,启动探测会禁用运行情况和就绪情况检查,确保运行情况和就绪情况探测不会干扰应用程序启动。 可以使用启动探测器对启动速度缓慢的应用程序执行运行情况检查,防止应用在启动并运行之前终止。

先决条件

  • 带有 Azure Spring Apps 扩展的 Azure CLI。 使用以下命令删除以前的版本,并安装最新的扩展。 如果以前安装了 spring-cloud 扩展,请卸载它以避免配置和版本不匹配。

    az extension remove --name spring
    az extension add --name spring
    az extension remove --name spring-cloud
    

为应用程序配置运行状况探测和正常终止

以下部分介绍如何使用 Azure CLI 配置运行状况探测和正常终止。

正常终止

下表描述了可用于配置正常终止的 terminationGracePeriodSeconds 属性。

属性名称 说明
terminationGracePeriodSeconds 向应用实例中运行的进程发送终止信号之后、强制停止这些进程之前的持续时间,以秒为单位。 请将此值设置为大于你的进程的预期清理时间。 该值必须是非负整数。 将宽限期设置为 0 将通过发送终止信号立即停止应用实例,使其无法正常关闭。 如果值为 nil,则 Azure Spring Apps 使用默认宽限期。 默认值是 90

运行状况探测属性

下表描述了可用于配置运行状况探测的属性。

属性名称 说明
initialDelaySeconds 应用实例启动后到启动探测之前的秒数。 默认值为 0最小值。
periodSeconds 执行探测的频率,以秒为单位。 默认值是 10。 最小值为 1
timeoutSeconds 探测超时之前的秒数。默认值为 1最小值。
failureThreshold 使探测在成功后被视为失败的最小连续失败次数。 默认值是 3。 最小值为 1
successThreshold 使探测在失败后被视为成功的最小连续成功次数。 默认值是 1。 对于运行情况和启动探测,该值必须为 1。 最小值为 1

探测操作属性

可以通过三种方式使用探测检查应用实例。 每个探测必须定义以下探测操作之一:

  • HTTPGetAction

    针对指定路径上的应用实例执行 HTTP GET 请求。 如果响应的状态代码大于或等于 200 且小于 400,则诊断被视为成功。

    属性名称 说明
    scheme 用于连接到主机的方案。 默认值为 HTTP
    path 在应用实例的 HTTP 服务器上访问的路径,例如 /healthz
  • ExecAction

    在应用实例内执行指定的命令。 如果命令退出且状态代码为 0,则诊断被视为成功。

    属性名称 说明
    command 要在应用实例中执行的命令。 该命令的工作目录是应用实例文件系统中的根目录 (/)。 由于该命令是使用 exec 运行的而不是在 shell 中运行,因此 shell 指令将不起作用。 若要使用 shell,请显式调用 shell。 退出状态为 0 被视为活动/正常,如果非零,则被视为不正常。
  • TCPSocketAction

    针对应用实例执行 TCP 检查。

    TCPSocketAction 操作没有可用的属性。

自定义应用程序

使用以下步骤通过 Azure 门户自定义应用程序。

  1. 在“设置”下选择“应用”,然后从列表中选择应用程序。

    显示“应用”页的 Azure 门户屏幕截图。

  2. 在左侧导航窗格中选择“配置”,选择“运行状况探测”,然后指定运行状况探测属性。

    Azure 门户中“配置”页的屏幕截图,其中显示了“运行状况探测”选项卡。

  3. 若要设置终止宽限期,请选择“常规设置”,并在“终止宽限期”框中指定值。

    Azure 门户中“配置”页的屏幕截图,其中显示了“常规设置”选项卡。

最佳实践

在将运行状况探测添加到 Azure Spring Apps 时,请使用以下最佳做法:

  • 将运行情况探测和就绪情况探测一起使用。 Azure Spring Apps 同时提供两种服务发现方法。 当就绪情况探测失败时,只会从 Kubernetes 服务发现中删除应用实例。 正确配置的运行情况探测可以从 Eureka 服务发现中删除有问题的应用实例,以避免意外情况。 有关服务发现的详细信息,请参阅发现和注册 Spring Boot 应用程序

  • 当应用实例启动时,将在经过 initialDelaySeconds 指定的延迟之后进行首次检查。 后续检查根据 periodSeconds 指定的周期时长定期进行。 如果应用多次无法根据 failureThreshold 的指定响应请求,则重启应用实例。 请确保应用程序的启动速度足够快,或者请更新这些参数,使总超时 initialDelaySeconds + periodSeconds * failureThreshold 长于应用程序的启动时间。

  • 对于 Spring Boot 应用程序,Spring Boot 附带了运行状况组支持,使开发人员能够选择一部分的运行状况指示器,并将其分组到单个相关运行状况状态下。 有关详细信息,请参阅 Spring 博客上的 Liveness and Readiness Probes with Spring Boot(Spring Boot 的运行情况探测和就绪情况探测)。

    以下示例演示了 Spring Boot 的运行情况探测:

    "probe": {
           "initialDelaySeconds": 30,
           "periodSeconds": 10,
           "timeoutSeconds": 1,
           "failureThreshold": 30,
           "successThreshold": 1,
           "probeAction": {
               "type": "HTTPGetAction",
               "scheme": "HTTP",
               "path": "/actuator/health/liveness"
           }
       }
    

    以下示例演示了 Spring Boot 的就绪情况探测:

    "probe": {
           "initialDelaySeconds": 0,
           "periodSeconds": 10,
           "timeoutSeconds": 1,
           "failureThreshold": 3,
           "successThreshold": 1,
           "probeAction": {
               "type": "HTTPGetAction",
               "scheme": "HTTP",
               "path": "/actuator/health/readiness"
           }
       }
    

常见问题

本部分提供有关在 Azure Spring Apps 中使用运行状况探测的常见问题解答。

  • 创建具有自定义运行状况探测的应用程序时,我收到了 400 响应。 这是什么意思呢?

    错误消息会指出预配失败是由哪个探测造成的。 请确保运行状况探测规则正确,并且超时足够长,使应用程序有时间进入运行状态。

  • 现有应用程序的默认探测设置是什么?

    以下示例演示了默认设置:

    "startupProbe": null,
    "livenessProbe": {
        "disableProbe": false,
        "failureThreshold": 3,
        "initialDelaySeconds": 300,
        "periodSeconds": 10,
        "probeAction": {
            "type": "TCPSocketAction"
        },
        "successThreshold": 1,
        "timeoutSeconds": 3
    },
    "readinessProbe": {
        "disableProbe": false,
        "failureThreshold": 3,
        "initialDelaySeconds": 0,
        "periodSeconds": 5,
        "probeAction": {
            "type": "TCPSocketAction"
        },
        "successThreshold": 1,
        "timeoutSeconds": 3
    }
    

后续步骤