これは、cndjp第3回勉強会のハンズオン Part 2のチュートリアルです。
このチュートリアルでは、Part 1でKubernetes上にデプロイしたチャットアプリケーションをに対して、カオステストを実施します。
このチュートリアルは、cndjp第3回勉強会のハンズオンチュートリアル Part 1を実施済みであることを前提とします。
以降の手順は、ほとんどの操作をコマンドラインツールから実行します。Mac/Linuxの場合はターミナル、Windowsの場合はWindows PowerShell利用するものとして、手順を記述します。
このリポジトリをcloneしてできたディレクトリをカレントディレクトリにします。
> cd ./cndjp3/
Kafkaクラスターを含む、チャットアプリケーションのPod群が稼働してることを確認しておきます。
> kubectl get pods
NAME READY STATUS RESTARTS AGE
kafka-0 1/1 Running 0 19m
kafka-1 1/1 Running 0 18m
kafka-2 1/1 Running 0 18m
kafka-3 1/1 Running 0 18m
kafka-client 1/1 Running 0 15m
kchat-server-kconsumer-4076213875-fl7pr 1/1 Running 0 10m
kchat-server-kproducer-2136001974-vzltw 1/1 Running 0 10m
pzoo-0 1/1 Running 0 24m
pzoo-1 1/1 Running 0 23m
pzoo-2 1/1 Running 0 23m
zoo-0 1/1 Running 0 24m
zoo-1 1/1 Running 0 23m
チャットクライアントを起動しておきます。
> java -jar kchat.client-jar-with-dependencies.jar 172.17.8.102 "User A"
新たにターミナル/PowerShellを立ち上げ、このリポジトリをcloneしてできたディレクトリ配下にあるchaos-testing
を、カレントディレクトリにします。
> cd ./cndjp3/chaos-testing
運用中のリクエストの流入を再現するためのツールとして、ロードジェネレーターを利用します。ここではApache Benchを利用します。
Apache BenchはApach HTTPサーバーに付属しますので、それをインストールします。Macの場合は標準でインストール済みのため、この作業は不要です。
先に新たに立ち上げたターミナル/PowerShellで、以下のコマンドを実行します。
・Linux (yumベースの場合の例)
> sudo yum install httpd
・Windows
> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
> Invoke-WebRequest -Uri https://www.apachelounge.com/download/VC15/binaries/httpd-2.4.29-Win64-VC15.zip -OutFile httpd-2.4.29-Win64-VC15.zip
> Expand-Archive -Path .\httpd-2.4.29-Win64-VC15.zip
続いてリクエストの送信を行います。
・Mac/Linux
> ab -n 10 -c 1 -p ab-test-message.txt http://172.17.8.102:30192/api/topics/chatroom
・Windows
> .\httpd-2.4.29-Win64-VC15\Apache24\bin\ab.exe -n 10 -c 1 -p .\ab-test-message.txt http://172.17.8.102:30192/api/topics/chatroom
チャットクアイラントで、メッセージを10件受信できていることを確認します。
これでロードジェネレーターの準備は完了です。
障害を再現するためのツールとして、chaoskubeを利用します。これは、Kubernetesクラスター上のPodをランダムにダウンさせるものです。
まず、新たにターミナル/PowerShellを立ち上げ、chaos-testing
を、カレントディレクトリにします。
> cd ./cndjp3/chaos-testing
chaoskubeはHelm Chartとして提供されており、KubernetesクラスターにデプロイするにはHelmを利用します。
Helmは複数のmanifestをパッケージとして管理するためのツールで、複数のコンテナをセットにしてデプロイするようなユースケースにおいて利用が広がっているものです。
Helmをインストールするには、GitHubのReleasesから、自分の環境に合ったものをダウンロードし、PATHを通しておきます。
ただし、Mac/Linuxの場合は、他の手段も提供されています。
・Mac
> brew install kubernetes-helm
・Mac/Linux
> $ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh
インストールが完了したら、helm init
で初期化しておきます。この操作で、クラスター内に常駐するHelm Tillerが配備されます。
対象のクラスターはkubectlの設定情報から自動的に識別してくれます。
>helm init
$HELM_HOME has been configured at C:\Users\hhayakaw\.helm.
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Happy Helming!
chaoskubeをクラスターにデプロイし、定期的にPodのダウンを発生させます。以下のコマンドを実行してください。
> helm install stable/chaoskube --version 0.6.1 --set interval=1m,dryRun=false,labels=app=kafka
このコマンドで与えているパラメータは、以下のような意味です。ここに記述する以上のオプションの詳細は、chaoskubeのドキュメントを参照してください。
- interval=1m
- 1分おきにPodをダウンさせる。デフォルトは10分
- dryRun=false
- dry runモード(Podを落とさない)を無効にする。デフォルトはTRUE
- labels=app=kafka
- ダウンさせる対象のPodを絞るlabelの指定。この場合kafkaのbroker群が対象となる
コマンドの実行結果として返ってくるメッセージに、chaoskubeの動作状況をtailするためのコマンドが記載されていますので、そのコマンドを実行します。
> POD=$(kubectl get pods -l app=mewing-gibbon-chaoskube --namespace kafka --output name)
> kubectl logs -f $POD --namespace=kafka
Windowsの場合は、上記の例の場合は以下のように実行してください。
> kubectl get pods -l app=mewing-gibbon-chaoskube --namespace kafka --output name
> kubectl logs -f [上のコマンドの実行結果] --namespace=kafka
以下のように、1分おきにbrokerのPodをダウンさせている様子が確認できます。
time="2018-01-31T04:03:37Z" level=info msg="Targeting cluster at https://10.100.0.1:443"
time="2018-01-31T04:03:39Z" level=info msg="Filtering pods by labels: app=kafka"
time="2018-01-31T04:03:50Z" level=info msg="Killing pod kafka/kafka-1"
time="2018-01-31T04:04:53Z" level=info msg="Killing pod kafka/kafka-0"
time="2018-01-31T04:05:57Z" level=info msg="Killing pod kafka/kafka-2"
chaoskubeを実行させている状況下で、アプリケーションの挙動がどうなるかを観察してみて見ます。
Podのダウン発生、及びその後の自動復旧(Podの復旧自体はkubernetesの機能です)の前後で、Partitionの再配置(リバランス)が行われる様子を確認します。
これを行うには、kafka-clientからTopicの情報を出力するコマンドを繰り返し実行します。
> kubectl exec -it kafka-client bash
root@kafka-client:/opt/kafka# ./bin/kafka-topics.sh --describe --zookeeper zookeeper.kafka:2181 --topic chatroom
chaoskubeを動かしたまま、Apache Benchでリクエストを送信し続け、チャットクライアントでのメッセージ受信の遅延がどのように発生するか、確認します。
環境によって異なりますが、Apache Benchで1000リクエスト程度を直列に送るようにすると、おおよそ1分強程リクエストが送信され続ける状況を作ることができます。
・Mac/Linux
> ab -n 1000 -c 1 -p ab-test-message.txt http://172.17.8.102:30192/api/topics/chatroom
・Windows
> .\httpd-2.4.29-Win64-VC15\Apache24\bin\ab.exe -n 1000 -c 1 -p .\ab-test-message.txt http://172.17.8.102:30192/api/topics/chatroom
(あとはお好きなようにいじってみてください…。)
以上で、ハンズオンのPart2は終了です。