ArgoCDことはじめ(minikubeでチュートリアルやってみた)

この記事は[Playground Advent Calendar 2019](https://qiita.com/advent-calendar/2019/playground)の12/1の記事です。
こんにちは。[にっし〜](https://twitter.com/nishinishi172)です。
ここではGitOpsのCDツールであるArgoCDの概要と始め方について書きます。
実際の業務で使う際の諸々については[@zoetro](https://twitter.com/zoetro) さんの[こちら](https://blog.cybozu.io/entry/2019/11/21/100000)の記事をご覧ください。

# もくじ
- ArgoCDを触ったきっかけ
- そもそも[ArgoCD](https://github.com/argoproj/argo-cd/)って何さ？？
- [チュートリアル](https://argoproj.github.io/argo-cd/#quick-start)をminikubeでやってみた
- まとめ
- 参考URL

## きっかけ
夏インターン(時期的には秋でしたが...w)でリクルートライフスタイルさんにお世話になっていた際に、メンターさんがこのツールをプロジェクトに導入して整備していたことがきっかけでArgoCDを触ることになりました。
もともと軽くK8sに触れていたのでそこまでキャッチアップには詰まりませんでしたが、そんなに日本語ドキュメントが多くはない気がしたのでここで書きます。(ガチプロじゃないのでそんなに詳しく書けないかもしれませんが精進します)

## そもそも[ArgoCD](https://github.com/argoproj/argo-cd/)って何さ？？
[ArgoCD](https://github.com/argoproj/argo-cd/)はKubernetes上のアプリケーションのCD(継続的デリバリー)を実現するためのツールです。
マスコットキャラクターがこちら↓↓なのですが、明らかにタコさんウインナーですね笑
![スクリーンショット 2019-11-09 1.08.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/04fb3087-6521-ca33-6c36-0e2a3e9ac7a3.png)
全体のアーキテクチャーは公式が出している以下の図を見ていただければと思います
![スクリーンショット 2019-11-30 11.36.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/73970421-d1c4-b171-8d4a-d9bb8d97b7dd.png)
アプリケーションレイヤーのPRがmergeされるとCIによってビルドされ、 webhookされることでそのイメージがコンテナリポジトリに登録されます。

また、K8sのマニフェストファイル(アプリケーションをデプロイするための各種リソースの設定)をGitリポジトリにPushすると、 Argo CDはそれらを各Kubernetesクラスタに適用してくれます。

GitOps良いですね〜！！

ただ、ArgoCDの良さはまだあります。
ArgoCDは実行中のアプリケーションを継続的に監視し、現在のアプリケーションの状態を目的の状態（Gitリポジトリで指定されていると比較してくれます。そして、2者間の違いを視覚化し、アプリケーションの状態を目的のターゲット状態に自動的または手動で同期する機能を提供します。

何が言いたいかというと、ArgoCDの提供してくれるUI上で試しに
- podの数を増やしたり
- policy設定(アクセス権限)をいじったり
- その他色々
をしても、Gitリポジトリをsyncするだけで綺麗に元どおりにできます。環境をぶち壊して元に戻せなくなった...ということがないので安心ですね。

(当たり前ですが、手動syncの場合です。自動syncをonにしているとUI上でyamlを書き換えた段階で差分が検出されてGitリポジトリの内容で書き換えられてしまいます)

それでは最後に実際にどうやってArgoCDの環境を構築するのかを見ていきます。

## [チュートリアル](https://argoproj.github.io/argo-cd/#quick-start)をminikubeでやってみた
環境
minikube: v1.1.1

まずはDockerを立ち上げて、minikubeを起動します。minikubeの導入・使い方は説明を省きます。
[こちら](https://minikube.sigs.k8s.io/docs/start/)を参考にして導入すれば躓く事はないと思います
cluster nameは設定せずに起動します。

```
minikube start
```
statusを確認して以下のようになっていれば起動完了です。
![スクリーンショット 2019-11-30 12.39.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/15628d57-4152-5a57-069b-74a28401df5c.png)

起動できたら、argocd用のnamespaceを切って、設定用のmanifestをminikubeで用意したclusterにapplyします。

```
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```
`kubectl get pod -n argocd`で状態が以下のようになっていることを確認してください。
![スクリーンショット 2019-11-30 14.01.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/1efdb4f2-acde-107e-58d7-8acc2eb39f61.png)


それでは次にArgoCDのUI環境を構築していきます。
まずはbrewでCLIをダウンロードします。

```
brew tap argoproj/tap
brew install argoproj/tap/argocd
```

次に、デフォルトでArgoCDは外部IPから接続できないようになっているので、ここではPort Forwardingしてローカルから接続できるようにします。
Port Forwardingなんぞや？？って人は[この辺](https://www.secomtrust.net/secword/portforwarding.html)見ると良いと思います。

```
kubectl port-forward svc/argocd-server -n argocd 8080:443
```

これで8080番でローカルから接続できるようになりました。

次に、初期パスワードを変更するためにCLIにログインをします。
ArgoCDでは初期パスワードがArgo CD API serverのpod nameで設定されています。
そのままでも良いのですが、新しいパスワードに変更しましょう。

初期パスワードを取得します。(今回は自分の場合は`argocd-server-77cb9df44-srp6s`です)

```
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
```
初期パスワードを使ってログインします。Usernameは`admin`です。

```
argocd login localhost:8080
```
次のコマンドでパスワード再設定をします。

```
argocd account update-password
```

こんな感じになればOKです。
![スクリーンショット 2019-11-30 14.08.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/74f9f562-2a1d-ea7f-f93c-dc62c09fe79f.png)


最後に、UI画面からアプリケーションの構築をしていきます。
まずは http://localhost:8080 にアクセスしてください。
Usernameは`admin`、Passwordは先ほど設定したものを使用してください。
![スクリーンショット 2019-11-30 14.11.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/70baba71-116e-9807-cc79-7c22de08b05a.png)

ログインできたら本題のApplication構築の前に、Gitリポジトリと接続しましょう。左側のメニューの歯車マークのところから`Repositories`にとんでください。

今回は公式が用意しているサンプルリポジトリを使用します。
Repository URLに`https://github.com/argoproj/argocd-example-apps.git`を記入してください。optionalのところは空欄にしておきます。
![スクリーンショット 2019-11-30 14.21.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/37897ab6-f53b-db11-ded9-691d512c265e.png)

接続ができると以下のようになります。
![スクリーンショット 2019-11-30 14.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/757c3577-f150-4075-f562-3c431748c047.png)

右側の縦書き三点リーダーボタンを押すとCreate applicationメニューが出てくると思うので、そこからアプリケーションを構築していきます。

設定項目は色々あります。yamlで書くこともできますが、初回設定はポチポチして設定して、生成されたyamlを保存しておくのが良いと思います。
![スクリーンショット 2019-11-30 14.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/1cc7caae-9806-39f2-b1dd-5ae3c445175a.png)

今回は
- Application name：sample
- Project：default
- SYNC POLICY：Manual
- Repository URL：自動入力されているはずです
- Revision：HEAD
- Path：kustomize-guestbook
- Cluster：https://kubernetes.default.svc
- Namespace：default
で設定します。(kustomizeの設定は省略します)

すると、Applicationが構築されます。
![スクリーンショット 2019-11-30 14.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/3154aa9f-cb44-e028-2500-50875ab65b4f.png)

SYNC POLICYをManualにしているのでOutOf Syncになってますね。
SYNCボタンを押して、同期します。
![スクリーンショット 2019-11-30 14.26.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/6e3acd59-2e24-577f-45a9-dd43fffa15e2.png)
少し待つとこのように同期されてStatusがHealthyになります。

この状態を維持するために、SYNC POLICYをAutomaticにしましょう。
APP DETAILSボタンから設定の変更ができます。
![スクリーンショット 2019-11-30 14.42.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178746/15f8e76c-cd1d-473d-260b-c9222980ef69.png)
ENABLE AUTO-SYNCボタンを押して差分を自動で検出して同期するようにします。
Prune ResourcesとSelf HealもENABLEにしておきましょう。
それぞれ、更新によっていらなくなったリソースの削除、何らかの理由でアプリケーションが落ちた時に自動で同期して再構築をしてくれます。

## まとめ
ArgoCDの概要の紹介と初回構築の手順をさらってみました。
さらに詳しい機能の説明は[公式ドキュメント](https://argoproj.github.io/argo-cd/)から見れるほか、ArgoCD自体はGoで実装されたOSSなので([リポジトリ](https://github.com/argoproj/argo-cd/))コードベースで仕様を追うこともできます。
ぜひ使ってみてください！！

## 参考URL
・公式ドキュメント
https://argoproj.github.io/argo-cd/

・公式リポジトリ
https://github.com/argoproj/argo-cd/

・Argo CDによる継続的デリバリーのベストプラクティスとその実装(Cybozu Inside Out)
https://blog.cybozu.io/entry/2019/11/21/100000