K8S で Kafka を実行するのは適切でしょうか?どのような落とし穴に遭遇するでしょうか?

K8S で Kafka を実行するのは適切でしょうか?どのような落とし穴に遭遇するでしょうか?

Kubernetes は、ステートレス ワークロードを実行するためにゼロから設計されました。これらのワークロードは通常、マイクロサービス アーキテクチャを使用して構築され、軽量で、水平方向にスケーラブルであり、12 要素アプリに準拠しており、サーキット ブレーキングやランダム モンキー テストを処理できます。

一方、Kafka は本質的に分散データベースです。つまり、マイクロサービスよりも重い状態を処理する必要があるということです。 Kubernetes はステートフル ワークロードをサポートしていますが、Kelsey Hightower が最近の 2 つのツイートで指摘したように、慎重に扱う必要があります。

では、Kubernetes 上で Kafka を実行すべきでしょうか?私の反対の質問は、Kafka はそれがなくてもより良く動作するかということです。そのため、Kafka と Kubernetes がどのように相互に補完し合うのか、また、どのような落とし穴に陥る可能性があるのか​​を指摘したいと思います。

1. ランタイム

まずは基本、つまりランタイム自体から始めましょう。

1. プロセス

Kafka ブローカーは CPU に優しいです。 TLS によってオーバーヘッドが発生する可能性があります。 Kafka クライアントが暗号化を使用する場合、より多くの CPU が必要になりますが、ブローカーには影響しません。

2. 記憶

Kafka ブローカーは大量のメモリを消費します。 JVM ヒープは通常 4 ~ 5 GB に制限されますが、Kafka はページ キャッシュを多用するため、十分なシステム メモリも必要です。 Kubernetes では、コンテナ リソースの制限とリクエストをそれに応じて設定できます。

3. 保管

コンテナ内のストレージは一時的なものであり、再起動するとデータが失われます。 Kafka データに emptyDir ボリュームを使用することもできますが、同じ効果があり、停止後にブローカーのデータが失われます。メッセージは他のブローカーでもコピーとして引き続き利用可能です。したがって、再起動後、障害が発生したブローカーはすべてのデータを複製する必要があり、これは時間のかかるプロセスになる可能性があります。

これが永続ストレージを使用する必要がある理由です。 XFS または ext4 を使用した非ローカルの永続ブロック ストレージの方が適しています。警告します: NFS を使用しないでください。 NFS v3 も v4 も動作しません。

つまり、NFS の「愚かな名前変更」問題によりデータ ディレクトリを削除できないため、Kafka ブローカーは自動的に終了します。もしまだ信じられないなら、このブログ記事を注意深く読んでください[1]。 Kubernetes が再起動または再配置されたときに別のノードをより柔軟に選択できるように、ストレージは非ローカルである必要があります。

4. ネットワーク

ほとんどの分散システムと同様に、Kafka のパフォーマンスは、ネットワークの遅延が少なく、帯域幅が広いことに大きく依存します。すべてのブローカーを同じノードに配置しないでください。可用性が低下します。

Kubernetes ノードに障害が発生すると、Kafka クラスター全体に障害が発生します。 Kafka クラスターをデータセンター間で拡張しないでください。 Kubernetes クラスターにも同じことが当てはまります。異なる可用性ゾーンは適切なトレードオフです。

2. 構成

1. リスト

KubernetesのWebサイトには、マニフェストを使用してZooKeeperを設定する方法に関する優れたチュートリアル[2]が掲載されています。 ZooKeeper は Kafka の一部であるため、ここではどの Kubernetes の概念が適用されているかについてある程度の洞察が得られます。一度理解すれば、同じ概念を Kafka クラスターでも使用できます。

1) ポッド

Pod は Kubernetes でデプロイ可能な最小単位です。クラスター内のプロセスを表すワークロードが含まれます。 Pod は 1 つ以上のコンテナーで構成されます。アンサンブル内の各 ZooKeeper サーバーと Kafka クラスター内の各 Kafka ブローカーは、個別の Pod で実行されます。

2) ステートフルセット

StatefulSet は、調整する必要がある複数のステートフル ワークロードを処理するための Kubernetes オブジェクトです。 StatefulSets は Pod の順序と一意性を保証します。

3) ヘッドレスサービス

サービスは論理名を通じてポッドをクライアントから切り離します。 Kubernetes が負荷分散を処理します。ただし、ZooKeeper や Kafka などのステートフル ワークロードの場合、クライアントは特定のインスタンスと通信する必要があります。ここでヘッドレス サービスが役立ちます。クライアントとして論理名を取得することはできますが、ポッドに直接アクセスする必要はありません。

4) 永続ボリューム

前述のように、非ローカルの永続ブロック ストレージを構成する必要があります。

