Jenkinsは世界中で人気があるフリーでオープンソースの自動化サーバーです。そのため気軽に運用を開始することができ、Jenkinsの豊富な機能やプラグインを用いることで環境を発展させていくことが可能です。その一方でJenkinsの運用を進めていくうちに課題も発生してくることがあります。
CloudBees CI奮闘記として、Jenkinsを利用している際に発生し得る課題を紹介しながら、それらを解消するエンタープライズ機能を強化した有償版JenkinsであるCloudBees CIの紹介を行っていきます。
はじめに
登場人物
吉田:転職したてのエンジニア。前職では積極的にCIやCDに取り組みながら開発をしていた。CI奮闘記ではJenkinsの導入にあたり、服部に色々アドバイスを行った。
服部:元々CIやJenkinsについては言葉は聞いたことがある程度であったが、吉田からのサポートを受けつつCI環境の導入担当として日々奮闘している。CI奮闘記では自部署にJenkinsを導入した。
溝口:吉田、服部の上司。
用語
CloudBees CIの主な構成要素としてClient ControllerとOperations Centerがあります。
Client ControllerはJenkins(コントローラー)に該当します。起動したClient Controllerに対してJenkinsの様にジョブを作成していきます。
Operations CenterはJenkinsにはない、Client Controllerを束ねるための要素となります。Client ControllerをOperations Centerに接続することで、Client Controllerの集中管理が可能になります。
本ブログでは、CloudBees CIと区別するためにhttps://www.jenkins.io/のJenkinsをOSS Jenkinsと記載します。区別する必要がない場合、Jenkinsと記載します。
高可用構成と水平スケーラビリティ
あぁ、よかった。吉田先輩!問題が起きてて、ちょっと手伝ってください。いろいろな部署の開発が止まってしまって大変なんです。
あら、服部君。ずいぶん慌ててるわね。何があったの?
それが、Jenkins が突然応答しなくなってしまって……。最初は、ジョブの実行が急に遅くなったと思ったら、そのうち完全にハングアップしてしまったみたいなんです。おそらく、ジョブの負荷が急増して、リソースを使い果たしてしまったのかなと。今は、コントローラーを再起動して対応しようとしてるんですが……。
なるほど、今のJenkinsもいろいろな部署の人が利用するようになったものねぇ。どれくらいで復旧できそう?
再起動すれば、一時的には復旧できるかもしれません。ただ、原因となったジョブを特定して、対策を講じないと、再発する可能性があると思います。もう少しコントローラーの数を増やして、ジョブを分散させようかと思っています。
それもいいかもしれないけれど、せっかくCloudBees CIを使っているんだし、コントローラーを単に複数台立てて分散させるだけじゃなくって、高可用性構成と水平スケーラビリティを活用するようにしてみない?
高可用性構成……?聞いたことはありますが……コントローラーを複数台で運用するんですよね?でも、そんなに簡単に切り替えられるものなんですか?
ええ。ロードバランサーが自動的にリクエストを正常なレプリカに振り分けてくれるから大丈夫よ。それに、水平スケーラビリティもできるから、今回のように特定ジョブが大量のリソースを消費しても、他のジョブやコントローラー全体の動作に影響を与えにくくなるの。最近、ジョブの実行に時間がかかったり、UIが重かったりすることなかった?
あ、はい。最近、ジョブの実行待ちが長くなったり、画面の応答が遅くなったりすることが増えてました。特に、月末は処理が増えるので、顕著でしたね。
それも、自動スケーリングでカバーできると思うわ。自動でリソースを柔軟に増やして対応できるから、問題になりにくくなると思うのよ。それに、もしこういったことがあってもダウンタイムゼロのローリング再起動もできるから、メンテナンスのために CI/CD環境 を止める必要もなくなるのよ。
そんな便利な機能があるんですね!もっと早く知っておけばよかったです!今回の障害が復旧したら、すぐにでも導入の検証をしてみます!
高可用性と水平スケーラビリティ
ソフトウェアデリバリーの重要性が増す中、継続的インテグレーション/継続的デリバリー(CI/CD)パイプラインの停止は、業務に大きな影響を与えます。
開発者は停止している間コードをSCMにコミット・プッシュできず開発が止まってしまい、その結果として新機能やバグ修正のリリースが遅れてしまう可能性もあります。
このような事態を防ぐためには、CI/CD プラットフォームの高可用性と水平スケーラビリティが有効な手段の一つです。
用語の確認
高可用性 (High Availability) とは?
高可用性 (High Availability:HA) とは、システムが継続的に稼働し、サービスを提供し続けられる能力のことです。つまり、障害が発生しても、システムの停止時間を最小限に抑え、ユーザーがサービスを利用し続けられる状態を指します。高可用性を実現するためには、システムの冗長化や、障害発生時の自動的な復旧メカニズムなどが重要な要素となります。
水平スケーラビリティとは
水平スケーラビリティとは、システムやアプリケーションの処理能力を向上させるために、サーバーやインスタンスなどのリソースを並列に追加することで、全体のパフォーマンスを向上させる能力のことです。
垂直スケーリング(スケールアップ)との違い
水平スケーリングとよく比較されるのが、垂直スケーリング(スケールアップ)です。
- 垂直スケーリング: 既存のサーバーの CPU、メモリ、ストレージなどのリソースを増強することで、単一サーバーの処理能力を向上させる方法。
- 水平スケーリング: 既存のサーバーはそのままに、同等のサーバーを並列に追加することで、システム全体の処理能力を向上させる方法。
水平スケーリングのメリット
- 高い可用性: 複数のサーバーで処理を分散するため、1 台のサーバーに障害が発生しても、他のサーバーが処理を継続できます。システム全体のダウンタイムを最小限に抑えることができます。
- 負荷分散: リクエストを複数のサーバーに分散することで、個々のサーバーへの負荷を軽減し、パフォーマンスを向上させることができます。
- 柔軟なスケーラビリティ: 処理能力の需要に応じて、サーバーの台数を柔軟に増減できます。
- コスト効率: 垂直スケーリングで高価な大型サーバーを導入するよりも、安価なサーバーを複数台導入する方がコスト効率に優れている場合があります。特にクラウド環境では、必要な時に必要な分だけリソースを追加できるため、無駄なコストを削減できます。
CloudBees CIが提供する高可用性と水平スケーラビリティ
CloudBees CIの高可用性と水平スケーラビリティは、「Jenkinsのパフォーマンスとスケーラビリティに関する過去10年で最大のアップデート」(The Biggest Performance and Scalability Update for Jenkins in a Decade)として登場した機能になります。
https://www.cloudbees.com/capabilities/continuous-integration/high-availability-horizontal-scalability
まずは、こちらのリンク先のページ下部にある動画を参照されるとイメージしやすいかと思います。
CloudBees CI では、複数の Jenkins コントローラーのレプリカを配置することで、水平スケーリングを実現しています。各レプリカは独立してリクエストを処理できるため、システム全体の処理能力が向上します。また、ロードバランサーがリクエストを各レプリカに分散することで、負荷分散を実現しています。さらに、オートスケーリング機能により、負荷に応じて自動的にレプリカ数を増減できます。
1.コントローラーのレプリカにより、高可用性が可能になります。
2.ロード バランサーは、異なるコントローラー レプリカ間でワークロードを分散します。
3.コントローラーのコンテンツを永続化するための共有ファイル システム。
4.Hazelcast はコントローラーのライブ状態を同期させます。
単一障害点 (SPOF) の排除による、可用性の向上
従来の Jenkins(スタンドアロン構成)では、Jenkins コントローラーが単一障害点となっていました。Jenkinsコントローラーに障害が発生すると、CI/CD パイプライン全体が停止してしまうというのは重大なリスクです。
CloudBees CI の高可用性モードでは、複数のコントローラーレプリカを稼働させ、単一障害点を排除します。
これにより、あるレプリカに障害が発生しても、他のレプリカが処理を引き継ぎ、CI/CD パイプラインを継続的に稼働させることができます。
こちらの動画では、CloudBees CIの高可用性について、ドキュメントを用いての概要説明および実際のデモが紹介されています。
スケーラビリティの飛躍的な向上
従来の Jenkins でも、複数のエージェントを接続することで、ある程度のスケーラビリティを実現することは可能でした。しかし、Jenkinsコントローラー自体は単一のウェブアプリケーションであるため、多数のユーザーやジョブが集中すると、コントローラーがボトルネックとなり、パフォーマンスが低下するという問題がありました。
CloudBees CI の水平スケーラビリティは、コントローラー自体を複数稼働させることで、この問題を解決できます。
負荷を複数のコントローラーに分散することで、パフォーマンスを維持したまま、大規模な CI/CD 環境を構築できます。さらに、オートスケーリング機能により、負荷に応じて自動的にコントローラーの数を増減できるため、リソースを効率的に利用し、コストを最適化できます。
負荷分散の詳細なルールについては、以下のドキュメントで確認できます。
https://docs.cloudbees.com/docs/cloudbees-ci/latest/pipelines/pipeline-builds-ha-active-active
ダウンタイムゼロの運用
従来の Jenkins では、コントローラーの再起動やアップグレードには、ダウンタイムが発生することが避けられませんでした。これは、CI/CD パイプラインを一時的に停止する必要があるため、開発者の生産性やリリースサイクルに悪影響を与えていました。また、本番稼働中のJenkinsコントローラーの停止は難しいため、、バージョンアップに二の足を踏んでいる方も多いかと思います。
CloudBees CI の高可用性モードでは、ダウンタイムゼロのローリング再起動が可能です。
これにより、サービスを停止することなく、コントローラーの更新やメンテナンスを行うことができます。CI/CD パイプラインを常に稼働させ続けることができるため、開発者の生産性を向上させ、リリースサイクルを短縮できます。
ローリングアップグレードについては、以下動画にて、設定方法、およびデモンストレーションでの紹介がされています。併せてご確認ください。
まとめ
CloudBees CI の高可用性と水平スケーラビリティは、継続的インテグレーションや継続的デリバリーといった開発基盤を止めないための強力なソリューションです。
高可用性モードにより、予期せぬ障害やメンテナンスによるダウンタイムを最小限に抑え、ビジネス継続性を確保できます。また、水平スケーラビリティにより、需要に応じてシステムを柔軟にスケールアップできます。
また、既存のOSS Jenkins環境の資産を用いての移行も容易に可能です。CloudBees CIを用いて、安定稼働するCI/CDプラットフォームを手に入れましょう。
CloudBees CI奮闘記一覧
- 【CloudBees CI奮闘記】第1章:モノリシックなJenkins?野良Jenkins?
- 【CloudBees CI奮闘記】第2章:CloudBees CIをインストールして触ってみる
- 【CloudBees CI奮闘記】第3章:共有エージェントを利用する
- 【CloudBees CI奮闘記】第4章:プラグインを効率的に管理する
- 【CloudBees CI奮闘記】第5章:パイプラインテンプレートを利用する
- 【CloudBees CI奮闘記】第6章:バックアップを取得する
- 【CloudBees CI奮闘記】第7章:セキュリティ・運用を考える
- 【CloudBees CI奮闘記】第8章:セキュリティ・運用を考える(2)