Kafka の Web UI を提供する kafka-ui を試す

| 9 min read
Author: masahiro-kondo masahiro-kondoの画像

人気の分散メッセージングシステム Kafka では、オペレーション用のシェルスクリプト群は提供されていますが GUI は提供されていません。「Topic を作成する」、「Topic の Partition 数を増やす」、「Topic を流れるメッセージを確認する」、「Consumer によるメッセージ処理の進み具合を確認する」といったオペレーションには CLI を駆使する必要があります。

kafka-ui というサードパーティの Kafka Web UI が OSS で公開されているのを知ったので、軽く試してみました。

GitHub - provectus/kafka-ui: Open-Source Web UI for Apache Kafka Management

Provectus という AI のコンサル会社が開発している OSS です。バックエンドは Java (Spring Boot)、フロントエンドは React という構成で開発も活発なようです。現在のバージョンは 0.5.0 です。

Information

Kafka を Cloud で提供している Confluent Platform では専用の Web UI で管理、監視ができます。

Apache Kafka GUI Management and Monitoring - Confluent

kafka-ui のフィーチャー

#

READMEによると kafka-ui では以下のフィーチャーが提供されています。

  • 複数クラスター管理
  • メトリクスダッシュボードによるパフォーマンスモニター
  • Kafka Brokers 監視
  • Kafka Topics 監視
  • Consumer Group 監視
  • メッセージの参照
  • 動的な Topic 設定
  • OAuth 2.0による認証オプション(GitHub/GitLab/Google)
  • カスタムのシリアライズ/デシリアライズプラグイン(AWS Glue, Smile)
  • RBAC によるきめ細かい UI アクセス制御
  • メッセージデータのマスキング

docker-compose による構築

#

提供されているコンテナイメージを使って docker run で起動できますが、オプションが多いので docker-compose を使うのが楽です。既存の Kafka cluster が存在する場合、UI を起動する最低限の設定は以下のようになります。

  • docker-compose.yml
version: '2'
services:
kafka-ui:
image: provectuslabs/kafka-ui
container_name: kafka-ui
ports:
- "8080:8080"
restart: always
environment:
- KAFKA_CLUSTERS_0_NAME=local
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092

KAFKA_CLUSTERS_N (N:番号)というプリフィクス付きの環境変数で管理対象の Kafka cluster の設定を指定します。複数のクラスターを管理する場合、プリフィクスの番号を変えて指定します。

kafka-ui/docker-compose.md at master · provectus/kafka-ui

Kafka cluster と kafka-ui を全て docker-compose で構築する例です。Kafka Broker と Zookeeper のコンテナイメージは Confluent のものを利用しています。

  • docker-compose.yml
---
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.2.1
container_name: zookeeper
environment:
TZ: Asia/Tokyo
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000

kafka0:
image: confluentinc/cp-kafka:7.2.1
container_name: kafka0
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
TZ: Asia/Tokyo
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka0:29092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 3000:8080
depends_on:
- kafka0
restart: always
environment:
TZ: Asia/Tokyo
KAFKA_CLUSTERS_0_NAME: kafka-0
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092

services で ZooKeeper ← Kafka Broker(kafka0) ← kafka-ui という依存関係を定義しています。Kafka Broker をポート番号9092で公開し、kafka-ui の 環境変数 KAFKA_CLUSTERS_0_BOOTSTRAPSERVERSKafka Broker のサービス名:ポート番号の形で Kafka Broker を指定します。kafka-ui 自身のポート番号は3000にしました。

docker-compose で起動します。

docker-compose up -d

起動後 localhost:3000 にアクセスすると、kafka-ui のダッシュボードが表示されます。トップレベルには管理対象の Kafka Cluster のリストが表示され、Broker、Partition、Topics の総数、送信されたメッセージ、消費されたメッセージのバイト数などのサマリー情報を見ることができます。

Dashboard

Topic の状態を UI で確認

#

docker-compose で起動した Kafka Broker のコンテナ(kafka0) に入って、kafka-console-consumer を使って Consumer を起動し、適当なトピック名(hoge)を指定してサブスクライブしてみます。

docker-compose exec kafka0 \                         
kafka-console-consumer --bootstrap-server kafka0:29092 --topic hoge

Consumers 画面に console-consumer-xxxx の形式の Group ID で Consumer が STABLE 状態で起動していることが表示されました。

Consumers

Consumer の詳細情報を表示させることもできます。

Consumer detail

起動時に指定した Topic 名(hoge)の Topic は自動作成され、Topics 画面で確認できます[1]

Topics

Information

スクリーンショットの Topic の一覧にある、__consumer_offsets は、Topic の Group ID ごとの消費済みオフセット情報を保持するために Kafka 自身が使用する特殊な Topic です。

Topic の詳細画面です。
Consumer detail

以下のようなタブから構成されます。

  • Overview タブ: Partiion や Replication Factor
  • Messages タブ: Topic に送信されたメッセージ
  • Settings タブ: Topic の詳細な設定
  • Statistics タブ: Topic に送信されたメッセージの統計量

Topic 詳細画面の Produce message で Topic にメッセージを送信することができます。

Produce Message

送信先の Partition を指定し、メッセージを編集して Produce Message をクリックするとメッセージが送信され、kafka-console-consumer 側で消費されました。

console-consumer

Topic の Messages タブからメッセージの詳細情報を見ることができます。

Message detail

Topic を UI で作成

#

上記の例では、kafka-console-consumer 起動時に Topic が自動作成されていました。その際、Partitions 1、Replication Factor 1 という設定になっていましたが、これは、Kafka Broker の設定値を元に作られています。

