透過 Azure CLI 建立使用 Chaos Mesh 錯誤的混沌實驗
您可以使用混沌實驗在受控環境中引發失敗,以驗證應用程式是否能夠從失敗中復原。 在本文中,您將使用混沌實驗和 Azure Chaos Studio 來導致命名空間上出現定期的 Azure Kubernetes Service (AKS) Pod 失敗。 執行此實驗可協助您在偶爾發生失敗時防止服務無法使用。
Chaos Studio 會使用 Chaos Mesh,這個免費的開放原始碼混沌工程平台可讓 Kubernetes 將錯誤注入 AKS 叢集中。 Chaos Mesh 錯誤是服務直接錯誤,需要在 AKS 叢集上安裝 Chaos Mesh。 您可以使用這些相同的步驟來針對任何 AKS Chaos Mesh 錯誤設定並執行實驗。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
- 具有 Linux 節點集區的 AKS 叢集。 如果您沒有 AKS 叢集,請參閱使用 Azure CLI、Azure PowerShell 或 Azure 入口網站的 AKS 快速入門。
限制
- 您可以設定 Chaos Studio 中的 VNet 插入來將 Chaos Mesh 錯誤與私人叢集結合使用。 向私人叢集發出的任何命令 (包括本文中設定 Chaos Mesh 的步驟) 都需要遵循私人叢集指導。 建議的方法包括從同一個虛擬網路中的 VM 進行連線或使用 AKS 命令叫用功能。
- 只有在 Linux 節點集區上才支援 AKS Chaos Mesh 錯誤。
- 如果您的 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
在 Chaos Studio 中執行 Chaos Mesh 錯誤之前,您必須在您的 AKS 叢集上安裝 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
您應該會看到類似以下範例的輸出 (一個 chaos-controller-manager 以及一或多個 chaos-daemons):
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 叢集只有一個目標類型 (服務直接),但其他資源可能最多有兩個目標類型。 其中一個目標類型適用於服務直接錯誤。 另一個目標類型是代理程式型錯誤。 每一種 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。 使用您的 JSON 檔案名稱更新experiment.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
每個實驗會建立對應的系統指派受控識別。 在回應中記下此身分識別的主體識別碼,下一個步驟將會用到。
向您的 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
取代為上一個步驟中的主體識別碼。 將$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 服務直接實驗,您可以開始: