你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
如何为 Azure Spring Apps 中托管的应用配置运行状况探测和正常终止期
注意
基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告。
标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。 有关详细信息,请参阅将 Azure Spring Apps 标准消耗和专用计划迁移到 Azure 容器应用。
本文适用于:✅ Java ✅ C#
本文适用于:✅ 基本计划/标准计划 ✅ 企业计划
本文介绍如何使用运行状况探测和正常终止期自定义在 Azure Spring Apps 中运行的应用。
探测是 Azure Spring Apps 在应用实例上定期执行的诊断活动。 为了执行诊断,Azure Spring Apps 将执行以下操作之一:
- 在应用实例中执行你选择的任意命令。
- 建立 TCP 套接字连接。
- 发出 HTTP 请求。
Azure Spring Apps 为每个应用程序提供默认运行状况探测规则。 本文将介绍如何使用三种运行状况探测自定义应用程序:
运行情况探测确定何时重启应用程序。 例如,运行情况探测可以识别死锁,例如当应用程序正在运行但无法取得进展时。 重启处于死锁状态的应用程序能使该应用程序在出错的情况下仍然可用。
就绪情况探测确定应用实例何时准备好开始接受流量。 例如,就绪情况探测可以控制哪些应用实例用作应用程序的后端。 当应用实例未准备就绪时,将从 Kubernetes 服务发现中删除该实例。 有关详细信息,请参阅发现并注册 Spring Boot 应用程序。 有关使用企业计划的服务发现的详细信息,请参阅使用 Tanzu Service Registry。
启动探测确定应用程序何时已启动。 在成功启动之前,启动探测会禁用运行情况和就绪情况检查,确保运行情况和就绪情况探测不会干扰应用程序启动。 可以使用启动探测器对启动速度缓慢的应用程序执行运行情况检查,防止应用在启动并运行之前终止。
先决条件
带有 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 门户自定义应用程序。
最佳实践
在将运行状况探测添加到 Azure Spring Apps 时,请使用以下最佳做法:
将运行情况探测和就绪情况探测一起使用。 Azure Spring Apps 同时提供两种服务发现方法。 当就绪情况探测失败时,只会从 Kubernetes 服务发现中删除应用实例。 正确配置的运行情况探测可以从 Eureka 服务发现中删除有问题的应用实例,以避免意外情况。 有关服务发现的详细信息,请参阅发现和注册 Spring Boot 应用程序。 有关使用企业计划的服务发现的详细信息,请参阅使用 Tanzu Service Registry。
当应用实例启动时,将在经过
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 }