zaki work log

作業ログやら生活ログやらなんやら

[Kubernetes / Istio] Kialiでサービスメッシュのトラフィックを俯瞰する

Kialiを使ってサービスメッシュのトラフィックをチェックする。

[zaki@cloud-dev ~]$ kc get pod,deploy,svc -n istio-system -l app=kiali
NAME                        READY   STATUS    RESTARTS   AGE
pod/kiali-d45468dc4-jlshb   1/1     Running   5          23d

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kiali   1/1     1            1           23d

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
service/kiali   ClusterIP   10.104.53.76   <none>        20001/TCP   23d

環境 (追記)

zaki-hmkc.hatenablog.com

こちらで作った、kubeadmで構築したKubernetes 1.18に、MetalLB + istioctlでインストールしたIstio v1.6.5環境です。

インストール

demo profileを使ってIstioをインストールすればKialiも含まれる。

istio.io

後から個別に追加インストールするには、アドオンコンポーネントで指定してインストールする。

[zaki@cloud-dev ~]$ istioctl install --set addonComponents.kiali.enabled=true
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/bes
t-practices/security/#configure-third-party-service-account-tokens for details.
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Addons installed
✔ Installation complete

istio.io

secret(後述のweb画面のログイン情報)が無ければ追加する。

istio.io

$ KIALI_USER=$(echo -n "kiali" | base64)
$ KIALI_PASS=$(echo -n "kiali" | base64)
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: kiali
  namespace: istio-system
  labels:
    app: kiali
type: Opaque
data:
  username: $KIALI_USER
  passphrase: $KIALI_PASS
EOF

istioctlを使ったアクセス

[zaki@cloud-dev ~]$ istioctl dashboard kiali
http://localhost:42983/kiali
Failed to open browser; open http://localhost:42983/kiali in your browser.

これだと、istioctlを実行ホスト上からのアクセスになるので、実行ホストへリモートアクセスしてるのであればSSHポートフォワードするなどする。

zaki@wensley% ssh -L 20001:localhost:42983 cloud-dev
zaki@cloud-dev's password: 
Last login: Tue Aug 18 09:29:55 2020 from 192.168.0.220
[zaki@cloud-dev ~]$ 

まぁこんな感じで。

f:id:zaki-hmkc:20200818210803p:plain

ログインアカウント

アカウント情報は、secretに保持されている。
デフォルトであればadmin / adminでログイン

[zaki@cloud-dev ~]$ kc get secret -n istio-system kiali -o jsonpath='{.data.use
rname}' | base64 -d; echo
admin
[zaki@cloud-dev ~]$ kc get secret -n istio-system kiali -o jsonpath='{.data.pas
sphrase}' | base64 -d; echo
admin

f:id:zaki-hmkc:20200818211455p:plain

Runningでなくエラーになっているpodがあると(サービスメッシュと関係なく)赤くなるみたい。

サービスメッシュのグラフ表示

サイドメニューのここ。

f:id:zaki-hmkc:20200818211816p:plain

そして、ネームスペース選択のドロップダウンから、Istioを使用しているネームスペースを選択。

f:id:zaki-hmkc:20200818211944p:plain

すると、このようにサービスメッシュの構成と状態を俯瞰することができる。

f:id:zaki-hmkc:20200818212044p:plain

※ BookInfoアプリケーション自体はこちらを参照。
以下、アーキテクチャ図を引用

Bookinfo Application without Istio

トラフィックの様子をチェックする

BookInfoに実際にアクセスすると、Kialiの表示も更新される。

f:id:zaki-hmkc:20200818213132p:plain

また、マウスオーバーしたり、ラインやコンポーネントをマウスクリックすると、プロトコル種別やトラフィック量・通信のエラー状況といった詳細も見れる。

f:id:zaki-hmkc:20200818213414p:plain

また、ネームスペースは複数選択可能のため、複数ネームスペースにまたがるアプリケーション構成でもトラフィックをチェックできる。

f:id:zaki-hmkc:20200818213622p:plain


常時使うならNodePortやLoadBalancer Serviceで

今回はistioctl dashboard kialiを使った(ので、その変化球でSSHポートフォワード使った)けど、kubectl port-forwardでも良いし、開発環境などで常時使用・参照するならNodePort ServiceやLoadBalancer Serviceを作ってもいいと思う。

[zaki@cloud-dev ~]$ kc get svc -n istio-system kiali
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
kiali   ClusterIP   10.104.53.76   <none>        20001/TCP   23d
[zaki@cloud-dev ~]$ kc get svc -n istio-system kiali -o jsonpath='{.spec.type}{"\n"}'
ClusterIP

これを

[zaki@cloud-dev ~]$ kc patch svc -n istio-system kiali -p '{"spec": {"type": "LoadBalancer"}}'
service/kiali patched

こうして

[zaki@cloud-dev ~]$ kc get svc -n istio-system kiali
NAME    TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)           AGE
kiali   LoadBalancer   10.104.53.76   192.168.0.184   20001:32086/TCP   23d

こうじゃ。

f:id:zaki-hmkc:20200818214652p:plain

というか、istioctl dashboardの中身ってport-forwardなのね


それで"kiali"ってどういう意味なんだろう…