ローカル 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 を設定する¶
kind や minikube などの開発環境に Apache Kafka クラスターを作成するには、まず Strimzi operator をインストールする必要があります。
kubectl create namespace kafka
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
それが完了したら、必要な FeatureGate を有効にするために Operator の Deployment
を patch
する必要があります。
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
brokerClass
を Kafka
に設定するだけでなく、上記の 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 クラスタに対してスムーズに開発を進めることができます。
説明した設定のインストールスクリプトはこちらにあります。