GitOpsの概要
GitOpsとは
GitOpsは継続的デリバリー/継続的デプロイを実現するための一つのモデルです。分散バージョン管理システムであるGitを使用して、全てのアプリケーションとインフラストラクチャの望ましい状態を宣言的に記述し、管理しています。デプロイはすべて、そのGitリポジトリに対してプルリクエストを発行することで行います。マージすると、「差分と同期」のツールでシステムの望ましい状態と実際の状態の差異を確認した後、インフラストラクチャ・アプリケーションが望ましい状態に同期されます。
このモデルは、2017年にWeaveworks社によって名付けられて以降、関心が高まっています。Gitは信頼できる唯一の情報源(Single Source of Truth)としてデリバリープロセスの中心になり、全てのOpsはGitの操作になりますので、開発者が常に慣れているもので行えるため、ワークフローがシンプルかつ明確になると期待されています。
GitOpsの原則
GitOpsは以下の3つの原則を守っています。
全てのアプリケーション・システムを宣言的に定義して、Gitでバージョニング・管理を行う
構成管理ツールのChefやAnsibleでは、扱うオブジェクトを命令的(Imperative)に定義します。一方、クラウドネイティブアプリケーションを管理するKubernetesやインフラストラクチャを管理するTerraformなどは、宣言的(Declarative)な定義を採用しています。
命令的な手法で目的を達成するためには、手順を一つ一つ定義して呼び出さなくてはなりません。一方、宣言的な手法では、何を達成したいか、どういう状態になりたいかを定義して、あとはツールが任せてやってくれます。
GitOpsではアプリケーションやインフラストラクチャの望ましい状態を定義して、Gitに保存し、バージョニングを行います。アプリケーションやインフラストラクチャを望ましい状態にするために、開発者ではなく、特定のエージェントが同期を行います。全てがGitで管理されているので、Gitは信頼できる唯一の情報源になり、エージェントはGitのデータにのみ依存することになります。
全ての変更がGitレビュープロセスを通過して、マージされたら適用できる状態である
Gitは信頼できる唯一の情報源なので、全ての変更・オペレーションはGitレビュープロセスを通過する必要があります。そして、mainブランチ(別のブランチも設定可能)は常にデプロイできる状態である必要があります。mainブランチの最新コミットはシステムの望ましい状態を表現します。そのため、ロールバックしたい場合はgit revertでシステムを以前の状態に戻せます。
Gitでの定義している状態とシステム状態の差分の監視・通知はエージェントが行う
GitOpsではGitで定義されている状態がシステムの望ましい状態なので、システムをその状態に常にキープすることが大事です。この作業はクラスタ(システムの隣)に動いているエージェントの役割です。エージェントはいつもGitの最新コミットを監視して、システムをそちらの状態に同期します。差分は、新しくコミットされた時のみではなく、外部のシステムやヒューマンエラーなどの原因で発生する場合もあります。そのため、エージェントは差分を常に監視して開発者へ通知するか、もしくは自動的に望ましい状態に遷移します。
GitOpsのメリット
GitOpsのメリットは次のとおりです。
全てのオペレーションを統一・再現性があるプロセスを実現できる
GitOpsでは、インフラストラクチャからアプリケーションのコンフィグまで全てをGitに保存・管理します。また、全ての変更はPRを通して行うので、今までのアプリケーションコードの変更プロセスと全く同じです。これはシステムの新しいバージョンのリリースだけでなく、システムのスケールや設定データの変更も同じプロセスになります。デプロイのロールバックの際も通常のアプリケーション開発と同じ様に `git revert` して、PRを出します。このおかげで開発者の体験が改善でき、開発者の操作エラーが削減できると考えています。開発者がやるべきことはPRを出してマージするだけで、残りのタスクはエージェントが行うので、最大限自動化できる仕組みとなっています。
システム変更の可視性を向上する
Gitを信頼できる唯一の情報源として使っているため、コミット履歴は監査ログ(Audit Log)として残ります。この監査ログで誰がいつ、何がどこで発生したかを検知・監視できるようになります。そして、エージェントはリアルタイムでシステムの実際の状態と望ましい状態の差分(Configuration Drift)を検知してくれます。人間の操作や外部のシステムの影響で差分が発生すると、通知や自動修正を行うことができます。この仕組により、デプロイ時だけではなくサービスのライフサイクルのどの時点においても差分がないことを保証できます。
強力なセキュリティを保証できる
GitOpsエージェントをデプロイ環境の中で動かせば、クラスタとの通信は内部通信になり、環境外にクレデンシャルの保存や通知が不要になり、より安全になると考えられています。そして、システムの変更は全てGitの操作になるため、本番環境への直接的なアクセス権限が不要になり、Zero Touch Productionを実現できます。