你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
通过 Azure CLI 创建使用 AKS Chaos Mesh 故障的 Chaos 试验
可以使用混沌试验,通过在受控环境中引发一些故障,来验证应用程序是否可以应对这些故障。 在本文中,你将使用混沌试验和 Azure Chaos Studio 在命名空间上定期引发 Azure Kubernetes 服务 (AKS) Pod 故障。 运行此实验可帮助你在发生偶发性故障时防止服务不可用。
Chaos Studio 使用 Chaos Mesh - 一个免费的开源混沌工程平台,可供 Kubernetes 用于将故障注入 AKS 群集。 Chaos Mesh 故障是要求将 Chaos Mesh 安装在 AKS 群集上的直接服务故障。 同样可以使用这些步骤来设置和运行针对任何 AKS Chaos Mesh 故障的试验。
先决条件
- Azure 订阅。 如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户。
- 具有 Linux 节点池的 AKS 群集。 如果你没有 AKS 群集,请参阅使用 Azure CLI、Azure PowerShell 或 Azure 门户的 AKS 快速入门。
限制
- 可以通过在 Chaos Studio 中配置 VNet 注入将 Chaos Mesh 故障与专用群集配合使用。 向专用群集发出的任何命令(包括本文中设置 Chaos Mesh 的步骤)都需要遵循专用群集指南。 建议的方法包括从同一虚拟网络中的 VM 进行连接,或使用 AKS 命令调用功能。
- AKS Chaos Mesh 故障仅在 Linux 节点池上受支持。
- 如果 AKS 群集配置为仅允许授权的 IP 范围,则你需要允许 Chaos Studio 的 IP 范围。 可以通过使用“服务标记发现 API”或可下载的 JSON 文件查询
ChaosStudio
服务标记来查找这些范围。
打开 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,某些命令可能无法按说明正常工作。
在 AKS 群集上设置 Chaos Mesh
必须在 AKS 群集上安装 Chaos Mesh,然后才能在 Chaos Studio 中运行 Chaos Mesh 故障。
在 Cloud Shell 窗口中运行以下命令,在此窗口中将活动订阅设置为在其中部署 AKS 群集的订阅。 将
$RESOURCE_GROUP
和$CLUSTER_NAME
分别替换为群集资源的资源组和名称。az aks get-credentials -g $RESOURCE_GROUP -n $CLUSTER_NAME helm repo add chaos-mesh https://charts.chaos-mesh.org helm repo update kubectl create ns chaos-testing helm install chaos-mesh chaos-mesh/chaos-mesh --namespace=chaos-testing --set chaosDaemon.runtime=containerd --set chaosDaemon.socketPath=/run/containerd/containerd.sock
通过运行以下命令来验证是否已安装 Chaos Mesh Pod:
kubectl get po -n chaos-testing
你应看到与以下示例类似的输出(一个混沌控制器管理器和一个或多个混沌守护程序):
NAME READY STATUS RESTARTS AGE
chaos-controller-manager-69fd5c46c8-xlqpc 1/1 Running 0 2d5h
chaos-daemon-jb8xh 1/1 Running 0 2d5h
chaos-dashboard-98c4c5f97-tx5ds 1/1 Running 0 2d5h
在 AKS 群集上启用 Chaos Studio
Chaos Studio 无法针对资源注入故障,除非已先将该资源添加到 Chaos Studio。 若要将资源添加到 Chaos Studio,请在资源上创建目标和功能。 AKS 群集只有一种目标类型 (service-direct),但其他资源最多可能有两种目标类型。 一种目标类型用于服务直接故障。 另一种目标类型用于基于代理的故障。 每种类型的 Chaos Mesh 故障都以一项功能表示(例如 PodChaos、NetworkChaos 和 IOChaos)。
通过将
$SUBSCRIPTION_ID
、$resourceGroupName
和$AKS_CLUSTER_NAME
替换为要添加的 AKS 群集相关字符串来创建目标。az rest --method put --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroupName/providers/Microsoft.ContainerService/managedClusters/$AKS_CLUSTER_NAME/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh?api-version=2024-01-01" --body "{\"properties\":{}}"
通过将
$SUBSCRIPTION_ID
、$resourceGroupName
和$AKS_CLUSTER_NAME
替换为要添加的 AKS 群集相关字符串,在目标上创建功能。
将 $CAPABILITY
替换为要添加的故障的“功能名称”。
az rest --method put --url "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroupName/providers/Microsoft.ContainerService/managedClusters/$AKS_CLUSTER_NAME/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh/capabilities/$CAPABILITY?api-version=2024-01-01" --body "{\"properties\":{}}"
下面提供了启用 PodChaos
功能的示例供你参考:
az rest --method put --url "https://management.azure.com/subscriptions/b65f2fec-d6b2-4edd-817e-9339d8c01dc4/resourceGroups/myRG/providers/Microsoft.ContainerService/managedClusters/myCluster/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh/capabilities/PodChaos-2.1?api-version=2024-01-01" --body "{\"properties\":{}}"
必须为要在群集上启用的每个功能执行此步骤。
现已成功将 AKS 群集添加到 Chaos Studio。
创建试验
现在,可以创建试验。 混沌试验定义了要针对目标资源执行的操作。 操作将按顺序组织并运行。 混沌试验还定义了要针对分支执行的操作(它们将并行运行)。
创建 Chaos Mesh
jsonSpec
:参阅 Chaos Mesh 文档以查看故障类型,例如 PodChaos 类型。
使用 Chaos Mesh 文档来阐明该错误类型的 YAML 配置。
apiVersion: chaos-mesh.org/v1alpha1 kind: PodChaos metadata: name: pod-failure-example namespace: chaos-testing spec: action: pod-failure mode: all duration: '600s' selector: namespaces: - default
删除
spec
之外的任何 YAML,包括规范属性名称。 删除规范详细信息的缩进。duration
参数不是必需的,但如果提供,则会使用它。 在本例中,请将其删除。action: pod-failure mode: all selector: namespaces: - default
使用此类 YAML 到 JSON 转换器将 Chaos Mesh YAML 转换为 JSON 并将其最小化。
{"action":"pod-failure","mode":"all","selector":{"namespaces":["default"]}}
使用类似于这样的 JSON 字符串转义工具来转义 JSON 规范,或将双引号更改为单引号。
{\"action\":\"pod-failure\",\"mode\":\"all\",\"selector\":{\"namespaces\":[\"default\"]}}
{'action':'pod-failure','mode':'all','selector':{'namespaces':['default']}}
参考下面的 JSON 示例创建试验 JSON。 使用创建试验 API、故障库和在上一步中创建的
jsonSpec
修改 JSON,以响应你要运行的试验。{ "location": "centralus", "identity": { "type": "SystemAssigned" }, "properties": { "steps": [ { "name": "AKS pod kill", "branches": [ { "name": "AKS pod kill", "actions": [ { "type": "continuous", "selectorId": "Selector1", "duration": "PT10M", "parameters": [ { "key": "jsonSpec", "value": "{\"action\":\"pod-failure\",\"mode\":\"all\",\"selector\":{\"namespaces\":[\"default\"]}}" } ], "name": "urn:csci:microsoft:azureKubernetesServiceChaosMesh:podChaos/2.2" } ] } ] } ], "selectors": [ { "id": "Selector1", "type": "List", "targets": [ { "type": "ChaosTarget", "id": "/subscriptions/bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f/resourceGroups/myRG/providers/Microsoft.ContainerService/managedClusters/myCluster/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh" } ] } ] } }
使用 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,以便在下一步骤中使用。
向 AKS 群集授予试验权限
创建混沌试验时,Chaos Studio 会创建系统分配的托管标识,用于针对目标资源执行故障。 若要成功运行试验,必须向此标识提供目标资源的适当权限。
- 通过运行以下命令并复制响应中的
PrincipalID
来检索$EXPERIMENT_PRINCIPAL_ID
。 将$SUBSCRIPTION_ID
、$RESOURCE_GROUP
和$EXPERIMENT_NAME
替换为你的试验的属性。
az rest --method get --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME?api-version=2024-01-01
- 使用以下命令授予对资源的试验访问权限。 将
$EXPERIMENT_PRINCIPAL_ID
替换为上一步骤中的主体 ID。 将$SUBSCRIPTION_ID
、$resourceGroupName
和$AKS_CLUSTER_NAME
替换为 AKS 群集的相关字符串。
az role assignment create --role "Azure Kubernetes Service RBAC Admin Role" --assignee-principal-type "ServicePrincipal" --assignee-object-id $EXPERIMENT_PRINCIPAL_ID --scope subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroupName/providers/Microsoft.ContainerService/managedClusters/$AKS_CLUSTER_NAME
az role assignment create --role "Azure Kubernetes Service Cluster User Role" --assignee-principal-type "ServicePrincipal" --assignee-object-id $EXPERIMENT_PRINCIPAL_ID --scope subscriptions/$SUBSCRIPTION_ID/resourceGroups/$resourceGroupName/providers/Microsoft.ContainerService/managedClusters/$AKS_CLUSTER_NAME
如果希望创建自定义角色而不是内置的 AKS 角色,请按照 Chaos Studio 支持的资源类型和角色分配页面上的说明列出特定故障所需的基于角色的访问控制操作,并将其添加到手动创建的自定义角色。
运行试验
现在,你已准备就绪,可以开始运行试验。 若要查看效果,我们建议打开 AKS 群集概述并在单独的浏览器选项卡中转到“见解”。“活动 Pod 计数”的实时数据显示了运行试验的效果。
使用 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=2024-01-01
响应包含一个状态 URL,在试验运行时可以使用它来查询试验状态。
后续步骤
运行 AKS Chaos Mesh service-direct 试验后,接下来可以学习以下知识: