GitOpsとは、分散型バージョン管理システムである「Git」を使ったCD(Continuous Deployment=継続的デプロイメント)の手法で、インフラストラクチャとアプリケーションを含むシステム全体の管理を行えます。
ここでは、GitOpsとはどのようなものか、具体的なメリット・デメリットを説明するとともに、CIOpsとの比較を交えて詳しく説明します。
「GitOps(ギットオプス)」は、インフラとアプリケーションの両方を管理する、CI/CDの手法のひとつで、分散型バージョン管理システムである「Git」を軸とします。
あくまで手法の名称なので、環境に依存せず実施できますが、デプロイやスケーリングの自動化のためのオープンソースシステム「Kubernetes(クバネティス)」に関する文脈で使われることが多くなっています。
GitOpsを提唱した英国のWeaveWorksによれば、GitOpsの主な機能・目的は大きく次の2つに要約されます。
1.GitOpsは、Kubernetesをはじめとしたクラウドネイティブ技術のための運用モデルであり、コンテナ化されたクラスタとアプリケーションの、デプロイ・管理・モニタリングを統合した最良のセットを提供します。
2.アプリケーション管理、CI/CDパイプラインの自動化、開発と運用のチームの統合(DevOps)などの体験を提供するものでもあります
WeaveWorksがGitOpsのプリンシパルとして掲げる要素が4つあります。具体的には次のようなものです。
GitOpsの設定は、命令的でなく「宣言的」です。細かな手順がマニュアル的に示されるのではなく、「こういう状態にしたい」というゴール(=最終的な状態)だけが提示されているため、「Single Source of Truth」(信頼可能な唯一の情報源)として機能します。
そのため、何らかのトラブルが発生した場合でも、この宣言に従ってインフラストラクチャを復元できます。
GitOpsでは、システムの宣言はすべてバージョン管理システムに保存されます。それにより、ロールバック(障害などでデータ喪失・破損などが起きた場合に、正常に稼働していた時点の状態に戻すこと)が容易です。
また、Gitの機能を用いてコードの作成者とその出所に関する署名も行えます。これらは時間が経過しても変化しません。
CD(継続的デプロイ)にはPush型とPull型が存在します。クラスタ外からPushする形でデプロイするのがPush型、変更されたことで発生した差分を検知して変更するのがPull型です。
一般的にGitOpsと呼ばれるものはPull型で、この方法ではクラスタの認証情報を必要としません。また、CIを担当する人と、クラスタのデプロイを担当する人でアクセス権を分けることができるので、責任範囲が明確になります。
GitOpsは、Argo CDやFlux2といったGitOpsを実践するためのソフトウェア(エージェント)を使用して実現されますが、このエージェントの状態と、本来望ましい状態の間に乖離がある場合に通知をしてくれます。
これにより、本来意図していなかった変更に気づきやすくなり、「Single Source of Truth(信頼可能な唯一の情報源)」に基づいて元の状態に戻すことも容易です。
GitOpsでは、インフラストラクチャからアプリケーションまで、すべての履歴がGitに保存されます。そのため「Single Source of Truth(信頼可能な唯一の情報源)」としてGitOpsの情報を信頼することで、オペレーションが統一されるとともに、プロセスの再現性も高くなり、エンジニアにとっての体験が改善されます。
また、GitOpsの場合、開発者はプルリクエストを出してマージを実行するだけでよく、残りのタスクはエージェントが行います。こうした自動化もメリットのひとつといえるでしょう。
Gitを「Single Source of Truth(信頼可能な唯一の情報源)」とするため、変更履歴はすべてGitに残ります。そのため、何がいつ発生したか、それに対して誰が何を変更したかがわかるようになり、すべての変更が可視化されます。
また、システムの現状と、望ましい状態の差分をエージェントが自動で検知するため、通知を行ってエンジニアに知らせたり、場合によっては自動修正することもできます。こうした仕組みのため、デプロイ時だけでなく、常に差分がないことを保証できるようになります。
GitOpsは、Gitを用いてすべての変更を一元管理できるため、Gitを確認するだけで現在のインフラの構成を確認できるようになります。また、バグや脆弱性をはじめとしたあらゆる問題を、早い段階でキャッチできるようにもなります。同じ理由で、トラブルが起こったときのロールバックも容易です。
また、CIとCDを分けて管理できるため、認証情報を外部に公開せずにデプロイできます。これによりセキュリティリスクが低減できると考えられます。
GitOpsが関係するのは主にCD(継続的デプロイ)の部分ですが、CI(継続的インテグレーション)にも関わりがあります。
CIOpsは「git push を契機としたデプロイ手法」であり、GitOpsとは別の物です。いちばんの違いは、CIOpsはPush型、GitOpsはPull型を基本とすることにあります。
CIOpsのメリットはシンプルでわかりやすいことです。CIにフローが集中する構造なので、開発者にとってはデプロイのタイミングがわかりやすいこともメリットとなります。
一方、GitOpsのようにCIとCDの責任範囲を分けることはできません。CIに権限が集約されるのでセキュリティのリスクもGitOpsより大きくなります。また、ロールバックが難しく、この点でGitの履歴にデプロイの状態が残っているGitOpsとは大きく違います。
GitOpsのメリットとデメリットは基本的にその逆になります。CIとCDの責任範囲を分けることができ、セキュリティ面でも有利です。ロールバックも可能なので、トラブルにも対処しやすいでしょう。
一方、CIOpsより複雑で理解しづらいため学習コストがかさみ、エージェントの導入が必要になるなど構築がCIOpsより難しくなっている点にも注意が必要です。
GitOpsの使用には、GitOpsを実践するためのソフトウェア(エージェント)が必要です。主なGitOpsエージェントには次のようなものがあります。
もっとも有名なGitOpsエージェントです。特徴的な点は、GUIで操作ができることと、差分を見る機能があることです。一方で、これらの機能を活用するために、強い権限を与える必要があります。
Argo CD
https://github.com/argoproj/argo-cd/
GitOpsを提唱したWeaveworksが提供しているGitOpsエージェントです。GUIはなく、軽量でシンプルな構造です。差分を検知する機能はなく、あくまで変化があったことを検知するにとどまりますが、一方でArgo CDほどの強い権限は求められません。
Flux2
https://github.com/fluxcd/flux
GitOpsをCI/CDの手法として導入することで、変更の可視化とセキュリティ向上を実現し、オペレーションの統一性・再現性を高めることができます。一方で、CIOpsに比べると複雑で、導入には一定の手間とコストがかかります。必要に応じて適切な選択を行うことがカギとなるでしょう。