你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过 Azure CLI 创建一个使用基于代理的故障的混沌试验

可以使用混沌试验,通过在受控环境中引发一些故障,来验证应用程序是否可以应对这些故障。 在本文中,你将使用混沌试验和 Azure Chaso Studio,在 Linux 虚拟机 (VM) 上引发高 CPU 使用率事件。 运行此试验有助于防范应用程序耗尽资源。

可使用这些相同的步骤来设置和运行针对任何基于代理的故障的试验。 基于代理的故障需要安装和安装混沌代理。 服务直接故障,直接针对 Azure 资源运行,无需任何检测。

先决条件

打开 Azure Cloud Shell

Azure Cloud Shell 是免费的交互式 shell,可以使用它运行本文中的操作步骤。 它预安装有常用 Azure 工具并将其配置与帐户一起使用。

若要打开 Cloud Shell,请在代码块的右上角选择“试一试”。 也可以在单独的浏览器标签页中通过转到 Bash 打开 Cloud Shell。 选择“复制”以复制代码块,将其粘贴到 Cloud Shell 中,然后选择“Enter”来运行它

如果你希望在本地安装并使用 CLI,则本文需要 Azure CLI 版本 2.0.30 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

注意

这些说明使用 Cloud Shell 中的 Bash 终端。 如果在本地或在 PowerShell 终端中运行 CLI,某些命令可能无法按说明正常工作。

将托管标识分配给虚拟机

在 VM 上设置 Chaos Studio 之前,请将用户分配的托管标识分配给计划在其中安装代理的每个虚拟机或虚拟机规模集。 使用 az vm identity assignaz vmss identity assign 命令。 将 $VM_RESOURCE_ID/$VMSS_RESOURCE_ID 替换为要添加为混沌目标的 VM 的资源 ID。 将 $MANAGED_IDENTITY_RESOURCE_ID 替换为用户分配的托管标识的资源 ID。

虚拟机

az vm identity assign --ids $VM_RESOURCE_ID --identities $MANAGED_IDENTITY_RESOURCE_ID

虚拟机规模集

az vmss identity assign --ids $VMSS_RESOURCE_ID --identities $MANAGED_IDENTITY_RESOURCE_ID

在虚拟机上启用 Chaos Studio

除非 VM 已事先添加到 Chaos Studio,否则 Chaos Studio 无法向 VM 注入故障。 若要将 VM 添加到 Chaos Studio,请在资源上创建目标和功能。 然后,安装混沌代理。

虚拟机有两种目标类型。 一种目标类型用于启用服务直接故障(其中不需要代理)。 另一种目标类型用于启用基于代理的故障(这需要安装代理)。 混沌代理是作为 VM 扩展安装在 VM 上的应用程序。 你使用它在来宾操作系统中注入错误。

启用混沌目标和功能

