Dockerを活用してKafkaクラスターを構築し, 各種UIツールを試す

2023/03/09に公開

はじめに

マイクロサービスの勉強中に, Apache Kafkaという技術が存在することを知りました.
Kafka の勉強がてら Docker を活用して構築する手順をまとめたので記事にまとめます.

🖨 この記事で取り扱うこと

Kafka の基本的な概念や用語については説明しません. あくまで手を動かしながら

  • Docker を活用してローカル環境に Kafka クラスターを構築する
  • Kafka の状態を監視/操作する UI ツールを試す
  • クライアントアプリケーション(Python)を動作させる

ことに焦点を当てます.

なお, Kafka クラスターは複数マシン(それぞれが別 IP アドレスを持つ)上で構成します.
とはいっても, 自宅に複数台のマシンがあるのは逸般の誤家庭[1]くらいですし, クラウド環境で手配するのも面倒です. この記事では, Docker を活用しローカル環境に複数のコンテナを起動させ, 仮想的に複数台のマシンがある環境を再現します.

😎 注意事項

実際に手を動かしながら進めたい方は, 以下の環境・知識があることを前提としています.

  • Docker および Docker Compose V2 が利用できる環境
  • Docker の基本コマンドを使えること

なお, できるだけシンプルな Kafka のハンズオンを目指したためセキュリティ的な設定は割愛しています. 商用環境で動作させる場合やセキュリティを重視する場合は適宜設定してください.

本編

📡 全体構成

全体構成図
注釈: Docker が動作すればよいので, Mac や Linux 環境でも問題ありません.

Windows 10 上の WSL2(Ubuntu 22.04)内で Docker を利用して複数のコンテナを立ち上げます. それぞれのコンテナは異なる IP アドレスを持っており, コンテナ内部で Kafka, Zookeeper, 各種 UI を dind(Docker in Docker)で構築しました.

あくまで WSL2 直上のコンテナは別 IP アドレスを持つマシンを仮想的に構築するために利用します.

🎯 準備

ソースコードをクローンし, フォルダ内に移動します.

git clone https://github.com/atsuyaide/kafka-training.git
cd kafka-training

コンテナを起動し, ローカルに複数マシンのある環境を仮想的に構築します.

docker compose up -d

各コンテナの IP アドレスを確認します. 下記のコマンドで実行中のコンテナの IP アドレスを表示できます.

$ docker ps -q | xargs -n 1 docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##' | sort -k 2
broker-1  172.19.0.2
broker-2  172.19.0.3
broker-3  172.19.0.4
kafka-ui  172.19.0.5
producer  172.19.0.6
consumer  172.19.0.7

表示される IP アドレスは環境によって異なります. ほかのコンテナを既に起動していたり, docker0 の設定変更をしている場合は IP が異なるはずです.

表示された IP アドレスを各コンテナにマウントされている.envファイルに書き込みます.
broker-1, 2, 3 の IP アドレスをkafka, clientディレクトリ配下の.envファイルに反映します. .envファイルのテンプレートとして.env.templateが用意しているので, 同じディレクトリにコピーしてファイルを編集してください.

私の環境ではそれぞれの.envファイルを以下のように設定することとなります.

BROKER1=172.19.0.2
BROKER2=172.19.0.3
BROKER3=172.19.0.4
<以下略>

これで準備完了です.
現時点で以下のディレクトリとファイル構成になっているはずです.

$ tree -a ./kafka
kafka
├── broker-1
│   ├── .env
│   ├── .env.template
│   ├── compose.kafka.yml
│   └── compose.zookeeper.yml
├── broker-2
│   ├── .env
│   ├── .env.template
│   ├── compose.kafka.yml
│   └── compose.zookeeper.yml
├── broker-3
│   ├── .env
│   ├── .env.template
│   ├── compose.kafka.yml
│   └── compose.zookeeper.yml
└── ui
    ├── .env
    ├── .env.template
    ├── compose.cmak.yml
            ...
    └── compose.ui.yml
$ tree -a ./kafka
├── consumer
│   ├── .env
│   ├── .env.template
│   ├── main.py
│   └── requirements.txt
└── producer
    ├── .env
    ├── .env.template
    ├── main.py
    └── requirements.txt

🌊 Kafka クラスターを構築

Apache Kafka は Apache Zookeeper と接続する必要があります.
まず, Zookeeper クラスターを構成した後, 各ホストで Kafka を起動してクラスターを構成します. また, 以降の作業は複数のターミナル環境があると作業しやすいです. 必要に応じて tmux やターミナルの split 機能を活用してください.

Zookeeper を起動

