CLOVER🍀

That was when it all began.

Apache KafkaをKafka Topics UIで見てみる

ちょっと前なのですが、JJUG CCC 2017 Fallの時に@bufferingsさんの発表を見ていて、内容以外で気になっていたことがありまして。

Spring BootとKafkaでCQRS

それは、「あのKafkaを操作しているUIなに??」

すごく便利そうだったので、内容以外にもずーっとそっちも見ていました(笑)。で、なにを使っているかは気付いたものの、
それからあまり時間が取れていなかったので、今頃ですが試そうかなと思います。

ちなみに、自分はTopic内のデータを見たい場合はTrifecta、そうでない場合はKafka Managerを使っていました。

GitHub - ldaniels528/trifecta: Trifecta is a web-based and CLI tool that simplifies inspecting Kafka messages and Zookeeper data. Additionally, the CLI tool provides the capability to import/export data to/from ElasticSearch and MongoDB.

GitHub - yahoo/kafka-manager: A tool for managing Apache Kafka.

Kafka Topics UI

Landoopが提供する、Kafka Topics UIというツールみたいです。
※この「Landoop」って文字だけデモで覚えて帰りました…

Landoop | Kafka Topics UI (rest proxy v2)

Landoop | Kafka Topics UI

GitHub - Landoop/kafka-topics-ui: Web Tool for Kafka Topics using Kafka Rest |

GitHubの内容を見ていると、ConfluentのKafka REST Proxyを使ってApache Kafkaにアクセスするツールのようで。

GitHub - confluentinc/kafka-rest: Confluent REST Proxy for Kafka

Kafka REST Proxyは、Confluent Platformの一部らしいです。Confluent Platformについては、こちら。

What is the Confluent Platform?

Confluent Platformってどんなの?

ライセンス上の注意は、こちら。

Dockerで構築する

というわけで、Kafka Topics UIを使うにはApache ZooKeer、Apache Kafka以外にConfluent Kafka REST ProxyとLandoop Kafka Topics UIが必要になります、と。

どうしようかなーとダウンロードページとかインストール方法とかを見て考えた結果…

Download

Install Confluent Platform

Dockerイメージを使うことにしました。
※ダウンロード時のEmailを嫌っただけです

Docker Quick Start

となると、Docker Composeで立てるのがよさそうですが、@bufferingsさんが作成しているdocker-compose.ymlが
すでにあったりします。

https://github.com/bufferings/jjug2017/blob/master/tools/docker-compose.yml

まあ、自分でもやってみるかと。

いろいろSingle Nodeですが、とりあえず簡単に使うために用意したのはこちら。
docker-compose.yml

version: "3"

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:4.0.0
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - kafka-cluster-network
  kafka:
    image: confluentinc/cp-kafka:4.0.0
    depends_on:
      - zookeeper
    container_name: kafka
    environment:
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092"
    networks:
      - kafka-cluster-network
  kafka-rest:
    image: confluentinc/cp-kafka-rest:4.0.0
    depends_on:
      - kafka
    container_name: kafkarest
    environment:
      KAFKA_REST_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_REST_HOST_NAME: "kafkarest"
      KAFKA_REST_LISTENERS: "http://kafkarest:8082"
    networks:
      - kafka-cluster-network
  kafka-topic-ui:
    image: landoop/kafka-topics-ui:0.9.3
    depends_on:
        - kafka-rest
    environment:
      KAFKA_REST_PROXY_URL: "http://kafkarest:8082"
      PROXY: "true"
    ports:
      - "8000:8000"
    networks:
      - kafka-cluster-network

networks:
  kafka-cluster-network:

Apache ZooKeeper、Apache Kafkaについては、特に公式のものはなさそうだったのでConfluentのDockerイメージを使うことにしました。
※ふつうにApache Kafkaのダウンロードページから取得できるApache Kafka、Apache ZooKeeperを使っても問題ありません
ConfluentのQuick Startでは、Dockerのネットワークは「host」になっていますが、そこは今回やらない方向で。

設定については、こちらを参照。

ZooKeeper
Docker Quick Start / ZooKeeper

Apache ZooKeeperへの接続ポートを指定。

  zookeeper:
    image: confluentinc/cp-zookeeper:4.0.0
    container_name: zookeeper
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
    networks:
      - kafka-cluster-network

Kafka
Docker Quick Start / Kafka

Apache ZooKeeperへの接続先と、Listenerの指定。「KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR」については、今回はパス。

  kafka:
    image: confluentinc/cp-kafka:4.0.0
    depends_on:
      - zookeeper
    container_name: kafka
    environment:
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092"
    networks:
      - kafka-cluster-network

REST Proxy
Docker Quick Start / REST Proxy

Schema Registryは今回使わないので、「KAFKA_REST_SCHEMA_REGISTRY_URL」はパス。あとは、Apache ZooKeeperへの接続先や、Kafka REST Proxyとしての
接続先定義。

  kafka-rest:
    image: confluentinc/cp-kafka-rest:4.0.0
    depends_on:
      - kafka
    container_name: kafkarest
    environment:
      KAFKA_REST_ZOOKEEPER_CONNECT: "zookeeper:2181"
      KAFKA_REST_HOST_NAME: "kafkarest"
      KAFKA_REST_LISTENERS: "http://kafkarest:8082"
    networks:
      - kafka-cluster-network

最後は、Kafka Topics UI。
kafka-topics / Running it

Kafka REST Proxyと別ホストで動作させる場合は、PROXYをtrueにすればよいみたいです。

  kafka-topic-ui:
    image: landoop/kafka-topics-ui:0.9.3
    depends_on:
        - kafka-rest
    environment:
      KAFKA_REST_PROXY_URL: "http://kafkarest:8082"
      PROXY: "true"
    ports:
      - "8000:8000"
    networks:
      - kafka-cluster-network

Kafka Topics UIだけは、ホスト側の8000ポートで参照可能なようにしています。

ホスト名の解決については、Docker Networkを使って解決するのが良さそうなので、networksを定義してコンテナ名を指定する方向で。
とりあえず、Apache KafkaとかApache ZooKeeperが複数Nodeになることは、今回は考えない…。

networks:
  kafka-cluster-network:

Legacy container links

Docker container networking

Networking in Compose

dockerのlinkオプションがレガシーなので、コンテナ間で名前解決できるようにネットワークを用意する

確認

では、起動。

$ docker-compose up

http://localhost:8000」にアクセスしてみます。こういう画面が見れたらOKです。

Kafka REST Proxyにアクセスできない場合は、「KAFKA REST」の欄にエラーメッセージが表示され、Topic数やBroker数も認識しません。

では、ここでTopicを作ってみましょう。

$ docker exec -it kafka bash -c 'kafka-topics --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic test-topic'
Created topic "test-topic".

Kafka Topics UIをリロードすると、作成したTopicを認識しています。

左側に作成したTopicが現れているので、クリックするとさらに詳細を見ることができます。

最後に、データを入れてみましょう。

$ docker exec -it kafka bash -c 'kafka-console-producer --broker-list kafka:9092 --topic test-topic'
>Hello Kafka
>Kafka Topics UI
>test

対象のTopicの「DATA」タブを選んでリロードしてみます。

登録したデータが確認できました。

これはいいですね、ちょっと使っていってみましょう。