接下来,在每个虚拟机或虚拟机规模集上设置 Microsoft-Agent 目标,以便指定供代理用来连接到 Chaos Studio 的用户分配的托管标识。 在此示例中,我们对所有 VM 使用一个托管标识。 必须通过 REST API 创建目标。 在此示例中,我们使用 az rest CLI 命令来执行 REST API 调用。

  1. 修改下面的 JSON,将 $USER_IDENTITY_CLIENT_ID 替换为你的托管标识的客户端 ID。 可以在你创建的用户分配托管标识的 Azure 门户概述中找到客户端 ID。 将 $USER_IDENTITY_TENANT_ID 替换为你的 Azure 租户 ID。 可以在 Azure 门户中“租户信息”下的“Microsoft Entra ID”下找到它。 将该 JSON 作为一个文件保存到运行 Azure CLI 的同一位置。 在 Cloud Shell 中,可以拖放 JSON 文件以上传它。

    {
      "properties": {
        "identities": [
          {
            "clientId": "$USER_IDENTITY_CLIENT_ID",
            "tenantId": "$USER_IDENTITY_TENANT_ID",
            "type": "AzureManagedIdentity"
          }
        ]
      }
    }
    
  2. 通过将 $RESOURCE_ID 替换为目标虚拟机或虚拟机规模集的资源 ID 来创建目标。 将 target.json 替换为在上一步骤中创建的 JSON 文件的名称。

    az rest --method put --uri https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-Agent?api-version=2023-11-01 --body @target.json --query properties.agentProfileId -o tsv
    

    如果你收到 PowerShell 分析错误,请根据本教程的建议切换到 Bash 终端,或者将引用的 JSON 文件括在单引号 (--body '@target.json') 中。

  3. 复制此命令返回的 agentProfileId 的 GUID,以便在稍后的步骤中使用

  4. 通过将 $RESOURCE_ID 替换为目标虚拟机或虚拟机规模集的资源 ID 来创建功能。 将 $CAPABILITY 替换为要启用 的故障功能的 名称(例如 CPUPressure-1.0)。

    az rest --method put --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-Agent/capabilities/$CAPABILITY?api-version=2023-11-01" --body "{\"properties\":{}}"
    

    例如,如果你要启用 CPU 压力功能:

    az rest --method put --url "https://management.azure.com/subscriptions/b65f2fec-d6b2-4edd-817e-9339d8c01dc4/resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myVM/providers/Microsoft.Chaos/targets/Microsoft-Agent/capabilities/CPUPressure-1.0?api-version=2023-11-01" --body "{\"properties\":{}}"
    

安装 Chaos Studio 虚拟机扩展

混沌代理是在虚拟机或虚拟机规模集实例中运行的、执行基于代理的故障的应用程序。 在安装过程中,配置:

  • 具有代理应该用来向 Chaos Studio 进行身份验证的托管标识的代理。
  • 你创建的 Microsoft 代理目标的配置文件 ID。
  • (可选)一个 Application Insights 检测密钥,使代理能够将诊断事件发送到 Application Insights。
  1. 在开始之前,请确保具有以下详细信息:

    • agentProfileId:创建目标时返回的属性。 如果你没有此属性,可以运行 az rest --method get --uri https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-Agent?api-version=2023-11-01 并复制 agentProfileId 属性。
    • ClientId:在目标中使用的用户分配的托管标识的客户端 ID。 如果你没有此属性,可以运行 az rest --method get --uri https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-Agent?api-version=2023-11-01 并复制 clientId 属性。
    • (可选)AppInsightsKey:Application Insights 组件的检测密钥,可以在门户的“Application Insights”页中的“概要”下找到。
  2. 安装 Chaos Studio VM 扩展。 将 $VM_RESOURCE_ID 替换为你的 VM 的资源 ID,或将 $SUBSCRIPTION_ID$RESOURCE_GROUP$VMSS_NAME 替换为你的虚拟机规模集的这些属性。 将 $AGENT_PROFILE_ID 替换为代理配置文件 ID。 将 $USER_IDENTITY_CLIENT_ID 替换为你的托管标识的客户端 ID。 将 $APP_INSIGHTS_KEY 替换为你的 Application Insights 检测密钥。 如果未使用 Application Insights,请移除该键/值对。

    默认代理虚拟机扩展配置的完整列表

    下面是用户所需的最低代理 VM 扩展配置

    {
        "profile": "$AGENT_PROFILE_ID",
        "auth.msi.clientid": "$USER_IDENTITY_CLIENT_ID"
    }
    

    下面是代理 VM 扩展配置的所有值

     {
        "profile": "$AGENT_PROFILE_ID",
        "auth.msi.clientid": "$USER_IDENTITY_CLIENT_ID",
        "appinsightskey": "$APP_INSIGHTS_KEY",
        "overrides": {
            "region": string, default to be null
            "logLevel": {
                "default" : string , default to be Information
                },
            "checkCertRevocation": boolean, default to be false.
        }
    }
    

    在虚拟机上安装代理

    Windows

    az vm extension set --ids $VM_RESOURCE_ID --name ChaosWindowsAgent --publisher Microsoft.Azure.Chaos --version 1.0 --settings '{"profile": "$AGENT_PROFILE_ID", "auth.msi.clientid":"$USER_IDENTITY_CLIENT_ID", "appinsightskey":"$APP_INSIGHTS_KEY"{"Overrides": "CheckCertRevocation" = true}}'
    

    Linux

    az vm extension set --ids $VM_RESOURCE_ID --name ChaosLinuxAgent --publisher Microsoft.Azure.Chaos --version 1.0 --settings '{"profile": "$AGENT_PROFILE_ID", "auth.msi.clientid":"$USER_IDENTITY_CLIENT_ID", "appinsightskey":"$APP_INSIGHTS_KEY"{"Overrides": "CheckCertRevocation" = true}}'
    

    在虚拟机规模集上安装代理

    Windows

    az vmss extension set --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --vmss-name $VMSS_NAME --name ChaosWindowsAgent --publisher Microsoft.Azure.Chaos --version 1.0 --settings '{"profile": "$AGENT_PROFILE_ID", "auth.msi.clientid":"$USER_IDENTITY_CLIENT_ID", "appinsightskey":"$APP_INSIGHTS_KEY"{"Overrides": "CheckCertRevocation" = true}}'
    

    Linux

    az vmss extension set --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --vmss-name $VMSS_NAME --name ChaosLinuxAgent --publisher Microsoft.Azure.Chaos --version 1.0 --settings '{"profile": "$AGENT_PROFILE_ID", "auth.msi.clientid":"$USER_IDENTITY_CLIENT_ID", "appinsightskey":"$APP_INSIGHTS_KEY"{"Overrides": "CheckCertRevocation" = true}}'
    
  3. 如果你要设置虚拟机规模集,请验证实例是否已升级到最新模型。 根据需要升级模型中的所有实例。

    az vmss update-instances -g $RESOURCE_GROUP -n $VMSS_NAME --instance-ids *
    

创建试验

成功部署 VM 后,现在可以创建试验。 混沌试验定义要针对目标资源执行的操作。 这些操作是按顺序步骤组织和运行的。 混沌试验还定义了要针对分支执行的操作(并行运行)。

  1. 使用下面的 JSON 示例为基础开始构建你的试验 JSON。 使用创建试验 API故障库修改 JSON,以响应你要运行的试验。

    {
      "identity": {
        "type": "SystemAssigned"
      },
      "location": "centralus",
      "properties": {
        "selectors": [
          {
            "id": "Selector1",
            "targets": [
              {
                "id": "/subscriptions/b65f2fec-d6b2-4edd-817e-9339d8c01dc4/resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myWindowsVM/providers/Microsoft.Chaos/targets/Microsoft-Agent",
                "type": "ChaosTarget"
              },
              {
                "id": "/subscriptions/b65f2fec-d6b2-4edd-817e-9339d8c01dc4/resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myLinuxVM/providers/Microsoft.Chaos/targets/Microsoft-Agent",
                "type": "ChaosTarget"
              }
            ],
            "type": "List"
          }
        ],
        "steps": [
          {
            "branches": [
              {
                "actions": [
                  {
                    "duration": "PT10M",
                    "name": "urn:csci:microsoft:agent:cpuPressure/1.0",
                    "parameters": [
                      {
                        "key": "pressureLevel",
                        "value": "95"
                      }
                    ],
                    "selectorId": "Selector1",
                    "type": "continuous"
                  }
                ],
                "name": "Branch 1"
              }
            ],
            "name": "Step 1"
          }
        ]
      }
    }
    

    如果你要针对虚拟机规模集运行,请修改故障参数,以包含要用作目标的实例编号:

    "parameters": [
      {
        "key": "pressureLevel",
        "value": "95"
      },
      {
        "key": "virtualMachineScaleSetInstances",
        "value": "[0,1,2]"
      }
    ]
    

    在 Azure 门户中转到你的虚拟机规模集并选择“实例”,可以识别规模集实例编号。 实例名称以实例编号结尾。

  2. 使用 Azure CLI 创建试验。 将 $SUBSCRIPTION_ID$RESOURCE_GROUP$EXPERIMENT_NAME 替换为你的试验的属性。 请确保已保存并上传你的试验 JSON。 将 experiment.json 更新为你的 JSON 文件名。

    az rest --method put --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME?api-version=2023-11-01 --body @experiment.json
    

    每个试验将创建对应的系统分配的托管标识。 请记下响应中此标识的主体 ID,以便在下一步骤中使用。

向试验授予对你的虚拟机的权限

创建混沌试验时,Chaos Studio 会创建系统分配的托管标识,用于针对目标资源执行故障。 若要成功运行试验,必须向此标识提供目标资源的适当权限。 执行基于代理的故障需要“读取者”角色。 其他没有 */Read 权限的角色(例如“虚拟机参与者”)不会授予对基于代理的故障的适当权限。

使用以下命令向试验授予对你的虚拟机或虚拟机规模集的访问权限。 将 $EXPERIMENT_PRINCIPAL_ID 替换为上一步骤中的主体 ID。 将 $RESOURCE_ID 替换为目标虚拟机或虚拟机规模集的资源 ID。 请务必使用 VM 的资源 ID,而不是试验定义中使用的混沌代理的资源 ID。 针对试验中用作目标的每个虚拟机或虚拟机规模集运行此命令。

az role assignment create --role "Reader" --assignee-principal-type "ServicePrincipal" --assignee-object-id $EXPERIMENT_PRINCIPAL_ID --scope $RESOURCE_ID 

运行试验

现在可以开始运行试验了。 若要查看影响,建议在单独的浏览器选项卡中打开一个 Azure Monitor 指标图表,其中包含你的 VM 的 CPU 压力。

  1. 使用 Azure CLI 启动试验。 将 $SUBSCRIPTION_ID$RESOURCE_GROUP$EXPERIMENT_NAME 替换为你的试验的属性。

    az rest --method post --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME/start?api-version=2023-11-01
    
  2. 响应包含一个状态 URL,在试验运行时可以使用它来查询试验状态。

后续步骤

你已经运行了基于代理的试验,接下来可以执行以下操作: