水平スケーラビリティと高可用性でJenkins®環境に革命を


水平スケーラビリティと 高可用性で Jenkins® 環境に革命を

著者: Samantha Frost

Jenkinsは、とびぬけて柔軟性が高いことで知られており、現在、特に広く利用されているビルドオーケストレーターの1つという地位を確立しています。セキュアでスケーラブルかつパフォーマンスの高いJenkins環境を構築し、何千という開発者やアプリケーションを抱え、複雑な開発ツールチェーンを持つ巨大組織をサポートするのは、並大抵のことではありません。開発者エクスペリエンスは常時絶えず機能し続けなければなりません。プラットフォームエンジニアが堅牢なプラットフォームを構築し、無限にスケールアップし、フォールトトレランスとレジリエンスを最大化できるようにするシステムが必要です。これをふまえて、上記の課題に真正面から対処する新機能であるCloudBees高可用性モードがCloudBees Continuous Integration (CloudBees CI)に導入されました。

高可用性:CI システムを動かし続ける

CI システムで最大のリスクは、Jenkinsコントローラーの喪失です。原因がKubernetesノードのアップグレードなどの計画されたメンテナンススケジュールであっても、ハードウェアの障害やメモリ不足などによる計画外の喪失であっても、問題には変わりありません。Jenkinsコントローラーがダウンすると、コントローラーが復旧するまでコントローラーのすべてのジョブが停止するため、ソフトウェアデリバリーライフサイクルの多大な遅れにつながりかねません。

CloudBees CIの高可用性モードのようなアクティブ/アクティブ構成の高可用性(HA)ソリューションを導入すると、ダウンタイムを短縮または排除して継続性を確保し、予期しないコントローラーの喪失時や計画されたインフラのメンテナンス時にもソフトウェアデリバリ―パイプラインを実行し続けることができます。つまり、コントローラーが常に稼働し、すべてのエクスペリエンスが確実に機能し続けます。

水平スケーラビリティ:大きな負荷を効率的に処理する

水平スケーラビリティは、複数のコントローラーのレプリカ間で負荷を分散し、最適なパフォーマンスを確保する技術です。CloudBees CIで高可用性モードを有効にすると、コントローラーは大きな負荷をシームレスに処理できるようになります。つまり、コントローラーの負荷が高い状況でも、システムが自動的に複数のレプリカに負荷を分割するため、パフォーマンスは影響を受けません。

高可用性モードのユースケース

高可用性モードが適したユースケースは主に2つあります。

ユースケース1:過負荷またはモノリスなコントローラー

モノリスコントローラーとは、複数のチームで使用され、あらゆるチームのすべてのジョブが実行される単一のコントローラーです。単一のコントローラーは多数の作業をホストできますが効率的に処理できなくなることがあるのは、誰もが知るところです。そのような過負荷のコントローラーが、増え続ける負荷を処理しようと奮闘するために、パフォーマンスが落ち、パイプラインの実行が長くなり、UIの反応が遅くなり、クラッシュすることさえあります。さらに、コントローラーで障害が発生したり、再起動が必要になると、コントローラーで実行されているすべてのビルドおよびコントローラーを使用するすべてのチームがダウンタイムの影響を受けます。このような場合、高可用性モードが提供する高可用性と水平スケーリングが課題の解決策となります。動的ロードバランシングによって別のレプリカに負荷を分けて単一障害点を取り除くことにより、コントローラーの性能と安定性を高め、ダウンタイムを最小限に短縮またはゼロにします。

ユースケース2:ローリング再起動

コントローラーを実行しているサーバーやKubernetesノードをアップグレードする際は、CloudBees CIであってもJenkinsであっても、 CIサービスのダウンタイムが発生します。こういった定期メンテナンスは、インフラストラクチャを最新の状態に保つために不可欠です。このようなケースでは、Kubernetesのローリング再起動の仕組みを利用できます。高可用性モードをアクティブにすると、メンテナンス時にレプリカが立ち上がり、トラフィックや作業がシームレスに処理されます。これによって、最初のインスタンスがアップグレードのためドレイン中でも、中断のない運用が確保されます。

モノリスを分割する必要がある理由

これまでにも、モノリスの分割という概念を論じた記事やブログをお読みになったことがあるかもしれません。モノリスの分割は、アーキテクチャの堅牢性を強化し、依存関係を減らしてパフォーマンス、安定性、スケーラビリティの向上につながるため、CloudBeesはこのアプローチを強く推奨します。しかし、すべての企業が計画的に設計されたコントローラー構成から始めるという贅沢を許されるわけではありませんし、チームが拡大するにつれて自然とモノリスコントローラーに成長していく傾向もあります。

モノリスを分割するには、周到な計画と時間の投資が必要であり、どんな企業でも可能というわけではありません。 そのような場合、高可用性モードが代替的な解決策になります。高可用性モードは過負荷状態を軽減し、物理的に別のコントローラーに分割することなくモノリスコントローラーのパフォーマンスを拡張します。

実現の仕組み

概要レベルで言えば、次のように単純化された2つのレプリカの図を使って仕組みを説明することができます。

高可用性モードを有効にすると、コントローラーは「裏で」自動的に複数のレプリカに分割され、複数のレプリカに分割された単一の論理的なコントローラーになります。レプリカ数の下限および上限はCloudBees CI内で設定でき、コントローラーが処理する負荷に応じて動的にスケールアップおよびスケールダウンされます。すべての受信トラフィックはWebhookまたはジョブのポーリングを通じてロードバランサーに到達し、レプリカに割り当てられます。

レプリカ群は同一のデータを持つので、各レプリカにデータが完全に分割されるわけではありません。レプリカ間で動的にロードバランスが行われます。レプリカ間の同期にはHazelcastライブラリが使用されます。Hazelcastライブラリはイベントバスを使用してイベントを送受信し、レプリカ間でデータ構造を同期します。たとえば、レプリカ1がジョブを実行中にダウンすると、レプリカ1と接続していたエージェントはレプリカ2に自動的に引き継がれます。

まとめ

CloudBees CIの新しい高可用性モードは、コントローラーに水平スケーラビリティと高可用性をもたらします。この機能を使用すると、「ローリング再起動」時にユーザーが気付くことなく他のレプリカに処理を移すことができ、管理作業が簡易になり、スケーリングの要件に合わせてレプリカ数が自動的に調整されます。結果として、コントローラーのレプリカ間での自動ロードバランシング、パフォーマンスの問題の回避、高負荷によりコントローラーのレプリカをさらに必要とする場合の完全な水平スケーラビリティ、そしてコントローラーの障害に対処する高可用性がもたらされます。

高可用性モードはコントローラーの管理方法を一新します。CloudBeesは、企業に求められるスケールでコントローラーの効率性とレジリエンスを実現することに注力しています。それでは、皆さまがたの継続的なパイプライン運用、パフォーマンスの改善、アップタイムの最大化を祝して乾杯!

参考リソース

(この記事は、CloudBees社 Blog 「Revolutionize Your Jenkins® Environment with Horizontal Scalability and High Availability」2023年9月14日の翻訳です。)