Azure CLI で Chaos Mesh 障害を使うカオス実験を作成する
カオス実験を使用して、制御された環境で障害を引き起こすことで、アプリケーションにこれらの障害に対する回復性があることを確認できます。 この記事では、カオス実験および Azure Chaos Studio を使用することで、名前空間に対して Azure Kubernetes Service (AKS) ポッドの定期的な障害を起こします。 この実験を実行することは、散発的な障害が発生したときにサービスを利用できなくなるのを防ぐのに役立つ場合があります。
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 portal のいずれかを使用する場合についての AKS クイックスタートを参照してください。
制限事項
- Chaos Studio で VNet インジェクションを構成すると、プライベート クラスターで Chaos Mesh 障害を使用できます。 この記事で説明する Chaos Mesh セットアップ手順のように、プライベート クラスターに対してコマンドを発行するには、プライベート クラスター ガイダンスに従う必要があります。 推奨される使用法としては、同じ仮想ネットワーク内の仮想マシンから接続する方法や、AKS コマンド呼び出し機能を使用する方法があります。
- AKS Chaos Mesh 障害は、Linux ノード プールでのみサポートされます。
- 承認した IP 範囲のみを許可するように AKS クラスターを構成している場合は、Chaos Studio の IP 範囲を許可する必要があります。 この範囲は、
ChaosStudio
Service Tag Discovery API またはダウンロード可能な JSON ファイルを使用してサービス タグのクエリを実行することにより確認できます。
Azure Cloud Shell を開く
Azure Cloud Shell は無料のインタラクティブ シェルです。この記事の手順は、Azure Cloud Shell を使って実行することができます。 一般的な Azure ツールが事前にインストールされており、アカウントで使用できるように構成されています。
Cloud Shell を開くには、コード ブロックの右上隅にある [使ってみる] を選択します。 また、Bash に移動して別のブラウザー タブで Cloud Shell を開くこともできます。 [コピー] を選択してコードのブロックをコピーし、Cloud Shell に貼り付けてから、[入力] を選択して実行します。
CLI をローカルにインストールして使用する場合、このチュートリアルでは、Azure CLI バージョン 2.0.30 以降が必要です。 バージョンを確認するには、az --version
を実行します。 インストールまたはアップグレードする必要がある場合は、Azure CLI のインストールに関するページを参照してください。
Note
ここに示す手順では、Cloud Shell 内の Bash ターミナルを使用します。 CLI をローカルまたは PowerShell ターミナルで実行する場合、一部のコマンドは説明どおりに機能しないことがあります。
AKS クラスターで Chaos Mesh を設定する
Chaos Studio で Chaos Mesh 障害を実行するには、AKS クラスターに Chaos Mesh をインストールしておく必要があります。
AKS クラスターをデプロイしたサブスクリプションをアクティブなサブスクリプションに設定した環境の Cloud Shell ウィンドウで、次のコマンドを実行します。
$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 ポッドがインストールされていることを確認します。
kubectl get po -n chaos-testing
表示される出力結果は、以下の例 (chaos-controller-manager と 1 つまたは複数の chaos-daemon) のようになります。
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
また、Chaos Mesh Web サイトのインストール手順を使用することもできます。
AKS クラスターで Chaos Studio を有効にする
Chaos Studio でリソースに対して障害を挿入するには、その前に、対象となるリソースを Chaos Studio に追加しておく必要があります。 Chaos Studio にリソースを追加するには、そのリソースにターゲットと機能を作成します。 AKS クラスターのターゲットの種類は 1 つだけ (サービスダイレクト) ですが、その他のリソースにはターゲットの種類が最大 2 つある場合があります。 ターゲットの種類の 1 つはサービスダイレクト障害用です。 もう 1 つのターゲットの種類はエージェントベース障害用です。 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\":{}}"
この手順は、クラスターで有効にする各* 機能に対して実行する必要があります。
以上で、Chaos Studio に AKS クラスターが追加されました。
実験の作成
実験を作成するための準備ができました。 カオス実験の作成時には、ターゲット リソースに対して実行するアクションを定義します。 アクションは編成され、順番に実行されます。 カオス実験では、ブランチに対して並列に実行するアクションも定義できます。
カオス メッシュ
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
YAML から、
spec
の外にある部分をすべて削除します (spec プロパティ名自体も削除します)。 残した spec の内容からインデントを削除します。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 が作成されます。 この応答のプリンシパル ID を、次のステップで使用するためにメモしておきます。
AKS クラスターに実験のアクセス許可を付与する
カオス実験を作成すると、ターゲット リソースに対して障害を実行するシステム割り当てマネージド ID が Chaos Studio によって作成されます。 実験を正常に実行するには、この ID にターゲット リソースへの適切なアクセス許可を付与する必要があります。
- 次のコマンドを実行し、応答から
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 クラスターの概要を開き、別のブラウザー タブで [分析情報] を表示しておくことをおすすめします。実験を実行したことの効果は、[アクティブなポッド数] のライブ データに表れます。
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 サービスダイレクト実験の実行が済み、以下の内容に進む準備ができました。