asashiho / chaosstudio-sample-aks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Chaos Sample using Azure Kubernetes Service/Spring Boot

Azure Kubrnetes Service上で動くSpring Bootアプリケーションに対してChaos Studioを使ったカオス挿入を行います。

Azure Kubrnetes Serviceクラスタの作成

RG_NAME=aks-chaos
AKS_NAME=aks-chaos
ACR_NAME=acrchaosxxxxx

ACRの作成

次のコマンドでACRを作成します。

az group create \
    -n $RG_NAME \
    -l japaneast

az acr create \
    -n $ACR_NAME \
    -g $RG_NAME \
    --sku basic

AKSの作成

次のコマンドでクラスタを作成します。

az aks create \
    -g $RG_NAME \
    -n $AKS_NAME \
    --node-count 2 \
    --enable-addons monitoring \
    --attach-acr $ACR_NAME \
    --generate-ssh-keys

クラスタが作成できたら、次のコマンドでクラスタの接続に必要なクレデンシャルを取得します。

az aks get-credentials \
    -g $RG_NAME \
    -n $AKS_NAME

kubectlは、Kubernetesのリソースを操作するためのCLIです。 次のコマンドを実行してkubectlをインストールし、クラスタのノード一覧を表示します。

az aks install-cli
kubectl get node

Spring Bootによるコンテナアプリケーションの開発

テスト用のアプリケーションをデプロイします。

overview

Build/Share

chaos-frontendおよびchaos-backendをビルド/コンテナイメージを作成し、コンテナレジストリで共有します。

az acr login --name $ACR_NAME

backendアプリ

backendアプリのコンテナイメージを作成し、レジストリにPushします。

cd apps/backend
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=$ACR_NAME.azurecr.io/chaos-backend:v1
docker push $ACR_NAME.azurecr.io/chaos-backend:v1

frontendアプリ

frontendのアプリのコンテナイメージを作成し、レジストリにPushします。

cd apps/frontend.before
./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=$ACR_NAME.azurecr.io/chaos-frontend:v1
docker push $ACR_NAME.azurecr.io/chaos-frontend:v1

Kubernetesクラスタへのデプロイ

次のコマンドでクラスタの構成を確認します。

kubectl get svc,deployment,pod

クラスタにはまだアプリケーションが何もデプロイされていません。

backendアプリのデプロイ

Kubernetesマニフェストからbackendアプリをクラスタにデプロイします。

cd manifest/backend

kubectl apply -f service.yaml -f deployment.yaml 

DeploymentとServiceを確認します。

kubectl get deploy,service

frontendアプリのデプロイ

Kubernetesマニフェストからfrontアプリをクラスタにデプロイします。

cd manifest/frontend

kubectl apply -f service.yaml -f deployment.yaml 

DeploymentとServiceを確認します。

kubectl get deploy,service

動作確認

frontendアプリのエンドポイントを確認します。

kubectl get svc

Webブラウザから次のURLにアクセスします。

http://<frontend External IP>/

backend

動いているアプリケーションのログを確認するには、次のコマンドを実行します。

kubectl logs -f <pod name>

Chaos Studioによるカオス挿入

Chaos Studioを使って、Kubernetesクラスタにカオスを挿入します。

Chaos Meshを設定する

AKSクラスターにChaos Meshをインストールします。

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 \
    --version 2.0.3 \
    --set chaosDaemon.runtime=containerd \
    --set chaosDaemon.socketPath=/run/containerd/containerd.sock

Chaos Meshの確認を行います。

kubectl get po -n chaos-testing

AKSクラスターでChaos Studioを有効にする

AKSクラスタのリソースIDを確認します。

RESOURCE_ID=$(az aks list --query "[].id" -o tsv)

AKSクラスタでChaos Studioを有効化します

az rest --method put \
    --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh?api-version=2021-09-15-preview" \
    --body "{\"properties\":{}}"

Pod障害の注入

Chaos Studioの障害およびアクション ライブラリを確認します。

CAPABILITY=PodChaos-2.1
az rest --method put \
    --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh/capabilities/$CAPABILITY?api-version=2021-09-15-preview"  \
    --body "{\"properties\":{}}"

$SUBSCRIPTION_ID$RESOURCE_GROUP$EXPERIMENT_NAME を環境に合わせて変更しexperiment.jsonを作成します。

SUBSCRIPTION_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
EXPERIMENT_NAME=pod-failure

cd chaos
az rest --method put \
    --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG_NAME/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME?api-version=2021-09-15-preview \
    --headers "Content-Type=application/json" \
    --body @experiment.pod.json -o json

AKS クラスターにアクセス許可を付与するため 上記コマンドの実行結果から以下の値を取得し、環境変数に設定します。

"principalId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
EXPERIMENT_PRINCIPAL_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
az role assignment create \
    --role "Azure Kubernetes Service Cluster Admin Role" \
    --assignee-object-id $EXPERIMENT_PRINCIPAL_ID \
    --scope $RESOURCE_ID

次のコマンドで実験を実行します

az rest --method post \
    --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG_NAME/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME/start?api-version=2021-09-15-preview

DNS障害の注入

Chaos Studioの障害およびアクション ライブラリを確認します。

CAPABILITY=DNSChaos-2.1

Chaos DNS Serviceのインストールをします。

helm upgrade chaos-mesh chaos-mesh/chaos-mesh \
    --namespace=chaos-testing \
    --version 2.0.3 \
    --set dnsServer.create=true
kubectl get pods -n chaos-testing -l app.kubernetes.io/component=chaos-dns-server
az rest --method put \
    --url "https://management.azure.com/$RESOURCE_ID/providers/Microsoft.Chaos/targets/Microsoft-AzureKubernetesServiceChaosMesh/capabilities/$CAPABILITY?api-version=2021-09-15-preview"  \
    --headers "Content-Type=application/json" \
    --body "{\"properties\":{}}"

$SUBSCRIPTION_ID$RESOURCE_GROUP$EXPERIMENT_NAME を環境に合わせて変更しexperiment.jsonを作成します。

SUBSCRIPTION_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
EXPERIMENT_NAME=dns-failure

cd chaos
az rest --method put \
    --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG_NAME/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME?api-version=2021-09-15-preview \
    --headers "Content-Type=application/json" \
    --body @experiment.dns.json -o json

AKS クラスターに実験のアクセス許可を付与するため 上記コマンドの実行結果から以下の値を取得し、環境変数に設定します。

"principalId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
EXPERIMENT_PRINCIPAL_ID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
az role assignment create \
    --role "Azure Kubernetes Service Cluster Admin Role" \
    --assignee-object-id $EXPERIMENT_PRINCIPAL_ID \
    --scope $RESOURCE_ID

次のコマンドで実験を実行します。

az rest --method post \
    --uri https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RG_NAME/providers/Microsoft.Chaos/experiments/$EXPERIMENT_NAME/start?api-version=2021-09-15-preview

クリーンアップ

検証が終わりクラスタが不要になったらクラスタのリソースグループを削除します。

az group delete --name $RG_NAME 

Enjoy! 🍖🍺

About

License:MIT License


Languages

Language:Java 83.8%Language:HTML 16.2%