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

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

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

应用程序运行状况监视也可用于虚拟机规模集,并有助于启用滚动升级自动 OS 映像升级等功能。 若要在规模集上获得规模、可用性和灵活性的附加优势,可以将 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,探测响应正文:{"ApplicationHealthState": "Healthy"}
http/https 不正常 若要发送“不正常”信号,应用程序应返回探测响应,其中的探测响应代码:状态 2xx,探测响应正文:{"ApplicationHealthState": "Unhealthy"}
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 或更高 date
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) string
typeHandlerVersion 1.0 string

设置

名称 值/示例 数据类型
协议 httphttpstcp string
port 协议为 httphttps 时为可选,协议为 tcp 时为必需 int
requestPath 协议为 httphttps 时为必需,协议为 tcp 时为不允许 string
intervalInSeconds 可选,默认值为 5 秒。 此设置是每次运行状况探测之间的间隔。 例如,如果 intervalInSeconds == 5,则会每隔 5 秒向本地应用程序终结点发送一次探测。 int
numberOfProbes 可选,默认值为 1。 此设置是更改运行状况所需的连续探测数。 例如,如果 numberOfProbles == 3,则需要连续 3 个“正常”信号才能将运行状况从“运行不正常”更改为“正常”状态。 相同的要求适用于将运行状况更改为“运行不正常”状态。 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 或更高 date
publisher Microsoft.ManagedServices string
type ApplicationHealthLinux (Linux)、ApplicationHealthWindows (Windows) string
typeHandlerVersion 2.0 string

设置

名称 值/示例 数据类型
协议 httphttpstcp string
port 协议为 httphttps 时为可选,协议为 tcp 时为必需 int
requestPath 协议为 httphttps 时为必需,协议为 tcp 时为不允许 string
intervalInSeconds 可选,默认值为 5 秒。 此设置是每次运行状况探测之间的间隔。 例如,如果 intervalInSeconds == 5,则会每隔 5 秒向本地应用程序终结点发送一次探测。 int
numberOfProbes 可选,默认值为 1。 此设置是更改运行状况所需的连续探测数。 例如,如果 numberOfProbles == 3,则需要 3 个连续的“正常”信号才能将运行状况从“不正常”/“未知”更改为“正常”状态。 相同的要求适用于将运行状况更改为“不正常”或“未知”状态。 int
gracePeriod 可选,默认值 = intervalInSeconds * numberOfProbes;最大宽限期为 7200 秒 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

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