以下の記事でMicroK8sにIstioを使ってABテストを実施しました。Kialiを使って発生した通信をGUIで確認してみましたので投稿します。
MicroK8sでistioによるABテストを試してみる(1/2)
MicroK8sでistioによるABテストを試してみる(2/2)
- Kialiにログインする
- Kiali Serviceの設定を変更する
- Kialiのログインユーザーとパスワードを確認する
- Kialiにログインする
- KialiでGraphを確認する
- 正常な状態でGraphを確認する
- helloaを通信不可な状態にして確認する
Kialiにログインする
MicroK8sでIstioをデプロイすると、Kialiも一緒にデプロイされます。ここではそのKialiにログインします。
Kiali Serviceの設定を変更する
KialiはGUIで表示されるので、ローカルPCからブラウザでアクセスする必要があります。従って、KialiのServiceを公開する必要があります。(通常$ microk8s istioctl dashboard kiali
でブラウザが開くはずなのですが、私はエラーで開ませんでした。)
以下のコマンドでKialiのServiceのタイプをNodePortにします。spec.typeをClusterIPからNodePortにするだけで変更できます。
ubuntu@microk8s-vm:~$ microk8s.kubectl get svc -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kiali ClusterIP 10.152.183.201 <none> 20001/TCP 2d1h ubuntu@microk8s-vm:~$ microk8s.kubectl edit svc kiali -n istio-system service/kiali edited ubuntu@microk8s-vm:~$ microk8s.kubectl get svc kiali -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kiali NodePort 10.152.183.201 <none> 20001:31793/TCP 2d1h
Kialiのログインユーザーとパスワードを確認する
Kialiの初期ユーザーと初期パスワードがわからなかったので、以下のコマンドで確認しました。結果、admin/adminでした。
$ microk8s kubectl get secret kiali -n istio-system -o json | jq -r '.data.username' | base64 --decode $ microk8s kubectl get secret kiali -n istio-system -o json | jq -r '.data.passphrase' | base64 --decode
Kialiにログインする
http://[multipass-vmのIPアドレス]:[NodePortの公開ポート]/kiali/
にアクセスすると、以下の画面が表示されるので、admin/adminを入力して「Log in」ボタンをクリックします。

KialiでGraphを確認する
正常な状態でGraphを確認する
左の「Graph」タブをクリックし、まずは正常な状態でGraphを確認します。
以下のように、ServiceとPodがバラバラな状態になっていました。

以下のコマンドで100回httpリクエストを行うと、正しく通信経路が表示されました。
$ for i in {0..99}; do curl -s -HHost:hello.example.com "http://192.168.64.2:31380"; done

左上のプルダウンメニューより、「No edge labels」を「Requests percentage」に変更すると、以下のように流動制御を行う割合が表示されました。

左上のプルダウンメニューより、「Requests percentage」を「Response time」に変更すると、以下のように通信経路ごとのレスポンスタイムが表示されました。

helloaを通信不可な状態にして確認する
コンテナが異常だった場合の表示も見てみたいと思います。
以下のコマンドでhelloa Podを削除します。
ubuntu@microk8s-vm:~$ microk8s.kubectl delete pod helloa -n istio-app
以下のyamlファイルから$ microk8s.kubectl create -f [ファイル名]
でPodを作成します。readinessProbeを定義していて、/tmp/healthy
が存在しない間は閉局します。
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: helloa name: helloa spec: containers: - image: localhost:32147/helloa name: helloa ports: - containerPort: 8080 resources: {} readinessProbe: exec: command: - cat - /tmp/healthy dnsPolicy: ClusterFirst restartPolicy: Always status: {}
閉局するといってもPodは存在しますので、envoyコンテナが起動していて、helloaコンテナが起動していない状態になります。
ubuntu@microk8s-vm:~$ microk8s.kubectl get pods -n istio-app NAME READY STATUS RESTARTS AGE helloa 1/2 Running 0 47m hellob 2/2 Running 0 83m
この状態で再度以下のコマンドを実行します。
$ for i in {0..99}; do curl -s -HHost:hello.example.com "http://192.168.64.2:31380"; done
100回は大分時間かかるので、途中でキャンセルしても大丈夫です。完了後にGUIを確認すると以下の画面になりました。helloaコンテナへのhttpリクエストが失敗した割合が分かりやすく表示されていました。右側には失敗したステータスコードも確認できるようになっていました。

以上です。2つ程度では価値が伝わりにくいですが、マイクロサービスなどコンテナの数が膨大になればなるほど貴重になるツールなので、皆様も是非お試しあれ。