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

监视应用程序的运行状况是管理和升级部署的重要信号。 Azure 虚拟机规模集支持滚动升级(包括自动 OS 映像升级自动 VM 来宾修补),后者依赖对各实例的运行状况监视来升级部署。

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

先决条件

本文假定你熟悉以下内容:

注意

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

注意

只能将一个运行状况监视源用于虚拟机规模集,即应用程序运行状况扩展或运行状况探测。 如果启用这两个选项,则需要在使用实例修复或自动 OS 升级等业务流程服务之前移除一个。

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

应用程序运行状况扩展将部署在虚拟机规模集实例中,并从规模集实例报告应用程序运行状况。 该扩展在本地应用程序终结点上进行探测,并将根据从应用程序接收的 TCP/HTTP(S) 响应更新运行状况。 Azure 使用此运行状况来对运行不正常的实例启动修复,并确定实例是否有资格执行升级操作。

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

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

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

功能 二进制运行状况状态 丰富运行状况状态
可用的运行状况状态 两种可用状态:“正常”、“不正常 四种可用状态:“正常”、“不正常”、“正在初始化”、“未知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 协议:应用程序运行状况将从“正在初始化”转换为“不正常

未知状态

此状态仅适用于丰富运行状况状态。 “未知”状态仅针对“http”或“https”探测报告,在以下情况下发生:

  • 应用程序返回非 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

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

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

二进制运行状况状态

下面的示例将应用程序运行状况扩展(名为 myHealthExtension)添加到 extensionProfile(位于基于 Windows 的规模集的规模集模型中)。

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

PUT on `/subscriptions/subscription_id/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachineScaleSets/myScaleSet/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 编辑已部署的扩展。

升级虚拟机以安装扩展。

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

丰富运行状况状态

以下示例将应用程序运行状况 - 丰富状态扩展(名为 myHealthExtension)添加到基于 Windows 的规模集的规模集模型中的 extensionProfile

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

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

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

升级虚拟机以安装扩展。

POST on `/subscriptions/<subscriptionId>/resourceGroups/<myResourceGroup>/providers/Microsoft.Compute/virtualMachineScaleSets/< myScaleSet >/manualupgrade?api-version=2022-08-01`
{
  "instanceIds": ["*"]
}

疑难解答

查看 VMHealth – 单个实例

Get-AzVmssVM 
  -InstanceView `
  -ResourceGroupName <rgName> `
  -VMScaleSetName <vmssName> `
  -InstanceId <instanceId> 

查看 VMHealth - 批量调用

这仅适用于具有统一编排的虚拟机规模集。

GET on `/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Compute/virtualMachineScaleSets/<vmssName>/virtualMachines/?api-version=2022-03-01&$expand=instanceview`

未显示运行状况状态

如果运行状况状态未显示在 Azure 门户中或无法通过 GET 调用显示,请检查以确保虚拟机升级到最新模型。 如果虚拟机未使用最新模型,请升级虚拟机,之后将显示运行状况状态。

扩展执行输出日志

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

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

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

后续步骤

了解如何在虚拟机规模集上部署应用程序