将应用程序运行状况扩展与 Azure 虚拟机配合使用

监视应用程序运行状况是管理 VM 的重要信号。 Azure 虚拟机支持自动 VM 来宾修补,它依赖于对单个实例的运行状况监视来安全地更新 VM。

本文介绍如何使用两种应用程序运行状况扩展(二进制运行状况状态丰富运行状况状态)来监视部署在 Azure 虚拟机上的应用程序的运行状况。

虚拟机规模集上还提供了应用程序运行状况监视,它可帮助启用一些功能,例如滚动升级自动 OS 映像升级自动实例修复。 若要在规模集上获得规模、可用性和灵活性的附加优势,可以将 VM 附加到现有的规模集创建新的规模集

注释

尝试 VM 辅助,以便更快地进行诊断。 建议运行 VM assist for WindowsVM assist for Linux。 这些基于脚本的诊断工具可帮助你识别影响 Azure VM 来宾代理和整体 VM 运行状况的常见问题。

先决条件

本文假定你熟悉 Azure 虚拟机扩展

注意

应用程序运行状况扩展应在配置的端口 tcp 或请求路径 http/https 上收到一致的探测响应,才能将虚拟机标记为“正常”。 如果没有应用程序在 VM 上运行,或者你无法配置探测响应,则 VM 将显示为“不正常”(二进制运行状况状态)或“未知”(丰富运行状况状态)。 如需向本地终结点发出的运行状况探测响应的示例,请参阅应用程序运行状况示例

何时使用应用程序运行状况扩展

应用程序运行状况扩展会从虚拟机内部报告应用程序运行状况。 该扩展在本地应用程序终结点上进行探测,并根据从应用程序接收的 TCP/HTTP(S) 响应更新运行状况。 Azure 使用此运行状况在自动 VM 来宾修补期间监视和检测修补失败的情况。

该扩展从虚拟机内报告运行状况,可以在无法使用外部探测(如 Azure 负载均衡器运行状况探测)的情况下使用。

应用程序运行状况是客户提供的关于 VM 中运行的应用程序状态的信号。 应用程序运行状况不同于资源运行状况,它是一种平台提供的信号,用于报告影响 VM 性能的服务级别事件。

二进制运行状况状态与丰富运行状况状态

应用程序运行状况扩展有两个选项可用:二进制运行状况状态丰富运行状况状态。 下表重点介绍了两个选项之间的一些关键差异。 有关常规建议,请参阅本部分的末尾。

功能 二进制运行状况状态 丰富运行状况状态
可用的运行状况状态 两种可用状态:“正常”、“不正常 四种可用状态:“正常”、“不正常”、“正在初始化”、“未知1
发送运行状况信号 运行状况信号是通过 HTTP/HTTPS 响应代码或 TCP 连接发送的。 HTTP/HTTPS 协议上的运行状况信号通过探测响应代码和响应正文发送。 通过 TCP 协议传输的运行状况信号在二进制运行状况状态中保持不变。
识别“不正常”实例 如果未从应用程序收到“正常”信号,实例将自动进入“不正常”状态。 不正常实例可能表示扩展配置存在问题(例如,无法访问终结点)或应用程序存在问题(例如,出现非 200 状态代码) 仅当应用程序发出“不正常”探测响应时,实例才会进入“不正常”状态。 用户负责实施自定义逻辑来识别和标记具有“不正常”应用程序2的实例。 具有不正确扩展设置(例如,无法访问终结点)或无效的运行状况探测响应的实例将处于“未知”状态2
新创建的实例的“正在初始化”状态 正在初始化”状态不可用。 新创建的实例可能需要一些时间才能进入稳定状态。 初始化”状态允许新创建的实例先进入稳定的运行状况状态,然后再将运行状况状态显示为“正常”、“不正常”或“未知”。
HTTP/HTTPS 协议 支持 支持
TCP 协议 支持 有限支持 -“未知”状态在 TCP 协议上不可用。 有关 TCP 上的运行状况状态行为,请参阅丰富运行状况状态协议表

1未知”状态在 TCP 协议上不可用。 2 仅适用于 HTTP/HTTPS 协议。 TCP 协议遵循与二进制运行状况状态中相同的识别不正常的实例的过程。

如果出现以下情况,使用二进制运行状况状态

  • 你对配置自定义逻辑来识别和标记不正常的实例不感兴趣
  • 对于新创建的实例不需要“正在初始化”宽限期

如果出现以下情况,使用丰富运行状况状态

  • 通过 HTTP/HTTPS 协议发送运行状况信号,并且可以通过探测响应正文提交运行状况信息
  • 你想要使用自定义逻辑来标识和标记不正常的实例
  • 你希望设置一个初始化宽限期,让新创建的实例可以进入稳定的运行状况状态

二进制运行状况状态

二进制运行状况状态报告包含两种运行状况状态:“正常”和“不正常”。 下表简要介绍了如何配置运行状况状态。

HTTP/HTTPS 协议

