コンテンツへスキップ

ローカル Knative 開発で Apache Kafka を使用する

公開日: 2023-01-12 ,  改訂日: 2024-01-17

ローカル Knative 開発で Apache Kafka を使用する

著者: Matthias Weßendorf、Red Hat のプリンシパル ソフトウェア エンジニア

このブログ記事では、Knative Broker と Apache Kafka を使用して、ローカル開発に本番環境のような環境を使用する方法を学びます。

Apache Kafka 用の Knative Broker 実装 は、Knative Broker API の Kafka ネイティブ実装であり、ネットワーク ホップの削減、あらゆる Kafka バージョンのサポート、Broker および Trigger モデル用の Apache Kafka とのより良い統合など、チャネル ベースの Knative Broker 実装の使用を上回る改善を提供します。

ローカル開発環境の選択

すべてのプロジェクトの開始時に、常に重要な側面は、開発プロセスをできるだけシンプルかつ現実的に保つことです。

Knative Broker API を使用する場合、開発環境の最初の考えは、機能するために追加のシステムが不要なため、開発の主なツールとして、MTChannelBasedBroker リファレンス ブローカー (InMemoryChannel によってバックアップ) を使用することです。

ただし、Knative Broker の API は汎用的であり、すべてのブローカー実装で同じですが、ブローカー実装が異なると、動作にいくつかの違いがあります。確かに、Apache Kafka のようなシステムは、「インメモリ」ストレージとは大きく異なります。

Apache Kafka での開始から終了まで

Apache Kafka をターゲットにする場合は、開発環境に直接使用する必要があります。Apache Kafka の操作には多少のオーバーヘッドがありますが、Strimzi operator とバージョン 3 以降の Apache Kafka を使用すると、開発に単一ノードの Kafka クラスターを非常に簡単に使用でき、現実的な環境に近づけるという良いニュースがあります。

Apache Zookeeper は不要です!

これはすべて、Kafka の KRaft 機能によるものです。これは過去数年にわたって開発されており、最近、本番環境向け機能 として Apache Kafka 3.3.1 で発表されました。

Strimzi operator は、バージョン 0.29 以降、それを利用するための FeatureGate を提供しています。KRaft 自体は、Raft コンセンサス アルゴリズム の実装であり、Apache Kafka に直接存在し、Zookeeper のようなサードパーティ ツールは不要です。

Kubernetes 上で Strimzi を使用して Apache Kafka を設定する

kindminikube などの開発環境に Apache Kafka クラスターを作成するには、まず Strimzi operator をインストールする必要があります。

kubectl create namespace kafka
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka

それが完了したら、必要な FeatureGate を有効にするために Operator の Deploymentpatch する必要があります。

kubectl -n kafka set env deployment/strimzi-cluster-operator STRIMZI_FEATURE_GATES=+UseStrimziPodSets,+UseKRaft

Operator の Pod が起動して実行されたら、以下のような YAML スニペットを使用して、単一ノードの Apache Kafka クラスターを定義できます。

cat <<-EOF | kubectl -n kafka apply -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.3.1
    replicas: 1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
      default.replication.factor: 1
      min.insync.replicas: 1
      inter.broker.protocol.version: "3.3"
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
# With KRaft not relevant:
  zookeeper:
    replicas: 1
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
EOF

注: Kafkas.kafka.strimzi.io CR では、現在 zookeeper フィールドを記述する必要がありますが、UseKRaft FeatureGate が有効になっている場合は無視されます。UseKRaft の詳細については、このプレゼンテーションをご覧ください。

上記の構成は、Zookeeper インスタンスをまったく必要としない、単一ノードの Apache Kafka を構成します。

kubectl get pods -n kafka
NAME                                        READY   STATUS    RESTARTS        AGE
my-cluster-kafka-0                          1/1     Running   0               2h1m
strimzi-cluster-operator-6d94c67fd8-wfmvl   1/1     Running   1 (1h46m ago)   2h1m

Knative Eventing と Apache Kafka 用の Knative Broker のインストール

開発インスタンスで Apache Kafka が起動して実行された状態で、Knative Eventing と Apache Kafka 用の Knative Broker 実装をインストールします。

Eventing Core

Knative Kafka ブローカーを使用する場合、Knative Eventing の最小限のセットアップ、つまりすべての API と、controller および webhook Pod を提供するため、eventing-core マニフェストのみが必要です。

