簡単に言えば、GitOpsとは、バージョン管理やCI/CDなどのDevOpsプラクティスをインフラ管理に適用する手法のことです。GitOpsという名前はWeaveworks社による造語で、オープンソースのバージョン管理システムであるGitに由来するものです。チームはこれにより、ソフトウェア開発に使用するのと同じツールやオーケストレーションプロセスを使ってインフラを管理できます。
最新のソフトウェア開発を支えているのはスピードと拡張性であり、成熟したDevOps組織であれば、1日にコードを何百回も本番環境にデプロイすることもあります。DevOpsチームは、バージョン管理、コードレビュー、CI/CDパイプラインなどのベストプラクティスがもたらす自動化を活用することで、これを実現しています。しかし、ソフトウェア開発ライフサイクル(SDLC)はほぼ自動化されているものの、インフラ管理はいまだにその大部分を手動プロセスと専門チームに依存しています。これでは、継続的デプロイに必要なスピードと規模で、クラウドリソースをプロビジョニングしたり設定したりするのは困難です。
GitOpsは、インフラのプロビジョニングプロセスを自動化するのに役立ちます。GitOpsチームは、新しいコンポーネントが必要になるたびに手動で環境を構成するのではなく、コードとして保存された構成ファイルを使用し、機械で読み取り可能な定義ファイルを用いて環境の作成を自動化できます。これらの構成ファイルは、デプロイされるたびに同じインフラを生成し、IT環境全体の一貫性を確保します。
このブログ記事では、GitOpsの仕組みとGitOpsを使用すべき理由、そして適用方法について説明します。また、GitOpsの使用を開始する方法と、成功を収めるためのベストプラクティスもご紹介します。
GitOpsは、Gitベースのソースコード管理システムを使用して、コードベースでインフラの構築を行います。これは、Infrastructure as Code(IaC)の進化形といえるものです。IaCは、アプリケーションコードの一部として扱われるスクリプトを使用して、テスト環境やデプロイ環境のプロビジョニングや設定を行うためのDevOpsの手法です。IaCプロセスは、インフラの構成パラメーターを定義するスクリプトを開発者が記述することから始まります。スクリプトは、宣言型または命令型のアプローチで記述することができます。ユーザーは基本的に、宣言型プログラミングでは必要なインフラリソースを指定し、命令型プログラミングではインフラリソースを作成する方法を指定します。
宣言型のアプローチでは、ユーザーはリソースのリストおよび必要なプロパティを指定することで、どのようなインフラを構築したいかを「宣言」する必要があります。IaCツールはそのスクリプトを読み取り、すべてのインフラコンポーネントをインストールして設定し、デプロイされたコードバージョンを管理します。命令型のアプローチでは、ユーザーはIaCツールに実行させたいコマンドのリストを指定して、インフラを段階的にプロビジョニングします。設定スクリプトは、バージョン管理をサポートするコードリポジトリに送信されるため、ファイルのレビュー、編集、コピー、共有が容易に行えます。誰かがファイルを編集すると、マージリクエストとコードレビューのワークフローで変更が検証されます。最終的に、IaCプラットフォームによって、開発者の指示どおりのインフラが作成および設定されます。
GitOpsは、基本的にすべてのインフラ設定のバージョン管理システムとしてGitを使用するIaCです。GitOpsワークフローは、次の3つの主要コンポーネントで構成されています。
GitOpsワークフローは、IaC、マージリクエスト、CI/CDの3つの要素で構成されています。
IaCと同様に、GitOpsでも開発者がシステムの望ましい状態を宣言的に記述する必要があります。設定ファイルとソースコードは、Gitリポジトリ(アプリのコードすべてを保持する分散型バージョン管理システム)に保存され、バージョン管理されます。このリポジトリは、そのプロジェクトのファイルに加えられたすべての変更を長期的に追跡し、インフラコンポーネントを作成、更新、削除するための制御システムです。
マージリクエストとは、すべてのインフラの更新のためにコード変更を実装する作業のことです。新しいリリースを展開するために、開発者はGitリポジトリ(例:git repo)内のシステムの状態を変更するリクエストを行います。アラートを受けたチームが変更をレビューし、最終的に承認または拒否します。変更が承認されると、マージによってコードがメインブランチにコミットされ、これが監査ログの役目を果たします。
変更が承認されマージされると、自動的に稼働中のインフラに適用されます。このように、開発者は普段使用しているGitOpsパイプラインをワークフローとCI/CDプラクティスにも使用できるのです。
GitOpsを使うと、インフラのプロビジョニングがより簡単に、より速く、より拡張性が高まります。
従来のインフラ管理では、インフラやクラウドインフラのリソースをプロビジョニングしようとするたびに、開発者はチケットを作成するか、ITOpsチームにメールでリクエストを送信しなければなりませんでした。ITOpsチームは、キュー内のすべてのリクエストを確認してログに記録し、ユーザーインターフェイスに手動でコマンドを入力して、リクエストされたリソースをそれぞれに手動で割り当てます。これには時間がかかりますが、管理対象のインフラが小規模でコンポーネントの入れ替わりも少なかった時代、多くの組織はこのプロセスで十分に機能していました。
今日のインフラは、はるかに動的なものとなっています。これは、デプロイを行うのに長い時間がかかっていたレガシーインフラ環境から、リソースのプロビジョニングと切り離しを数秒で行えるAPI駆動型のクラウド環境に移行したためです。今日、組織は毎週何千もの開発環境やマイクロサービスを立ち上げることもあるため、手動でインフラを管理するのは現実的ではありません。これでは、管理者は必要に応じてワークロードのキャパシティを調整するために毎日何千ものチケットを送信する必要があり、さらにリクエストの処理がすべて完了するまでの待機時間も長くなります。
GitOpsはこれよりもはるかに効率の高いソリューションで、インフラのプロビジョニングと設定を行うための手動プロセスを自動化することができます。開発者は、アプリケーションコード内にサービスレベル目標を宣言し、インフラを自動的に拡張することでそれらの目標を維持することができます。そのため、開発者が普段から馴染んでいる手法で、アプリケーション開発に使用しているのと同じバージョン管理システムを使ってインフラを管理できます。つまり、より迅速で予測可能なデプロイ、よりシームレスなコード管理、そして全体的な生産性の向上につながります。
GitOpsの3つの主要プラクティスには、以下が挙げられます。
GitOpsの3つの重要なプラクティスには、宣言型設定、Gitワークフロー、設定とデプロイの分離が挙げられます。
GitOpsは、開発者が不変なインフラ(Immutable Infrastructure)で作業することを推奨しています。変更可能(Mutable)と不変(Immutable)は、2つの異なるタイプのインフラ環境です。変更可能なインフラは、プロビジョニング後でも、たとえば新しい仮想マシンを追加するなどの変更が行えます。一方、不変なインフラは、プロビジョニング後に変更することはできません。どちらの環境にも、メリットとデメリットが伴います。
変更可能なインフラでは、既存のサーバーを特定のアプリや開発ニーズに合わせてカスタマイズでき、開発者は新しいサーバーを構築する必要がありません。そのため、インフラが各ユーザーのニーズを満たすことができ、大きなメリットがもたらされます。
不変な環境では、より厳格になっています。インフラコンポーネントは特定の仕様に適合するように構築され、一度インフラがプロビジョニングされると、臨時の変更はできません。何らかの変更が必要であれば、新しい要件に基づいてまったく新しいインフラを構築する必要があります。このシステムには多くのデメリットがありますが、不変のインフラは設定のずれをなくし、技術的な問題の特定と解決を容易にし、開発から本番までのテストの一貫性を確保します。
GitOpsは不変なインフラのこの特性を活用して、デプロイ後の設定のずれやその他の変更のリスクを最小限に抑え、インフラの望ましい状態を維持できるようにします。不変なインフラを宣言型設定と組み合わせることで、インフラがクラッシュした場合に完全に復旧させることもできます。開発者はまた、別の形の不変なインフラを使用することも増えてきています。たとえば、Dockerコンテナは(少なくともベストプラクティスでは)不変です。
GitOpsとDevOpsはどちらも、開発者エクスペリエンスを中心に設計されています。ツールやプラクティスには重複する部分がある一方で、両者には大きな違いもあります。
DevOpsとは、組織がより速いペースで製品を開発し、改善できるようにするための文化であり、プラクティスです。GitOpsは、インフラのプロビジョニングと管理のための手法であり、特定のツールであるGitを中心に設計されています。DevOpsは主に、開発チームと運用チーム間のコラボレーションを促進するために、組織の文化を変えることに重点を置いています。GitOpsは、バージョン管理やCI/CDなどのDevOpsのプラクティスをインフラ管理に適用するためのツールやフレームワークを提供します。
DevOpsとGitOpsにこのような違いはあっても、原則やプラクティスやツールを共有していることから、1つの組織内で容易に共存させることができます。なお、DevOpsを実践している組織がGitOpsを採用する必要はありませんが、GitOpsを採用しようとしている組織はDevOpsをすでに実践している可能性が高いことには注意が必要です。
Kubernetesなど最新のクラウドネイティブツールは宣言的に定義されるため、これがGitOpsの人気を押し上げています。宣言型システムであるKubernetesは、理想的なクラスター設定はどのような状態であるべきかを把握しており、システムの現在の状態を継続的に監視して、望ましい状態と比較しながら自動的に調整を行います。
この技法により、開発者はシステムの理想的な状態を定義し、GitでKubernetesの設定ファイルのバージョン管理を行えます。システム管理が容易になることはもちろん、デプロイで問題が発生した場合には以前のバージョンにロールバックすることも可能です。全体として、GitOpsは、Kubernetesとクラウドネイティブアプリケーションの開発、およびアプリケーションのデプロイの集約とエンドツーエンドの管理を向上させます。
GitOpsには、以下のようなさまざまなメリットがあります。
GitOpsには、課題になりそうなこともいくつか考えられます。
GitOpsはDevOpsのプラクティスとツールを使用するため、DevOps文化が成熟していることが、導入するうえでの前提条件となります。そうなっていれば、開発者はGitOpsのワークフローにすぐ慣れることができます。
もう1つの要件は、宣言的に管理できるインフラです。このような理由から、GitOpsはKubernetesクラスターやクラウドネイティブアプリ開発の管理によく採用されています。また、従来のITシステムを宣言的にモデリングできるAnsibleなど、他のインフラやデプロイパイプラインでもGitOpsを使用できます。
GitOpsワークフローを実装するためのツールも必要です。GitOpsツールは数多く提供されていますが、最も広く利用されているものとしてはFluxとArgoCDが挙げられます。
エコシステム全体に1回でGitOpsを実装しようとするのではなく、段階的なアプローチを取りましょう。ネットワーク構成管理、仮想マシンOS、その他のリソースから着手し、その望ましい状態を定義します。次に、Infrastructure as Codeを使用して現在の状態に変更を加え、Gitリポジトリを使ってリソースの状態の変化を追跡し、そこからCI/CDシステムで更新をデプロイします。エコシステム全体にGitOpsを確実に適用できるようになるまで、GitOpsワークフローの開発とプロセスの文書化を継続して、開発チームが活用できるようにしてください。
GitOpsの原則とベストプラクティスをいくつかご紹介します。
最新のインフラに求められるニーズを考えると、インフラの自動化は必須となっています。GitOpsは、開発者がすでに使っているツールやプラクティスを活用することで、簡単に開始できます。1つの小規模なパイロットプロジェクトから始めて、より復元力の高いインフラ構築への第一歩を踏み出しましょう。
このブログはこちらの英語ブログの翻訳です。
この記事について誤りがある場合やご提案がございましたら、ssg-blogs@splunk.comまでメールでお知らせください。
この記事は必ずしもSplunkの姿勢、戦略、見解を代弁するものではなく、いただいたご連絡に必ず返信をさせていただくものではございません。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は1,020を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキストに基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。