协议 运行状况状态 说明
http/https 正常 要发送正常信号,应用程序应返回 200 响应代码
http/https 不正常 如果未从应用程序收到 200 响应代码,则该实例会被标记为“不正常”。

TCP 协议

协议 运行状况状态 说明
TCP 正常 若要发送“正常”信号,必须使用提供的应用程序终结点成功握手。
TCP 不正常 如果提供的应用程序终结点发生失败或不完整的握手,则实例会被标记为“不正常”。

导致“不正常”状态的一些常见情况包括:

  • 当应用程序终结点返回非 200 状态代码时
  • 当虚拟机中没有配置应用程序终结点来提供应用程序运行状态时
  • 当应用程序终结点配置不正确
  • 当应用程序终结点不可访问时

丰富运行状况状态

丰富运行状况状态报告包含四种运行状况状态:“正在初始化”、“正常”、“不正常”和“未知”。 下表简要介绍了如何配置每种运行状况状态。

HTTP/HTTPS 协议

协议 运行状况状态 说明
http/https 正常 若要发送“正常”信号,应用程序应返回探测响应,其中的探测响应代码:状态 2xx,探测响应正文:
http/https 不正常 若要发送“不正常”信号,应用程序应返回探测响应,其中的探测响应代码:状态 2xx,探测响应正文:
http/https 正在初始化 实例在扩展启动时自动进入“正在初始化”状态。 有关详细信息,请参阅“正在初始化”状态
http/https 未知 在以下情况下,可能会出现“未知”状态:应用程序返回非 2xx 状态代码时、探测请求超时时、无法访问应用程序终结点或配置错误时、响应正文中为 ApplicationHealthState 提供缺失值或无效值时,或宽限期到期时。 有关详细信息,请参阅“未知”状态

TCP 协议

协议 运行状况状态 说明
TCP 正常 若要发送“正常”信号,必须使用提供的应用程序终结点成功握手。
TCP 不正常 如果提供的应用程序终结点发生失败或不完整的握手,则实例会被标记为“不正常”。
TCP 正在初始化 实例在扩展启动时自动进入“正在初始化”状态。 有关详细信息,请参阅“正在初始化”状态

“正在初始化”状态

此状态仅适用于丰富运行状况状态。 “正在初始化”状态仅在扩展开始时间发生一次,并且可由扩展设置 gracePeriodnumberOfProbes 进行配置。

在扩展启动时,应用程序运行状况会保持“正在初始化”状态,直到出现以下两种情况之一:

  • 通过numberOfProbes 配置时连续多次报告相同的运行状况状态(“正常”或“不正常”)
  • gracePeriod 过期

如果连续报告相同的运行状况状态(“正常”或“不正常”),应用程序运行状况将从“正在初始化”状态转换为报告的运行状况状态(“正常”或“不正常”)。

示例

如果 numberOfProbes = 3,则表示:

  • 若要从“正在初始化”转换为“正常”状态:应用程序运行状况扩展必须通过 HTTP/HTTPS 或 TCP 协议接收三个连续的“正常”信号
  • 若要从“正在初始化”转换为“不正常”状态:应用程序运行状况扩展必须通过 HTTP/HTTPS 或 TCP 协议接收三个连续的“不正常”信号

如果 gracePeriod 在应用程序报告连续运行状况状态之前过期,则将按以下方式确定实例运行状况:

  • HTTP/HTTPS 协议:应用程序运行状况从“正在初始化”转换为“未知
  • TCP 协议:应用程序运行状况从“正在初始化”转换为“不正常

未知状态

未知”状态仅适用于丰富运行状况状态。 此状态仅在 httphttps 探测中报告,并在以下情况中出现:

  • 应用程序返回非 2xx 状态代码时
  • 探测请求超时时
  • 应用程序终结点无法访问或配置不正确时
  • 响应正文中为 ApplicationHealthState 提供缺失或无效值时
  • 宽限期到期时

二进制运行状况状态的扩展架构

以下 JSON 显示应用程序运行状况扩展的架构。 扩展至少需要“tcp”、“http”或“https”请求,且各自具有相关的端口或请求路径。

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "1.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1
          }
        }
      }
    ]
  }
} 

属性值

名称 值/示例 数据类型
apiVersion 2018-10-01 或更高 日期
发布服务器 Microsoft.ManagedServices 字符串
类型 ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) 字符串
typeHandlerVersion 1.0 字符串

设置

名称 值/示例 数据类型
协议 httphttpstcp 字符串
移植 协议为 httphttps 时为可选,协议为 tcp 时为必需 整数 (int)
请求路径 协议为 httphttps 时为必需,协议为 tcp 时为不允许 字符串
时间间隔(秒) 可选,默认值为 5 秒。 此设置是每次运行状况探测之间的间隔。 例如,如果 intervalInSeconds == 5,则会每隔 5 秒向本地应用程序终结点发送一次探测。 最小值为 5 秒,最大值为 60 秒。 整数 (int)
探试次数 可选,默认值为 1。 此设置是更改运行状况所需的连续探测数。 例如,如果 numberOfProbles == 3,则需要连续 3 个“正常”信号才能将运行状况从“运行不正常”更改为“正常”状态。 相同的要求适用于将运行状况更改为“运行不正常”状态。 最小值为 1 个探测,最大值为 24 个探测。 整数 (int)

