GitOpsとは?
GitOpsは、アプリケーション開発プロセスがDevOpsのベストプラクティスに従うことを保証するために構築された機能的なフレームワークです。具体的には、アプリケーションをインフラストラクチャ・アズ・コード(IaC)として構築し、そのインフラストラクチャの宣言および管理・自動化のための設定の唯一のソースとしてGitを利用します。
GitOpsとは何か、その特徴と利点、そして組織内でGitOpsモデルを実装する際に役立つ主要なツールの詳細について、引き続きご覧ください。
Gitとは?
Gitはオープンソースの分散型バージョン管理システムです。このツールにより、開発チームはソースコードを効率的かつ効果的に管理することが可能となります。Gitには、非線形かつブランチベースの開発プロセスを用いた開発者間の協業を促進する機能が備わっています。
おそらく最も重要な点として、コードベースが進化するにつれ、Gitは開発チームがソースコードに加えられた各変更を追跡することを可能にします。言い換えれば、Gitリポジトリ内に存在する全てのコードはバージョン管理されています。このため、開発者や運用チームはあらゆる変更を分析し、必要に応じてコードベースの以前のバージョンへ迅速にロールバックすることが可能です。
インフラストラクチャ・アズ・コードとは?
GitOpsを適切に説明するためには、インフラストラクチャ・アズ・コード(通常IaCと略されます)の概念を確認する必要があります。
その名の通り、IaCとはインフラストラクチャをコードとして定義する手法を指します。これは、システムのインフラストラクチャ構成要素や設定を定義するためのテンプレートや設定ファイルなどを開発することを意味します。最終的には、運用担当者が手作業で必要なものを構築する代わりに、コードを実行して望ましい設定でインフラストラクチャを立ち上げます。
適切に実施された場合、IaCの主な利点の一つは一貫性です。インフラを定義するコードを記述することで、実行のたびに環境を全く同じ方法で構成する一連の指示が準備されます。これは冪等性を体現しています。冪等性とは、特定の操作が「複数回適用されても、最初の適用時を超える結果の変化を生じない」という性質です。
IaCを活用することで、チームは必要に応じて以前の構成へロールバックする能力を確保できます。過去のバージョンのIaCファイルを適用することで、環境を特定の時点の望ましい構成にリセットすることが可能です。これは、環境構成への問題のある変更が導入された場合、単に正常な状態へできるだけ迅速に復元することが目的となる場面において、非常に価値のあるものです。
DevOpsのベストプラクティス
GitOpsとは、アプリケーション開発プロセスの管理に広く用いられている手法を、インフラストラクチャを構築するコードの管理にも適用するものです。これには、構成変更のデプロイ方法を自動化することも含まれます。このように、GitOpsはIaCを必要としますが、さらに一歩進んだアプローチとなります。
組織をGitOpsへ移行させるために、IaCと組み合わせて活用できるアプリケーション開発プラクティスを以下にご検討ください:
- IaCファイルはソースコードリポジトリに保存され、バージョン管理を活用することで、これらのファイルに対する過去すべての変更履歴を保存することが可能となります。
- これらのファイルへの変更はすべて、後でメインブランチにマージされる個別のブランチで行われます。変更を行う担当者はプルリクエスト/マージリクエストを使用する必要があります。
- プルリクエストまたはマージリクエストをクローズし、変更をメインブランチにマージする前に、コードレビューを実施します。これにより、問題のある変更がメインブランチに反映されることを防ぎ、最終的に他の環境に配信されないようにします。
- 自動化されたテストとセキュリティスキャンは、CIパイプラインの一環として実施され、他の環境に問題や脆弱性が導入される原因となる問題が存在しないことをさらに保証します。
- 構成変更の他の環境への配信は自動化されています。これにより、インフラストラクチャへの変更適用プロセスから人的ミスが排除されます。同時に、環境間での構成のずれ(ドリフト)のリスクも排除されます。さらに、どのインフラストラクチャ変更がどの環境に、いつ行われたのかを明確に把握することが可能となります。
GitOpsの特長:GitOpsフレームワークの利点
GitOpsがどのようなものかについて背景をご説明いたしましたので、次にGitOpsが非常に価値あるものである理由について、GitOpsの主要な特長とGitOpsモデルの導入によって得られる利点をいくつかご紹介しながら、もう少し深く掘り下げてみましょう。
GitOpsは自動テストと正式なコードレビューによりインフラリスクを低減します
アプリケーション開発で用いられる信頼性確保の手法を適用することで、GitOpsはIaC(Infrastructure as Code)にも同等のコード品質向上効果をもたらします。GitOpsでは変更はメインブランチ外で実施され、他のチームメンバーによるレビューを経て、自動化された方法でテストされます。これらの手法により、リリース前の問題発見が格段に容易となり、変更が他の環境で問題を引き起こす可能性を低減します。
GitOpsは効果的なコラボレーションに必要な仕組みを提供します
GitOpsは、環境構成を定義するコードの調整においてチームが効果的に連携するために必要なすべてを提供します。上記の制御(適切なソースコード管理、コードレビュー機能、自動テスト)が整っていることで、経験の異なるチームメンバーが必要な変更に貢献できるようになります。
例えば、経験の浅い開発者でも、自身のブランチで実験を行い、損害を与える心配なく設定変更を行うプルリクエストやマージリクエストを気軽に作成できるようになります。さらに、変更内容は上級メンバーによってメインブランチにマージされる前に適切に審査されるため、安心して作業に取り組めます。これは、経験の浅いメンバーが貢献できる環境を整えつつ、インフラに精通した経験豊富なメンバーが本番環境へ反映される変更を監視できるため、学習プロセスを促進する上で有益です。
GitOpsは問題のある変更をロールバックする簡素化されたプロセスを提供します
IaC(Infrastructure as Code)とGitを併用することで、IaCファイルへの全ての変更をバージョン管理する利点があります。これにより、インフラストラクチャの履歴状態が追跡され、容易に再現することが可能となります。これは特に災害復旧シナリオにおいて価値が高く、以前の正常に機能していた状態への効率的なロールバックを促進することで、MTTR(平均復旧時間)の短縮に貢献します。
GitOpsはインフラストラクチャのデプロイ自動化を必要とし、リスク低減につながります
インフラストラクチャへの変更デプロイに自動化を活用することで、非ローカル環境へのアクセス権を持つ担当者が減り、手動での変更作業が減少します。これにより、それらの環境は本質的により安全になります。さらに、すべての変更が人的関与なしに行われるため、人的ミスによる偶発的な設定ミスリスクが排除されます。各環境は、ファイルに定義された通りに正確に同一の方法で構成されます。
GitOpsを実現するツール
組織内でGitOpsが実践されるように活用できるツールをいくつかご紹介いたします。
FluxとArgoCD
FluxとArgoCDは、GitOpsモデルを通じて環境に変更を適用するためのオープンソースの継続的デリバリーツールです。
両ツールは同様の仕組みで動作し、Git内の最新リリースで定義された環境の状態と、Kubernetesクラスターで現在実行中の構成との差異を継続的に監視します。これらの構成に差異が生じた場合、ツールは望ましい構成を実現するために必要な更新を実行します。
本質的に、FluxとArgoCDはどちらも、組織の最新リリースで意図された状態と全環境の状態を同期させるという重労働を自動化・プルベースで実行する能力を備えたツールです。
GitHubとGitLab
GitHubとGitLabは、Gitソースコード管理システムを基盤に構築された人気のプラットフォームです。したがって、どちらもIaCファイルのGitリポジトリ管理に使用できます。さらに、これらのプラットフォームにはGitOpsモデルが実践されるために類似の機能が含まれています。
- GitHubにはプルリクエストの概念があり、GitLabにはマージリクエストの概念があります。直感的なUIと相まって、変更をメインブランチにマージする前に、レビューと承認の容易なプロセスを実現します。
- GitHubとGitLabの双方は、CIパイプラインの設定機能をサポートしております。これらのパイプラインは、自動化されたテストやスキャンプロセスを促進し、デプロイ前の問題発見を支援します。これは、変更を効率的かつ継続的に他の環境にデリバリーするために必要なコード品質レベルを維持する上で極めて重要です。インフラストラクチャ構成への変更の継続的デリバリーがGitOpsの中核的な理念であることから、これらの機能はその実現に向けた道筋を整えるのに役立ちます。
まとめ
GitOpsでは、Gitリポジトリがインフラストラクチャ構成の信頼できる情報源となります。これにより、IaC(Infrastructure as Code)の開発およびデプロイプロセスが改善され、組織は環境間の一貫性向上、問題発生時の以前の状態へのロールバックプロセスの簡素化、コード品質の向上によるシステム信頼性の向上といったメリットを得られます。