Broker の Configs タブで各種設定値を閲覧できます。キーワード検索も可能です。num.partitions は1になっています。

num.partitions

default.replication.factor も1です。

replication.factor

Topic 一覧画面の Add Topic をクリックして UI で Topic を作成できます。

Add Topic

トピック名以外の様々なパラメータを指定して Topic を作成できます。

Partition を2に指定して Topic を作成しました。

Topic with 2 partitions

Information

Replication Factor は Topic の Partition をいくつの Kafka Broker に分散配置するかを決めるパラメータです。

以下のスクリーンショットは Kafka Broker の数より大きい Replication Factor を指定して Create topic をクリックしたところです。ちゃんと設定を見て入力値を検証してくれます。

Add Topic with validation

Consumer Group の監視・管理

#

上記の Partition 数2の Topic にサブスクライブする Consumer を kafka-console-consumer で起動しました。今回は、Group ID を指定して起動しました。下記コマンドを、2つの別のターミナルで実行しています。

docker-compose exec kafka0 \
kafka-console-consumer --bootstrap-server kafka0:29092 \
--topic fuga \
--consumer-property group.id=group-1

Topic の Consumers タブを開くと、起動時に指定した Group ID で Active Consumers が2つ STABLE になっているのがわかります。

2 consumers of topic

対象の Group を選択し、属している Consumer の ID やメッセージの処理状況を確認できます。

Consumer Group detail

Topic の Statistics タブでも統計情報が更新されています。

Statistics

Metrics の確認

#

最初の docker-compose.yml ではメトリクス情報の設定をしていないので、Broker の Metrics タブには何も出てきません。そこで、Kafka Broker の環境変数に KAFKA_JMX_PORTKAFKA_JMX_HOSTNAME を追加して JMX Metrics のホスト名、ポート番号を指定し、kafka-ui 側から KAFKA_CLUSTERS_0_METRICS_PORT として参照するようにしました。

  kafka0:
image: confluentinc/cp-kafka:7.2.1
container_name: kafka0
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
TZ: Asia/Tokyo
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka0:29092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_JMX_PORT: 9997 # 追加
KAFKA_JMX_HOSTNAME: kafka0 # 追加

kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 3000:8080
depends_on:
- kafka0
restart: always
environment:
TZ: Asia/Tokyo
KAFKA_CLUSTERS_0_NAME: kafka-0
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997 # 追加

これで Broker の Metrics タブで Metrics データを JSON 形式で取れるようになりました。Metrics は JMX の他 Prometheus も指定できるようです。

Metrics

Information

グラフィカルなダッシュボードを期待したのですが、現在は提供されていないようです。issue がありました。Metrics visualization · Issue #942 · provectus/kafka-ui

kafka-ui を読み取り専用設定で起動する

#

kafka-ui のデフォルトでは、Topic の作成・削除などの Kafka に影響を与える操作が有効化されています。プロダクション環境の Kafka に影響を与えず監視だけしたいなどのケースのため、Read Only モードがサポートされています。環境変数 KAFKA_CLUSTERS_0_READONLYtrue を指定することで kafka-ui が Read Only モードで起動します。

  kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 3000:8080
depends_on:
- kafka0
restart: always
environment:
TZ: Asia/Tokyo
KAFKA_CLUSTERS_0_NAME: kafka-0
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka0:29092
KAFKA_CLUSTERS_0_METRICS_PORT: 9997
KAFKA_CLUSTERS_0_READONLY: true # 追加

最後に

#

以上、kafka-ui を試してみました。ローカルの Docker でネットワーク遅延がないせいもありますが、サクサク動いていい感じです。公式の README にはスクリーンキャプチャーもありますので、実行しなくても雰囲気は掴めると思います。

今回取り上げていませんが、以下のような用途別の docker-compose ファイルも提供されていますので参考になると思います。

  • スキーマレジストリ(メッセージのスキーマを管理するサーバー)を立てて kafka-ui で管理する
  • Kafka Connect を設定して kafka-ui で管理する
  • SSL を使う
  • 様々な認証方式を使う

kafka-ui/documentation/compose at master · provectus/kafka-ui

今回 Docker を使いましたが、Helm Chart も提供されており Kubernetes への導入も簡単になっています。

kafka-ui/charts/kafka-ui at master · provectus/kafka-ui

kafka-ui の GitHub リポジトリには、Topic 作成などのオペレーションに関する enhancement issue も多く登録されており、Kafka 運用ツールとしての期待値の高さを伺わせます。今後の開発に注目したいと思います。


  1. Kafka Broker のデフォルトでは、Topic は自動作成になっています。 ↩︎

豆蔵デベロッパーサイト - 先週のアクセスランキング
  1. 基本から理解するJWTとJWT認証の仕組み (2022-12-08)
  2. Docker+Wasm で WASM をコンテナとして実行する (2023-01-25)
  3. 自然言語処理初心者が「GPT2-japanese」で遊んでみた (2022-07-08)
  4. 直感が理性に大反抗!「モンティ・ホール問題」 (2022-07-04)
  5. Nuxt3入門(第4回) - Nuxtのルーティングを理解する (2022-10-09)
  6. AWS認定資格を12個すべて取得したので勉強したことなどをまとめます (2022-12-12)
  7. Jest再入門 - 関数・モジュールモック編 (2022-07-03)
  8. ORマッパーのTypeORMをTypeScriptで使う (2022-07-27)
  9. Nuxt3入門(第8回) - Nuxt3のuseStateでコンポーネント間で状態を共有する (2022-10-28)
  10. Nuxt3入門(第1回) - Nuxtがサポートするレンダリングモードを理解する (2022-09-25)