コンテンツにスキップ

Kiali@CNCF

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Kialiの仕組み

アーキテクチャ

Kialiは、バックエンドコンポーネントとフロントエンドコンポーネントから構成されている。

kiali_architecture


バックエンドコンポーネント

▼ バックエンドコンポーネントとは

バックエンドコンポーネントは、kube-apiserverからKubernetesリソース (例:Namespace、Deployment、Service、など) の情報を収集し、PrometheusからIstioのメトリクス (例:istio_requests_totalistio_request_bytes_bucketistio_request_bytes_count、など) を収集する。

そのため、Kialiが必要とするメトリクスをPrometheusで事前に収集していないと、Kialiが正しく機能しない。

アーキテクチャの図中で点線は、バックエンドコンポーネントがIstiodコントロールプレーンに間接的に依存していることを表している。


フロントエンドコンポーネント

▼ フロントエンドコンポーネントとは

フロントエンドコンポーネントは、バックエンドからデータを取得し、ダッシュボード上にサービスメッシュトポロジーを作成する。

サービスメッシュトポロジーから、マイクロサービス間の通信の依存関係や通信状況を確認できる。

その他、テレメトリー収集ツール (例:Jaeger、Grafana) と連携し、Kiali上のデータから連携先のツールのURLにリダイレクトできるようにする。

▼ グラフ化手法

Kialiは、cytoscape.jsパッケージを使用し、『幅優先探索グラフ』や『有向グラフ』といったモデリング手法に基づいて、Istioから収集したデータポイントをグラフ化する。


01-02. マニフェスト

マニフェストの種類

Kialiは、Deployment、ConfigMap、Service、などのマニフェストから構成されている。


Deployment配下のPod

▼ 設定例

記入中...

apiVersion: v1
kind: Pod
metadata:
  labels:
    app.kubernetes.io/name: kiali
  name: foo-kiali
  namespace: istio-system
spec:
  containers:
    - name: kiali
      image: quay.io/kiali/kiali:v1.60.0
      command:
        - /opt/kiali/kiali
        - '-config'
        - /kiali-configuration/config.yaml
      ports:
        - containerPort: 20001
          name: api-port
          protocol: TCP
        - containerPort: 9090
          name: http-metrics
          protocol: TCP
      volumeMounts:
        - mountPath: /kiali-configuration
          name: kiali-configuration
        - mountPath: /kiali-cert
          name: kiali-cert
        - mountPath: /kiali-secret
          name: kiali-secret
        - mountPath: /kiali-cabundle
          name: kiali-cabundle
        - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
          name: kube-api-access-*****
          readOnly: "true"

  ...


ConfigMap

▼ 設定例

記入中...

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-kiali-config-map
  namespace: istio-system
data:
  config.yaml: |
    ...

▼ Istioとの対応

Kialiのバージョンは、Istioと対応関係にある。

Kialiのバージョンに応じたリビジョン番号のIstioを指定する。


Service

▼ 設定例

記入中...

apiVersion: v1
kind: Service
metadata:
  name: kiali
  namespace: istio-system
spec:
  ports:
    - name: http
      port: 20001
      protocol: TCP
    - name: http-metrics
      port: 9090
      protocol: TCP
  selector:
    app.kubernetes.io/name: kiali

  ...


02. コンソールの歩き方

Workloadsタブ

基本的には、このタブを確認する。

マイクロサービスを選ぶと、そのマイクロサービスと送受信の関係にあるマイクロサービスを表示してくれる。


Graphタブ

▼ メッシュトポロジータイプ

▼ Appグラフ

アプリコンテナ間 (Pod間) の通信を表示する。

▼ Serviceグラフ

Virtual Service間の通信を表示する。

▼ Versioned Appグラフ

バージョン付きのアプリコンテナ間 (Pod間) の通信を表示する。

▼ Workloadグラフ

Workload (例:Deployment、DaemonSet、StatefulSet、Job、など) の通信を表示する。


プロトコル別メトリクス

▼ HTTP

HTTPプロトコルに関して、インバウンド/アウトバウンド通信のレスポンスタイムやエラー率を表示する。

▼ gRPC

RPCによるHTTPプロトコルに関して、インバウンド/アウトバウンド通信のレスポンスタイムやエラー率を表示する。

▼ TCP

TCPスリーウェイハンドシェイクのレスポンスタイムやエラー率を表示する。


表示形式

▼ 表示期間

デフォルトでは、最新1分に発生した通信しか表示しない。

そのため、表示期間を延長する。

▼ Namespace

デフォルトでは、全てのNamespaceが表示されて見にくい。

そのため、アプリコンテナのNamespaceのみをフィルタリングして表示する。

▼ 相互TLS認証

デフォルトでは、マイクロサービス間のいずれの通信が相互TLS認証になっているかを表示しない。

そのため、凡例でSecurityを有効化する。


汎用ラベルの意味合い

▼ 表示するべき凡例

デフォルトでは、アプリコンテナ以外のコンポーネント (例:IstioのVirtual Service) が表示されて見にくい。

そのため、以下のみをフィルタリングして表示するとよい。

  • Cluster囲み線
  • Namespace囲み線
  • レスポンスタイムと閾値 (rt > マイクロ秒数)

▼ 囲み線

  • 複数のNamespaceにistio-proxyコンテナをインジェクションしている場合、ServiceとマイクロサービスがNSとついた線で囲われる。
  • 特定のマイクロサービスに複数のsubset値 (例:v1v2) が付与されている場合、それらがAとついた線で囲われる。


Istioのマニフェストの検証

Kialiでは、Istioカスタムリソースのマニフェストを検証できる。

ダッシュボード (Serviceタブ、Istio Configタブ) のConfigurationがエラー表示になっていれば、Istioカスタムリソースのマニフェストに問題があることがわかる。


トラブルシューティング

▼ レスポンスタイム

マイクロサービス間のレスポンスタイムやエラー率を基点として、ボトルネックになっているマイクロサービスを特定していく。

凡例で、レスポンスタイムと閾値 (rt > マイクロ秒数) を設定し、いずれのマイクロサービス間で通信に時間がかかっているのかを調査できる。

▼ Envoy

Workloadsタブから、各Podのistio-proxyコンテナにどんなEnvoy設定値 (リスナー、ルート、クラスター、エンドポイント) を適用しているかを確認できる。


03. トレースと他のデータ間の紐付け

他のテレメトリーとの紐付け

▼ メトリクスとの紐付け

▼ ログとの紐付け


サービスメッシュトポロジーとの紐付け