kubectl apply --filename https://github.com/knative/eventing/releases/download/knative-v1.8.4/eventing-core.yaml

完了すると、Knative Eventing 用に 2 つの Pod が実行されます。

kubectl get pods -n knative-eventing
NAME                                       READY   STATUS    RESTARTS   AGE
eventing-controller-7b95f495bf-dkqtl       1/1     Running   0          2h1m
eventing-webhook-8db49d6cc-4f847           1/1     Running   0          2h1m

Knative Kafka Broker のインストール

次のステップとして、Knative Kafka ブローカーのコントロールプレーンとデータプレーンをインストールする必要があります。

kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-controller.yaml
kubectl apply --filename https://github.com/knative-extensions/eventing-kafka-broker/releases/download/knative-v1.8.4/eventing-kafka-broker.yaml

その後、Knative Kafka ブローカー用に knative-eventing 名前空間に 4 つの新しい Pod が追加されます。

kubectl get pods -n knative-eventing
NAME                                       READY   STATUS    RESTARTS   AGE
eventing-controller-7b95f495bf-dkqtl       1/1     Running   0          2h4m
eventing-webhook-8db49d6cc-4f847           1/1     Running   0          2h4m
kafka-broker-dispatcher-859d684d7d-frw6p   1/1     Running   0          2h4m
kafka-broker-receiver-67b7ff757-rk9b6      1/1     Running   0          2h4m
kafka-controller-7cd9bd8649-d62dh          1/1     Running   0          2h4m
kafka-webhook-eventing-f8c975b99-vc969     1/1     Running   0          2h4m

Kafka ブローカー クラスをデフォルトとして設定する

Knative Kafka ブローカーの使用を簡単にするために、それをデフォルトのブローカーとして構成しています。まず、単一ノードの Apache Kafka クラスターを指すグローバル構成を指定します。

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: kafka-broker-config
  namespace: knative-eventing
data:
  default.topic.partitions: "10"
  default.topic.replication.factor: "1"
  bootstrap.servers: "my-cluster-kafka-bootstrap.kafka:9092"
EOF

レプリケーションファクターは、システム上の Kafka ポッドの数に関連付けられていることに注意することが重要です。Apache Kafka のシングルノードクラスタを運用しているため、1 を使用しています。

最後に、Knative Eventing の config-br-defaults ConfigMap を更新し、Knative Kafka ブローカーがシステムのデフォルトのブローカーになるように反映させます。

cat <<-EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: config-br-defaults
  namespace: knative-eventing
data:
  default-br-config: |
    clusterDefault:
      brokerClass: Kafka
      apiVersion: v1
      kind: ConfigMap
      name: kafka-broker-config
      namespace: knative-eventing
EOF

brokerClassKafka に設定するだけでなく、上記の kafka-broker-config 設定も参照することで、すべての新しいブローカーオブジェクトがこの設定に依存するようにします。この時点で、インストールと設定に関連するタスクは完了し、Knative Kafka ブローカーの実装を活用して、新しい Knative ブローカーオブジェクトを簡単に作成できます。

cat <<-EOF | kubectl apply -f -
apiVersion: eventing.knative.dev/v1
kind: Broker
metadata:
  name: my-demo-kafka-broker
spec: {}
EOF

Knative Kafka ブローカーオブジェクトを表す最小限のリソースがクラスタ上に作成されました。

kubectl get brokers.eventing.knative.dev

NAME                   URL                                                                                           AGE     READY   REASON
my-demo-kafka-broker   http://kafka-broker-ingress.knative-eventing.svc.cluster.local/default/my-demo-kafka-broker   2h6m   True

結論

Apache Kafka の KRaft 機能と Strimzi オペレーターを利用することで、Kubernetes 上でシングルノードの Apache Kafka クラスタを簡単に運用でき、ローカル開発プロセスをインメモリストレージではなく実際の永続化システムで早期に開始できます。KRaft は Apache Kafka のフットプリントを削減し、ユーザーは実際の、しかし小さな Apache Kafka クラスタに対してスムーズに開発を進めることができます。

説明した設定のインストールスクリプトはこちらにあります。

当サイトでは、サイトのトラフィックを把握するために分析とクッキーを使用しています。お客様の当サイトの利用に関する情報は、その目的のために Google と共有されます。詳しくはこちら。