第8章 KRaft モードへの移行
Kafka クラスターでのメタデータ管理に ZooKeeper を使用している場合は、KRaft モードで Kafka を使用するように移行できます。KRaft モードは ZooKeeper を置き換えて分散調整を行い、信頼性、スケーラビリティー、およびスループットを強化します。
移行中に、クラスター管理用の ZooKeeper に代わるコントローラーノードのクォーラムをノードプールとしてインストールします。アノテーション strimzi.io/kraft="migration"
を適用することで、クラスター設定で KRaft 移行を有効にします。移行が完了したら、ブローカーを KRaft の使用に切り替え、アノテーション strimzi.io/kraft="enabled"
を使用してコントローラーを移行モードから外します。
多くの 制限 があるため、移行を開始する前に、ご使用の環境が KRaft モードで Kafka をサポートできることを確認してください。次の点にも注意してください。
- 移行は専用コントローラーノードでのみサポートされ、broker と controller の二重のロールを持つノードではサポートされません。
- 移行プロセス全体を通じて、ZooKeeper ノードとコントローラーノードは一定期間並行して動作するため、クラスター内に十分なコンピュートリソースが必要になります。
前提条件
- Kafka 3.7.0 以降と Streams for Apache Kafka 2.7 を使用している。以前のバージョンの Streams for Apache Kafka または Apache Kafka を使用している場合は、KRaft モードに移行する前にアップグレードしてください。
ZooKeeper ベースのデプロイメントが、次のものなしで動作していることが確認されている (KRaft モードではサポートされていないため)。
- 双方向モードで実行される Topic Operator。単方向モードであるか、無効になっている必要があります。
-
JBOD ストレージ。
jbod
ストレージタイプを使用できますが、JBOD アレイにはディスクが 1 つだけ含まれている必要があります。
- Kafka クラスターを管理する Cluster Operator が稼働している。
Kafka クラスターのデプロイメントで、Kafka ノードプールが使用されている。
ZooKeeper ベースのクラスターがすでにノードプールを使用している場合は、移行する準備ができています。そうでない場合は、ノードプールを使用するようにクラスターを移行 できます。クラスターがノードプールを使用していないときに移行するには、
broker
ロールが割り当てられ、kafka
という名前を持つKafkaNodePool
リソース設定にブローカーが含まれている必要があります。ノードプールのサポートは、Kafka
リソース設定でstrimzi.io/node-pools: enabled
アノテーションを使用して有効にします。
この手順では、Kafka クラスター名は my-cluster
であり、my-project
namespace にあります。作成されたコントローラーノードプールの名前は、controller
です。ブローカーのノードプールは kafka
と呼ばれます。
手順
Kafka クラスターの場合、
controller
ロールを持つノードプールを作成します。ノードプールは、コントローラーノードのクォーラムをクラスターに追加します。
コントローラーノードプールの設定例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - controller storage: type: jbod volumes: - id: 0 type: persistent-claim size: 20Gi deleteClaim: false resources: requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
注記移行の場合、broker ロールと controller ロールを共有するノードのノードプールを使用することはできません。
新しい
KafkaNodePool
リソースを適用して、コントローラーを作成します。Cluster Operator ログに、ZooKeeper ベースの環境でのコントローラーの使用に関連するエラーが記録されることが予想されます。エラーにより調整がブロックされる可能性があります。これを防ぐには、すぐに次の手順を実行してください。
アノテーション
strimzi.io/kraft
をmigration
に設定して、Kafka
リソースで KRaft 移行を有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
KRaft 移行の有効化
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="migration" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="migration" # ...
アノテーションを
Kafka
リソース設定に適用すると、移行が開始します。コントローラーが起動し、ブローカーが起動したことを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods -n my-project
oc get pods -n my-project
出力には、ブローカーノードプールとコントローラーノードプール内のノードが表示されます
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NAME READY STATUS RESTARTS my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-controller-3 1/1 Running 0 my-cluster-controller-4 1/1 Running 0 my-cluster-controller-5 1/1 Running 0 # ...
NAME READY STATUS RESTARTS my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-controller-3 1/1 Running 0 my-cluster-controller-4 1/1 Running 0 my-cluster-controller-5 1/1 Running 0 # ...
移行のステータスを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -w
メタデータ状態の更新
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration
METADATA STATE
は、Kafka メタデータの管理と操作の調整に使用されるメカニズムを示します。移行の開始時点では、これはZooKeeper
です。-
ZooKeeper
は、メタデータが ZooKeeper にのみ保存されている場合の初期状態です。 -
KRaftMigration
は、移行が進行中の状態です。ZooKeeper から KRaft への移行を有効にするフラグ (zookeeper.metadata.migration.enable
) がブローカーに追加され、ブローカーがロールされてコントローラーに登録されます。この時点では、クラスター内のトピックとパーティションの数に応じて移行に時間がかかる場合があります。 -
KRaftDualWriting
は、Kafka クラスターが KRaft クラスターとして動作している一方で、メタデータは Kafka と ZooKeeper の両方に保存されているときの状態です。ブローカーは、フラグを削除して移行を有効にするために 2 回目のロールが行われます。 -
KRaftPostMigration
は、ブローカーに対して KRaft モードが有効になっているときの状態です。メタデータは引き続き Kafka と ZooKeeper の両方に保存されます。
移行ステータスは、
Kafka
リソースのstatus.kafkaMetadataState
プロパティーでも表されます。警告この時点から、ZooKeeper の使用にロールバック できます。次のステップは、KRaft を有効にすることです。KRaft を有効にした後はロールバックを実行できません。
-
メタデータの状態が
KRaftPostMigration
に達したら、アノテーションstrimzi.io/kraft
をenabled
に設定して、Kafka
リソース設定で KRaft を有効にします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
KRaft 移行の有効化
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="enabled" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="enabled" # ...
完全な KRaft モードへの移行のステータスを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -w
メタデータ状態の更新
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration my-cluster ... PreKRaft my-cluster ... KRaft
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration my-cluster ... PreKRaft my-cluster ... KRaft
-
PreKRaft
は、ZooKeeper 関連のリソースがすべて自動的に削除された状態です。 -
KRaft
は、KRaft の移行が完了した最終状態 (コントローラーのロール後) です。
注記ZooKeeper の
deleteClaim
の設定によっては、その永続ボリューム要求 (PVC) および永続ボリューム (PV) が削除されない場合があります。deleteClaim
は、クラスターのアンインストール時に PVC を削除するかどうかを指定します。デフォルトはfalse
です。-
ZooKeeper 関連の設定を
Kafka
リソースから削除します。以下の設定が存在する場合は削除できます。
-
log.message.format.version
-
inter.broker.protocol.version
spec.zookeeper.*
プロパティーlog.message.format.version
とinter.broker.protocol.version
を削除すると、ブローカーとコントローラーが再びロールします。ZooKeeper プロパティーを削除すると、KRaft で操作されるクラスターに存在する ZooKeeper 設定に関連する警告メッセージが削除されます。
-
移行時のロールバックの実行
Kafka
リソースで KRaft を有効にして移行が完了し、状態が KRaft
状態となる前に、次のようにロールバック操作を実行できます。
アノテーション
strimzi.io/kraft="rollback"
をKafka
リソースに適用して、ブローカーをロールバックします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
KRaft 移行のロールバック
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="rollback" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="rollback" # ...
上記のロールバックを行うには、移行プロセスが
KRaftPostMigration
状態である必要があります。ブローカーはロールバックされ、再び ZooKeeper に接続できるようになり、状態はKRaftDualWriting
に戻ります。コントローラーノードプールを削除します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc delete KafkaNodePool controller -n my-project
oc delete KafkaNodePool controller -n my-project
アノテーション
strimzi.io/kraft="disabled"
をKafka
リソースに適用して、メタデータの状態をZooKeeper
に返します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
ZooKeeper の使用への切り替え
Copy to Clipboard Copied! Toggle word wrap Toggle overflow apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="disabled" # ...
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster namespace: my-project annotations: strimzi.io/kraft="disabled" # ...