Azure Chaos StudioでAKSに障害を注入してみた

2.5K Views

September 24, 22

スライド概要

Japan Azure User Group 12周年イベントでLTした資料です
https://jazug.connpass.com/event/258347/

profile-image

SIer所属のインフラ屋さんです

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Azure Chaos Studioで AKSに障害を注入してみた

2.

自己紹介 Shunsuke Yoshikawa Twitter: https://twitter.com/ussvgr Qiita: https://qiita.com/ussvgr ⚫ 所属: 株式会社エーピーコミュニケーションズ ⚫ 普段の仕事: Azure×コンテナ中心に触ってます(AKSとかContainer Appsとか) ⚫ 愛知県在住 ⚫ 会社のブログにAzureネタを書いてます APC技術ブログ(https://techblog.ap-com.co.jp/)

3.

Chaos Engineering …?

4.

“カオスエンジニアリングは、 システムが本番環境における不安定な状態に 耐える能力へ自信を持つためにシステム上で 実験を行う訓練方法です。” 引用元: カオスエンジニアリングの原則(https://principlesofchaos.org/ja/)

5.

AzureのChaos Engineeringサービス Azure Chaos Studio https://azure.microsoft.com/ja-jp/products/chaos-studio/ ※2022/09/24現在はプレビューでの提供

6.

Azure Chaos Studioを Azure Kubernetes Service(AKS) と組み合わせて使ってみよう! 参考: 公式チュートリアル https://learn.microsoft.com/ja-jp/azure/chaos-studio/chaos-studio-tutorial-aks-portal

7.

事前準備(1) Chaos StudioでAKSを有効化 対象のAKSクラスターをChaos Studio上で 有効化 しておく必要がある。

8.

事前準備(2) Chaos Meshのインストール Azure Chaos Studio はAKSに対する障害注入に Chaos Mesh を利用しているため、 あらかじめAKSクラスターに導入しておく必要がある。 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 \ --create-namespace --version 2.3.2 \ --set chaosDaemon.runtime=containerd \ --set chaosDaemon.socketPath=/run/containerd/containerd.sock

9.

今回の実験 AKSクラスター上に3つのnginx Podが起動している状態。 このうち1つのPodが応答不可の状態になったら… → 残る2つのPodでサービス継続は可能か? --apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest --apiVersion: v1 kind: Service metadata: name: nginx spec: type: LoadBalancer selector: app: nginx ports: - port: 80 targetPort: 80

10.

実験作成(1) ⚫ ステップ: ブランチを起動する順番を定義する ⚫ ブランチ: 同時に実行するアクションを定義する ⚫ アクション: 注入する障害の内容と対象を定義する という3つの単位を組み合わせて作成していく。 複数の障害を組み合わせた実験を作ることも可能だが、 今回は単一の障害のみ 1ステップ1ブランチ1アクションで作成する。

11.

実験作成(2) 【アクションの定義】 Podの障害を注入するには フォールト の項目で AKS Chaos Mesh Pod Chaos を選択する。 jsonSpec の欄には、Chaos Meshの設定ファイル(YAML)から 一部を抜粋したものをJSON化 して入力する (次ページで紹介) その後、ターゲット リソース にてAKSクラスターを指定し 実験を保存する

12.
[beta]
apiVersion: chaosmesh.org/v1alpha1
kind: PodChaos
metadata:
name: pod-failure-example
namespace: chaos-testing
spec:
action: pod-failure
mode: one
duration: '300s'
selector:
namespaces:
- default
labelSelectors:
'app': 'nginx'
Chaos Mesh の定義ファイル

{
"action": "pod-failure",
"mode": "one",
"duration": "300s",
"selector": {
"namespaces": [
"default"
],
"labelSelectors": {
"app": "nginx"
}
}
}
Azure Chaos Studio の jsonSpec

参考: https://chaos-mesh.org/docs/simulate-pod-chaos-on-kubernetes/#create-experiments-using-yaml-configuration-files

13.

実験作成後作業 AKSクラスターのIAM設定で、 作成した実験のマネージドIDに対し Azure Kubernetes Service クラスター管理者ロール を割り当てる。 ※障害注入対象リソースごとに推奨されるロールは以下にて公開されている https://learn.microsoft.com/ja-jp/azure/chaos-studio/chaos-studio-fault-providers

14.

実験開始

15.
[beta]
実験中の正常性確認
Azure Chaos Studio は障害を注入するのみで、障害注入中の正常性については確認できない。

そのため、簡単なスクリプトを実行し、HTTPのステータスコードを確認することとした。
#!/bin/bash
while true
do
curl http://<LoadBalancerIP> \
-o /dev/null \
-w '%{http_code}\n' –sS
sleep 1
done

16.

結果 実験が終了するまでの間、 約1/3の割合で Connection refused のエラーが発生し続けた。

18.
[beta]
分析・改善・再実験
readinessProbe:
httpGet:
path: /
port: 80
periodSeconds: 3

⚫ 異常なPodに対してリクエストが流れ続けている?
⇒Readiness Probeの設定を追加し、
異常なPodに対する通信を抑止する。

curl http://<LoadBalancerIP> \
--retry 5 \
--retry-connrefused \
-o /dev/null \
-w '%{http_code}\n' –sS

⚫ 1度エラーが返ってきてもリトライすればよいのでは?
⇒クライアント側(正常性確認用スクリプト)に
リトライオプションを追加する

これらの改善をしたのち実験を再実行!

19.

再実験結果 実験が終了するまでの間エラーの発生なく、 全て HTTPステータスコード 200 OK となった。

21.

まとめ あなたのシステムは障害に耐えられますか? Azure Chaos Studioを使って 実際に障害を注入して確認してみよう! ※2022/09/24現在、Azure Chaos Studioはプレビューでの提供です

22.

Thank You!