Yolean[3]は、Kubernetes上でKafkaを使い始めるのに役立つ包括的なチェックリストセットを提供しています。

2. ヘルムチャート

Helm は、yum、apt、Homebrew、Chocolatey などの OS パッケージ マネージャーに似た、Kubernetes 用のパッケージ マネージャーです。 Helm Charts に記述された定義済みパッケージをインストールできます。

適切に設計された Helm Charts は、Kubernetes 上で Kafka を実行するためにすべてのパラメータを正しく構成するという複雑なタスクを簡素化します。 Kafka にはいくつかのチャートが用意されています。たとえば、開発中の公式チャート [4]、Confluent のチャート、Bitnami のチャートなどがあります。

3. オペレーター

Helm にはいくつかの制限があるため、Kubernetes Operators という別のツールが非常に人気になりました。オペレーターは、Kubernetes 用のソフトウェアをパッケージ化するだけでなく、Kubernetes 用のソフトウェアをデプロイおよび管理します。

高評価の演算子のリストにはKafka用の演算子が2つ記載されており、そのうちの1つがStrimzi[5]です。 Strimzi を使用すると、ほとんど構成を必要とせずに数分で Kafka クラスターを簡単に起動でき、クラスター間のポイントツーポイント TLS 暗号化などの便利な機能が追加されます。 Confluent は、新しい Operator がまもなく利用可能になることも発表しました。

4. パフォーマンス

Kafka インストールのベンチマークを行うには、パフォーマンス テストを実行することが重要です。問題が発生する前に、ボトルネックになる可能性のある場所がどこにあるかを把握できるようになります。

幸いなことに、Kafka にはすでに kafka-producer-perf-test.sh と kafka-consumer-perf-test.sh という 2 つのパフォーマンス テスト ツールが用意されています。頻繁に使用することを忘れないでください。参考までに、ジェイ・クレプスのブログ投稿結果[6]やステファン・マーレクのAmazon MSKのレビュー[7]を参考にすることができます。

3. 運用と保守

1. 監視

可視性は非常に重要です。そうでないと、何が起こっているのかわかりません。現在、クラウドネイティブな方法でメトリックを監視するための優れたツールがあります。 Prometheus と Grafana は 2 つの人気のあるツールです。 Prometheus は、JMX エクスポーターから直接、すべての Java プロセス (Kafka、ZooKeeper、Kafka Connect) のメトリックを収集できます。 cAdvisor メトリックを追加すると、Kubernetes リソースの使用状況に関する追加情報が提供されます。

Strimzi は、Kafka 用の Grafana ダッシュボードの優れた例を提供します。複製されていないパーティションやオフラインのパーティションなどの主要なメトリックを非常に直感的な方法で視覚化します。これらのメトリックは、リソース使用量、パフォーマンス、安定性の指標で補完されます。基本的な Kafka クラスター監視を無料で入手しましょう。

▲ 出典: https://strimzi.io/docs/master/#kafka_dashboard

これは、Burrowラグモニタリングを使用したクライアント側モニタリング(コンシューマーおよびプロデューサーメトリック)と、Kafka Monitor[8]を使用したエンドツーエンドのモニタリングを通じて実現できます。

2. ログ記録

ログ記録ももう一つの重要な部分です。 Kafka インストール内のすべてのコンテナが stdout と stderr にログを記録していることを確認し、Kubernetes クラスターがすべてのログを Elasticsearch などの中央ログ機能に集約していることを確認します。

3. 健康チェック

Kubernetes は、活性プローブと準備プローブを使用して、Pod が正常かどうかを判断します。ライブネスプローブが失敗した場合、Kubernetes はコンテナを終了し、再起動ポリシーが適切に設定されていれば自動的に再起動します。準備プローブが失敗した場合、Kubernetes はサービスを通じてリクエストを処理する Pod を削除します。つまり、この場合、人間の介入は不要になり、これは大きな利点です。

4. ローリングアップデート

StatefulSets は自動更新をサポートしています。ローリング更新戦略では、一度に 1 つの Kafka Pod を更新します。このようにして、ゼロダウンタイムを実現できます。これは、Kubernetes がもたらすもう 1 つの大きな利点です。

5. 拡張

Kafka クラスターのスケーリングは簡単ではありません。ただし、Kubernetes を使用すると、Pod を特定の数のレプリカに簡単に拡張できるため、必要な数の Kafka ブローカーを宣言的に定義できます。難しいのは、セクションを拡大または縮小する前に再割り当てすることです。繰り返しになりますが、Kubernetes はこのタスクの達成に役立ちます。

6. 管理

Pod でシェルを開くと、既存のシェル スクリプトを使用して、トピックの作成やパーティションの再割り当てなどの Kafka クラスターの管理タスクを完了できます。これはあまり良い解決策ではありません。 Strimzi は、別の Operator を使用してテーマを管理することをサポートしています。改善の余地があります。

