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 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 をインストールしておく必要があります。

  1. 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
    
  2. 次のコマンドを実行して、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 など) として表現されます。

  1. $RESOURCE_ID の箇所を、追加する AKS クラスターのリソース ID に置き換え、ターゲットを作成します。

    az rest --method put --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh?api-version=2023-11-01" --body "{\"properties\":{}}"
    
  2. $RESOURCE_ID の箇所を、追加する AKS クラスターのリソース ID に置き換え、ターゲット上の機能を作成します。 $CAPABILITY の箇所を、有効にする障害機能の名前に置き換えます。

    az rest --method put --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh/capabilities/$CAPABILITY?api-version=2023-11-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=2023-11-01"  --body "{\"properties\":{}}"
    

    この手順を、クラスター上で有効にする個々の機能について繰り返し実行します。

以上で、Chaos Studio に AKS クラスターが追加されました。

実験の作成

実験を作成するための準備ができました。 カオス実験の作成時には、ターゲット リソースに対して実行するアクションを定義します。 アクションは編成され、順番に実行されます。 カオス実験では、ブランチに対して並列に実行するアクションも定義できます。

  1. カオス メッシュ jsonSpec を作成します。

    1. 使用する障害の種類について、Chaos Mesh のドキュメントで詳細情報を確認します (たとえば、PodChaos の情報はこちら)。

    2. 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
      
    3. YAML から、spec の外にある部分をすべて削除します (spec プロパティ名自体も削除します)。 残した spec の内容からインデントを削除します。 duration パラメーターは必須ではありませんが、指定すると効力を持ちます。 この場合は削除します。

      action: pod-failure
      mode: all
      selector:
        namespaces:
          - default
      
    4. このような YAML から JSON へのコンバーターを使用して、Chaos Mesh YAML を JSON に変換し、それを最小化します。

      {"action":"pod-failure","mode":"all","selector":{"namespaces":["default"]}}
      
    5. このような JSON 文字列エスケープ ツールを使って JSON 仕様をエスケープするか、二重引用符を一重引用符に変更します。

      {\"action\":\"pod-failure\",\"mode\":\"all\",\"selector\":{\"namespaces\":[\"default\"]}}
      
      {'action':'pod-failure','mode':'all','selector':{'namespaces':['default']}}
      
  2. 最初の実験用 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.1"
                  }
                ]
              }
            ]
          }
        ],
        "selectors": [
          {
            "id": "Selector1",
            "type": "List",
            "targets": [
              {
                "type": "ChaosTarget",
                "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myRG/providers/Microsoft.ContainerService/managedClusters/myCluster/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh"
              }
            ]
          }
        ]
      }
    }
    
  3. 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 にターゲット リソースへの適切なアクセス許可を付与する必要があります。

次のコマンドを実行して、この実験にリソースへのアクセス権を付与します。 $EXPERIMENT_PRINCIPAL_ID の箇所は、前の手順でメモしたプリンシパル ID に置き換えます。 $RESOURCE_ID の箇所は、ターゲット リソースのリソース ID に置き換えます。 この場合は AKS クラスターのリソース ID を使用します。 実験の対象となるリソースごとに、このコマンドを実行します。

az role assignment create --role "Azure Kubernetes Service Cluster Admin Role" --assignee-object-id $EXPERIMENT_PRINCIPAL_ID --scope $RESOURCE_ID

実験を実行する

実験の実行準備が整いました。 実行中に効果を確認できるよう、AKS クラスターの概要を開き、別のブラウザー タブで [分析情報] を表示しておくことをおすすめします。実験を実行したことの効果は、[アクティブなポッド数] のライブ データに表れます。

  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 が含まれています。

次のステップ

以上で AKS Chaos Mesh サービスダイレクト実験の実行が済み、以下の内容に進む準備ができました。