丰富运行状况状态的扩展架构

以下 JSON 显示了丰富运行状况状态扩展的架构。 扩展至少需要“http”或“https”请求,且各自具有相关的端口或请求路径。 另外也支持 TCP 探测,但它无法通过探测响应正文设置 ApplicationHealthState,也无法使用“未知”状态。

{
  "extensionProfile" : {
     "extensions" : [
      {
        "name": "HealthExtension",
        "properties": {
          "publisher": "Microsoft.ManagedServices",
          "type": "<ApplicationHealthLinux or ApplicationHealthWindows>",
          "autoUpgradeMinorVersion": true,
          "typeHandlerVersion": "2.0",
          "settings": {
            "protocol": "<protocol>",
            "port": <port>,
            "requestPath": "</requestPath>",
            "intervalInSeconds": 5,
            "numberOfProbes": 1,
            "gracePeriod": 600
          }
        }
      }
    ]
  }
} 

属性值

名称 值/示例 数据类型
apiVersion 2018-10-01 或更高 日期
发布服务器 Microsoft.ManagedServices 字符串
类型 ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) 字符串
typeHandlerVersion 2.0 字符串

设置

名称 值/示例 数据类型
协议 httphttpstcp 字符串
移植 协议为 httphttps 时为可选,协议为 tcp 时为必需 整数 (int)
请求路径 协议为 httphttps 时为必需,协议为 tcp 时为不允许 字符串
时间间隔(秒) 可选,默认值为 5 秒。 此设置是每次运行状况探测之间的间隔。 例如,如果 intervalInSeconds == 5,则会每隔 5 秒向本地应用程序终结点发送一次探测。 最小值为 5 秒,最大值为 60 秒。 整数 (int)
探试次数 可选,默认值为 1。 此设置是更改运行状况所需的连续探测数。 例如,如果 numberOfProbles == 3,则需要 3 个连续的“正常”信号才能将运行状况从“不正常”/“未知”更改为“正常”状态。 相同的要求适用于将运行状况更改为“不正常”或“未知”状态。 最小值为 1 个探测,最大值为 24 个探测。 整数 (int)
宽限期 可选,默认值 = intervalInSeconds * numberOfProbes;最大宽限期为 14400 秒 整数 (int)

部署应用程序运行状况扩展

可以使用多种方法将应用程序运行状况扩展部署到 VM,如下面的示例所详述。

二进制运行状况状态

以下示例将名为 myHealthExtension 的应用程序运行状况扩展添加到了一个基于 Windows 的虚拟机。

还可以使用此示例通过发出 PATCH 调用而不是 PUT,将现有扩展从丰富运行状况状态更改为二进制运行状况。

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>", 
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "1.0",
    "settings": {
      "protocol": "<protocol>",
      "port": <port>,
      "requestPath": "</requestPath>"
    }
  }
}

使用 PATCH 编辑已部署的扩展。

丰富运行状况状态

以下示例将应用程序运行状况 - 丰富状态扩展(名称为 myHealthExtension)添加到基于 Windows 的虚拟机。

还可以使用此示例通过发出 PATCH 调用而不是 PUT,将现有扩展从二进制升级到丰富运行状况状态。

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/extensions/myHealthExtension?api-version=2018-10-01`
{
  "name": "myHealthExtension",
  "location": "<location>", 
  "properties": {
    "publisher": "Microsoft.ManagedServices",
    "type": "ApplicationHealthWindows",
    "autoUpgradeMinorVersion": true,
    "typeHandlerVersion": "2.0",
    "settings": {
      "requestPath": "</requestPath>",
      "intervalInSeconds": <intervalInSeconds>,
      "numberOfProbes": <numberOfProbes>,
      "gracePeriod": <gracePeriod>
    }
  }
}

使用 PATCH 编辑已部署的扩展。

疑难解答

需要有关配置探测响应的帮助

如需向本地终结点发出的运行状况探测响应的示例,请参阅应用程序运行状况示例

查看 VMHealth

GET https://management.chinacloudapi.cn/subscriptions/{subscription-id}/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM/instanceView?api-version=2023-07-01

示例响应(查看“vmHealth”对象了解最新的 VM 运行状况)

"vmHealth": {
    "status": {
      "code": "HealthState/unknown",
      "level": "Warning",
      "displayStatus": "The VM health is unknown",
      "time": "2023-12-04T22:25:39+00:00"
    }
}

扩展执行输出日志

扩展执行输出将记录到在以下目录中发现的文件:

C:\WindowsAzure\Logs\Plugins\Microsoft.ManagedServices.ApplicationHealthWindows\<version>\
/var/lib/waagent/Microsoft.ManagedServices.ApplicationHealthLinux-<extension_version>/status
/var/log/azure/applicationhealth-extension

日志还会定期捕获应用程序运行状况状态。