MicroK8sでKialiを使ってみる

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