KafkaのワークロードバランスをStrimziのCruise Control統合でマスターする

はじめに

Kafkaはイベントストリーム処理のためのデータストリームプラットフォームであり、トピック(Topic)とパーティション(Partition)を用いた分散処理を実現しています。一方、StrimziはCNCF(Cloud Native Computing Foundation)の孵化プロジェクトとして、Kubernetes上でApache Kafkaを運用するためのツールであり、デプロイ、セキュリティ、アップグレードなどのDay 1とDay 2の操作をサポートしています。この記事では、Strimziが提供するCruise Controlとの統合により、Kafkaのワークロードバランスを効率的に実現する方法について解説します。

KafkaとStrimziの概要

Kafkaは、トピックとパーティションを用いた分散型メッセージキューであり、パーティションのレプリケーション(Replica)を複數のBrokerに分散することで高可用性を実現します。Strimziは、Kubernetes上でApache Kafkaを運用するためのオープンソースプロジェクトであり、Kafkaのデプロイ、監視、セキュリティ設定、アップグレードなど、運用ライフサイクル全體をサポートします。

Cruise Controlの機能とアーキテクチャ

Cruise Controlは、Kafkaのワークロードバランスを自動化するオープンソースツールで、以下の3つのフェーズで動作します。

  1. 監視:KafkaからCPU、メモリ、ネットワーク、パーティションリーダーの分佈などの指標を収集します。
  2. モデリングと最適化提案:収集した指標を基に、CPU/メモリの均等分佈、rackの分散、パーティションリーダーの分散などの負荷バランス戦略を提案します。
  3. 実行:提案された負荷バランスを実行し、パーティションを移動して目標を達成します。

また、Cruise ControlはBrokerの障害、ディスクエラー、トピックの異常などを検出し、通知や自動修復を実行する異常検出機能も備えています。

StrimziとKubernetesの統合

Cruise Controlのデプロイは、Kafkaのカスタムリソース(Custom Resource)を用いて行います。spec.cruiseControlでデフォルトの目標(CPU/メモリ容量)、認証、TLS証明書などを設定し、Kafka Brokerのメトリクスレポートャー(Metrics Reporter)を自動的に構成します。Strimzi Operatorは、Brokerのロールアウト更新を行い、メトリクスレポートャーを起動し、Cruise Controlをデプロイします。

Kubernetesとの統合では、KafkaRebalanceというカスタムリソースを用いて、ユーザーが負荷バランスの目標とパラメータを指定します。以下は、KafkaRebalanceのリソース構造の例です。

apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
  name: my-rebalance
spec:
  cluster: my-cluster
  goals:
    - type: "BALANCE_CPU"
    - type: "BALANCE_NETWORK"
  mode: "FULL"
  replicationThrottle: "10MB/s"

操作フローは以下の通りです。

  1. KafkaRebalanceリソースを作成し、Operatorが最適化提案を生成します。
  2. strimzi.io/approved: "true"などのアノテーションで提案を承認し、実行を開始します。
  3. 現在のバッチ操作を中斷する(strimzi.io/stop: "true")または提案を再生成する(strimzi.io/refresh: "true")が可能です。

ワークロードバランスの実行詳細

提案評価では、OperatorがKafkaRebalanceリソースの狀態を更新し、移動するパーティション數やリーダー調整などの情報を表示します。

実行制御では、replicationThrottleパラメータでパーティション移動の速度を制限し、クラスターのパフォーマンスへの影響を抑えることができます。また、クラスター狀態の変化(パーティション調整など)が発生した場合、提案を再生成して最新のモデルを取得できます。

狀態監視では、提案、実行進捗、異常通知などのすべての操作狀態がKafkaRebalanceリソースの狀態フィールドに返されます。

システムアーキテクチャとコンポーネント

Cruise Controlのコンポーネントには、メトリクスレポートャー、ロードモニタ、エグゼキューター、異常検出器が含まれます。メトリクスレポートャーは各Kafka Brokerで指標を収集し、Kafkaトピックに送信します。ロードモニタは指標を分析し、ワークロードモデルを構築します。エグゼキューターはパーティションの移動を実行し、異常検出器はBrokerの障害やトピックの異常を検出し、通知を発信します。

Kubernetesのコンポーネントには、Operatorとロールアウト更新が含まれます。OperatorはCruise Controlを自動的にデプロイし、KafkaRebalanceリソースを管理します。ロールアウト更新はKafka Brokerを更新し、メトリクスレポートャーを有効化します。

重要な技術ポイント

目標導向バランスは、CPU、ネットワーク、rack分散などのカスタム負荷目標をサポートし、ハード目標(必須達成)とソフト目標(近似達成)を區別します。

Kubernetesの自動化は、カスタムリソースとOperatorを用いてCruise Controlを管理し、REST APIの直接操作を迴避します。

セキュリティでは、デフォルトでTLS認証が有効化され、Cruise ControlとKafka間の通信を安全にします。

Cruise Controlの自動修復と今後の機能

Cruise Controlは異常検出機能を備えており、自動的に修正を実行しますが、Kubernetesイベントなどの通知メカニズムを組み合わせて、ユーザーに異常を知らせる必要があります。コミュニティは提案を通じて、異常通知や進捗監視などの機能拡張に貢獻できます。

今後の活動とコミュニティ

StreamCom 2024(6月開催)では、Strimziの核心機能、內部実裝、使用例、CNCFプロジェクトとの統合について議論されます。コミュニティ參加方法として、Slackでの協力依頼、GitHubでのIssue提出や議論、コードの貢獻、ドキュメントの修正、機能提案などが挙げられます。また、ライトニングトークでStrimziの現在の狀況と今後の方向性について紹介されます。

結論

StrimziとCruise Controlの統合により、Kafkaのワークロードバランスを自動化し、運用効率を向上させることができます。カスタムリソースとOperatorを活用することで、Kubernetes環境での負荷バランス管理が簡素化され、セキュリティとスケーラビリティが確保されます。実裝時には、目標設定、異常検出、自動修復の設定を慎重に行い、クラスターの安定性を維持することが重要です。