GitOpsとは

## GitOpsとは

![45c76cd2b539bc4e8389e10d1b24b66c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/d74775b4-8dd8-f6d7-4946-6a1f3c8dd0e3.png)

GitOpsはWeaveworks社が提唱し始めたCDの手法です。
GitOpsについてGitLabの公式の記事では以下のように紹介されています。

> GitOpsは、バージョン管理、コラボレーション、コンプライアンス、CI/CDなど、アプリケーション開発で使われているDevOpsのベストプラクティスを、インフラの自動化に適用した運用フレームワークです。
参照: https://www.gitlab.jp/blog/2020/09/03/is-gitops-the-next-big-thing-in-automation/

もう少し噛み砕くと、「インフラとアプリケーションの両方を含めたシステム全体のコードをGitを使って管理する」、この考え方や手法がGitOpsの本質です。
GitOpsではGitのバージョン管理システムを用いてインフラの設定ファイル(Infrastructure as Code)を管理します。（インフラといってもKubernetes上であることが前提とされています）

IaCをGit上で追跡することでIaCの設定の変更を自動でインフラに適応でき、チーム全員で同じ情報を共有できるようになる上、エラーも少なくなるのでいいこと尽くしですね。笑

以下はGitLabのTwitterでとられたGitOpsの導入率のアンケートです。

https://twitter.com/gitlab/status/1277595216468418560?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1277595216468418560%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.gitlab.jp%2Fblog%2F2020%2F09%2F03%2Fis-gitops-the-next-big-thing-in-automation%2F

GitLabのフォロワーの中で25％がすでにGitOpsを使用しています。しかし、世界的な普及率はさらに低く、日本での普及率はもっと低いと予想されますが、GitOpsの流れは今後拡大していくと考えられています。



## GitOpsのメリット

大別して以下の四つがGitOpsを用いるメリットとして考えられます。

1.生産性
2. 安定性
2. 信頼性
2. セキュリティ

### 1. 生産性

Gitに変更が加えられるとレポジトリ上のIaCの設定が変更され、Kubernetesクラスタの更新や機能管理をGitを通して行うことができます。
運用からデプロイまでGitで完結できますし、本番環境の状態をGit上のIaCと比較することで一致しない場合には検知、修正することもできます。

### 2. 安定性
GitOpsのワークフローを導入すると外部で行われたKubernetesクラストへの変更の監査ログを自動的に取得することができます。
これにより、「誰が、いつ、何をしたのか」がログとして残るのでトラブルシューティングがより容易になります。

### 3. 信頼性
人手によるインフラの管理ではコマンドミス(```kubectl apply```の向き先)などがありえますが、GitOpsではそういったミスは起きません。ロールバックなどの運用もGitを通して管理するので安定stake再現性のあるオペレーションが可能です。

### 4. セキュリティ
CI/CDツールを用いたデプロイは基本的にkubectlでクラスタにPushしデプロイをするためクラスタの外部に認証情報を公開しなければならないため、セキュリティ上望ましくない場合もあります。CIとCDの機能の分離ができていないのでこのような仕組みにする必要があります。
しかし、GitOpsではCIとCDを分離して管理するため、クラスタに変更を加えるためにPullを用いることで認証情報を外部に公開することなくデプロイが行えるため、セキュリティ上のリスクを低減することができると考えられています。

## ワークフロー
以下は[Weaveworksの公式ブログ](https://www.weave.works/technologies/gitops/#continuous-delivery-and-gitops-workflows-in-weave-cloud)で紹介されているGitOpsパイプラインの図です。
この図からもわかる通り、CIもCDもGit上でコードの管理はしていますが、CIとCDの機能は分離されています。

![1GitOps-pipeline-1536246955439.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/fe7fd811-45ee-52e4-e1f9-4c5f8c710130.jpeg)


## GitOpsツール
現在主流なものは以下の三つのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407956/8b5b3f7e-88fa-4507-748c-4116a5715cac.png)
参照：https://tech.drecom.co.jp/ac2020-beginning-gitops/

### Argo CD

https://github.com/argoproj/argo-cd/

Arogo CDではGUIがわかりやすくおすすめです。
[ドキュメント](https://argoproj.github.io/argo-cd/)や[デモ](https://cd.apps.argoproj.io/applications)なども紹介されています。


### Flux CD
https://github.com/fluxcd/flux

GitOpsを提唱したWeaveworks社のツールで作りがシンプルかつ軽量ですが、GUIがありません。
チュートリアルはこちらから。

https://docs.fluxcd.io/en/1.21.0/tutorials/get-started/


### Jenkins X

https://github.com/jenkins-x/jx-cli

有名なJenkinsの出しているツールで、このツールではCI/CDに対応したパイプライン自体を構築可能です。（前者2つはできません。）
自由度はかなり高いですが、その分アーキテクチャが複雑なので学習コストは高め。

ドキュメントはこちらから。

https://jenkins-x.io/docs/

### その他
その他、[TerraformとGCPのCloud Buildを使用してGitOpsを再現する方法](https://cloud.google.com/architecture/managing-infrastructure-as-code?hl=ja)や、
[Azure上でFluxを用いてGitOpsを再現する方法](https://docs.microsoft.com/ja-jp/azure/azure-arc/kubernetes/conceptual-gitops-ci-cd)などがあります。

## 参照
https://www.gitlab.jp/blog/2020/09/03/is-gitops-the-next-big-thing-in-automation/
https://tech.drecom.co.jp/ac2020-beginning-gitops/
https://www.infoq.com/jp/news/2018/11/gitops-weaveworks/