Zookeeper を broker-1, 2, 3で起動し, クラスターを構成します. 起動順序は特に指定はありませんが, ここではbroker-1から起動していきます.

コンテナに入ります.

docker exec -it broker-1 sh

Zookeeper を起動します.

docker compose -f ./src/compose.zookeeper.yml up -d

この作業をbroker-1, 2, 3の各コンテナでも実行してください.

全ての Zookeeper を起動後, ログを確認しながら Zookeeper が正常に起動できているか確認します. broker-1zookeeper-1のログを確認したい場合, broker-1内で下記のコマンドを実行します.

docker logs zookeeper-1

エラーが発生している場合は内容に応じて適宜対応してください. 正常にクラスターを組めた場合はLEADER/FOLLOWERの割り当て完了のログなどが表示されます.

Kafka を起動

Kafka を broker-1, 2, 3で起動し, クラスターを構成します.
起動時に Zookeeper クラスターに接続しますが, Kafka も起動順序について特に指定はありません.
ここでもbroker-1から起動していきます.

Kafka を起動します.

docker compose -f ./src/compose.kafka.yml up -d

この作業をbroker-1, 2, 3の各コンテナでも実行してください.

全ての Kafka が正常に起動できているか確認してください. 要領は Zookeeper と同じです.

🕶 各種 UI ツールを試す

GitHub のkafka-uiのタグがついており, スター数の多いものをいくつか試しました. このセクションでは様々な UI ツールを試す環境を提供しますが, 詳細は説明しません(記事が長くなりますし, まとめるのが大変なので).

UI 起動用のコンテナに入ります.

docker exec -it kafka-ui sh

下記の中から利用したい UI ツールを起動してくだい.

Kafka Topics UI

docker compose -f ./src/compose.topics-ui.yml up -d

localhost:8000にアクセスすると UI が表示されます.

Kafka Topics UIのトップ画面
一番シンプル. メッセージは確認できるが, トピックの作成などはできない.

Redpanda Console

docker compose -f ./src/compose.redpanda-console.yml up -d

localhost:8080にアクセスすると UI が表示されます.

Redpanda Consoleのトップ画面

Kafka UI

docker compose -f ./src/compose.ui.yml up -d

localhost:8888アクセスすると UI が表示されます.

Kafka UIのトップ画面
個人的には一番使いやすいと感じました. 機能も最も充実している気がします

CMAK(Kafka Manager の後継)

docker compose -f ./src/compose.cmak.yml up -d

localhost:9000にアクセスすると UI が表示されます.

CMAKのトップ画面
クラスターの追加は手動またはAPIで実行する必要がある

Kafdrop

docker compose -f ./src/compose.kafdrop.yml up -d

localhost:9090にアクセスすると UI が表示されます.

Kafdropのトップ画面

🎮 クライアント API を試す

kafka-pythonを使って実際にメッセージを流してみます.

Pythonクライアントを使ったデモ
動作風景. 左がプロデューサー, 右がコンシューマー
プロデューサーが送信した文字列をコンシューマーが即時受け取れていることを確認できます.

プロデューサー側

プロデューサー側のコンテナに入ります.

docker exec -it producer sh

ライブラリをインストールします.

pip install -r /src/requirements.txt

Producer を起動します. --bootstrap-serversの部分は自身の情報で実行してください.

python /src/main.py --topic sample-topic --bootstrap-servers 172.19.0.2:9092,172.19.0.3:9092,172.19.0.4:9092

文字列を入力し, Enter で Kafka クラスターにメッセージを送信できます.

コンシューマー側

コンシューマー側のコンテナに入ります.

docker exec -it consumer sh

ライブラリをインストールします.

pip install -r /src/requirements.txt

Producer を起動します. --bootstrap-serversの部分は自身の情報で実行してください.

python /src/main.py --topic sample-topic --bootstrap-servers 172.19.0.2:9092,172.19.0.3:9092,172.19.0.4:9092

起動すると待ち受け状態に入り, 到着したメッセージをターミナル上に表示します.

また, 各種 UI ツールを試すのセクションで起動したツールを使うと Kafka に保存されているメッセージの詳細やコンシューマの状態なども確認できるものもあります. 例えば, --group-idでコンシューマーグループ ID を指定することで Kafka UI のコンシューマ一覧に Python クライアントが表示されるようになります.

Kafka UIのConsumers画面

この画像は--group-id sample-groupとした場合です.

🎉 おわりに

全てのコンテナを落として終了です.

docker compose down

お疲れ様でした!!

脚注
  1. https://www.youtube.com/@unchamacomcom ↩︎

GitHubで編集を提案

Discussion