7. バックアップと復元

現在、Kafka の可用性は Kubernetes の可用性にも依存しています。 Kubernetes クラスターに障害が発生すると、最悪の場合、Kafka クラスターにも障害が発生します。

マーフィーの法則によれば、あなたにも同じことが起こり、データが失われることになります。このリスクを軽減するには、バックアップのアイデアを用意しておく必要があります。 MirrorMakerは1つの選択肢であり、Zalandoのブログ投稿[9]で説明されているように、接続されたバックアップにS3を使用するという別の可能性もあります。

IV.結論

小規模から中規模の Kafka クラスターの場合、柔軟性が高く、操作が簡素化されるため、Kubernetes を選択することをお勧めします。レイテンシやスループットに関して非機能要件が非常に高い場合は、別のデプロイメント オプションの方が有利な場合があります。

>>>>

参考リンク

[1]https://engineering.skybettingandgaming.com/2018/07/10/kafka-nfs/

[2]https://kubernetes.io/docs/tutorials/stateful-application/zookeeper/

[3]https://github.com/Yolean/kubernetes-kafka

[4]https://github.com/helm/charts/tree/master/incubator/kafka

[5] https://strimzi.io/

[6]https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines

[7]https://medium.com/@stephane.maarek/an-honest-review-of-aws-managed-apache-kafka-amazon-msk-94b1ff9459d8

[8]https://github.com/linkedin/kafka-monitor

[9]https://jobs.zalando.com/tech/blog/backing-up-kafka-zookeeper/

オリジナルリンク: https://blog.usejournal.com/kafka-on-kubernetes-a-good-fit-95251da55837

<<:  分散メッセージングシステムの設計ポイント

>>:  平安金融クラウドがインターネット金融業界の発展に新たな推進力を注入

推薦する

Baidu のモバイル検索で PC ページが除外されたことに対し、医療ウェブサイトはどのように対処すべきでしょうか?

数日前の百度サロンの発表によると、百度はPCウェブページの収録を取りやめる可能性がある。百度は12月...

IaaS 環境における SaaS (Security as a Service) モデルの分析

1 クラウドコンピューティングIaaSの開発IaaS はインフラストラクチャ レベルのクラウド コン...

モバイルエッジコンピューティングは爆発的な成長を遂げると予想されている

モバイル エッジ コンピューティングを使用することの最も重要な意味は、効率的なデータ処理とタイムリー...

今週のニュースレビュー: Qvod が Qvod サーバーを閉鎖、Weibo がナスダックに上場

1. 「2014年にインターネットを浄化しよう」キャンペーンはオンライン文学界に動揺を引き起こした4...

エッジコンピューティングが業務に与える影響

エッジ コンピューティングが運用と保守に与える影響は相互に関連しており、次のようにまとめることができ...

Hostshark: 月額 4.95 ドル、米国 VPS、2G メモリ/2 コア/80g NVMe/1Gbps 帯域幅 (トラフィック無制限)/Windows+Linux

Hostshark.ioは今年設立された新しい企業で、主に米国で仮想ホスティング、VPS、独立サーバ...

ブログ統計とランキング 2014

2014 年ももうすぐ終わり、私のブログも新しい年を迎えようとしています。私の統計によると、過去1年...

友人の輪の中でのWeChatビジネスの徐々に衰退についての簡単な議論

友人の輪でのWeChat広告は、しばらく前から人気があります。WeChatの成果とともに、さまざまな...

Vultr - Alipay/日本/シンガポールおよびその他 15 のデータセンターへのアクセス、月額 2.5 ドル、Windows をサポート

VPSクラウドブランドVultr.comは、数年の運営を経て、ついにAlipay決済方法に正式に接続...

直帰率の定義と分析の詳細な説明

直帰率は、ウェブサイト分析の基本的な指標です。ページ情報がユーザーにとって効果的であるかどうかを評価...

Baidu製品プロモーション体験共有ライブラリと百科事典

百度は近年、検索エンジンに加え、他の製品の開発も本格的に進めている。弊社の自社製品は重量感があり、す...

IoTとエッジの関係

モノのインターネット(IoT)は急速に現実のものになりつつあります。英国の進化するエッジ コンピュー...

皆様、建国記念日おめでとうございます!

一年で珍しい長い休日です。今年の建国記念日は7日間です。皆さんが楽しい時間を過ごせますように!当分の...

2022年杭州雲奇会議は11月3日に開催予定:70以上のフォーラムと4万平方メートルの技術展示が今から無料で予約可能

記者は9月28日、雲奇大会組織委員会から、2022年杭州雲奇大会が11月3日から5日まで杭州雲奇鎮で...