Argo CD の GitOpsを確認してみた

アルゴCDは、アプリケーションがデプロイ先で、目的の状態となるようにデプロイを自動化する。 デプロイするアプリケーションの更新を追跡、Gitコミット時のタグによる特定バージョンのデプロイなども可能である。

アルゴCDは、Kubernetesコントローラとして実装され、アプリケーションの動作を継続的にモニターして、現在状態から目的とする状態へ変えていく、ウェブ画面からの変更ではできず、Gitリポジトリを通じて状態を設定する。 デプロイされたアプリケーションの現状が、目的とする状態から外れることを **OutOfSync (同期外）** とみなす。 アルゴCDは、目的とする状態と現状の差異を視覚化しレポートする。現状を目的の状態にするために、**自動的同期**または**手動同期**の手段を提供する。 自動的同期では、Gitリポジトリでターゲット状態へ加えられた変更は自動的に適用され、指定された環境へ反映される。

次は、インストールが完了した状態のアルゴCDのポッドである。argocd-serverにアクセスすることで、ウェブ画面へアクセスできる。

~~~console:
$ kubectl get pod -n argocd
NAME                                            READY   STATUS    RESTARTS   AGE
argocd-application-controller-d99d77688-rmqxp   1/1     Running   0          7d17h
argocd-dex-server-6c865df778-vfrll              1/1     Running   0          7d17h
argocd-redis-8c568b5db-795mm                    1/1     Running   0          7d17h
argocd-repo-server-675bddcbb8-mc5wt             1/1     Running   0          7d17h
argocd-server-75877b6ffb-7djl2                  1/1     Running   0          7d17h

$ kubectl port-forward svc/argocd-server 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
~~~

デプロイしたアプリケーションの元になっているGitHubの情報を表示してくれる。アプリケーションの構成ファイル、すなわち、YAMLのマニフェストのリポジトリが、何処に存在していて、Kubernetesクラスタ上の状態とリポジトリの状態の一致状態を管理してくれる。Kubernetesでアプリケーションを運用して、DevOpsを実践する者にとって、マニフェストの管理は重要な関心事である。これはYAMLマニフェストだけでなく、kustomaize、helm などの形式を管理してくれるので、たいへん有用なツールと思う。

![ss-1-github-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/a06c3da1-0ff3-60c3-ce73-9b11c8f44961.png)


次のスクリーンショットは、左端のJava1 が構成ファイルすなわち、マニフェストのリポジトリを表しており、その右となりは、Kubernetes APIオブジェクトを表している。コードリポジトリから作られた Kubernetes APIオブジェクト Service と Deployment がある。そして、デプロイメントコントローラーの管理下で、レプリカセットコントローラーが存在して、ポッドが管理される。この構造を表示してくれる。ソースコードやコンテナを更新して、マニフェストを再アプライすると、レプリカセットのRevが更新される。このため、ロールバックする際に、どのレビジョンに戻すことができるかを視覚的に示してくれる。

そして、右端にあるポッドでは、現在有効となっているポッドのマニフェスト、及び、コンテナごとに出力されるログを、GUI操作で指定して表示できる。

順番があとになってしまったが、ハードマークの**Health**は、GitリポジトリとKubernetes APIオブジェクト群の状態が一致しており、意図した通りの動作が実現されていることを示している。そのとなりの **Synced** は同期、すなわち、GitリポジトリとAPIオブジェクトの一致を表している。もし、Gitリポジトリの状態が、コミット＆プッシュによって進んでしまうと、**Out Of Sync** と表示されて、一致していなことを一目でわかるように表示する。

![ss-2-object-hiarachi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/3b57e784-b87c-2cda-af89-d01f46f51d02.png)

次のスクリーンショットは、リクエスト・トラフィックの流れを表したもので、左のインターネットから、右のポッドにむけて、トラフィックの流れがわかるように図示されている。

![ss-3-request-flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/04a64029-a36d-5cbb-0d70-dd983def443f.png)

アプリケーションのポッドからデータベースのポッドをアクセスしている場合も表示されると良いが、ポッドが、どのサービスを利用するかは、マニフェストからは追えないため、関係を表示することは出来ない。以下の例では、rest-javaのポッドから、PostgreSQLのサービスを利用しているが、先に挙げた理由から関係を表示することはできない。しかし、同じリポジトリから生成されたインスタンスであれば、一つの束として扱われるので、表示から想像することはできる。

![ss-4-pod-2-svc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/2fcabc68-7055-d594-ebb5-29661206c8fe.png)


## Argo CD のインストール

マニフェストの中身を変更したり確認できるように、いったん、ローカルにクローンしてから、アルゴCDをインストールする。

~~~console:
$ git clone -n v1.6.1 https://github.com/argoproj/argo-cd
$ argo-cd/manifests
$ kubectl create ns argocd
$ kubectl apply -f install.yaml -n argocd
~~~

しばらくすると、アルゴCDのポッドが起動する。

~~~console:
$ kubectl get pod -n argocd
NAME                                            READY   STATUS    RESTARTS   AGE
argocd-application-controller-d99d77688-d7vgc   1/1     Running   0          4m51s
argocd-dex-server-6c865df778-chncr              1/1     Running   0          4m51s
argocd-redis-8c568b5db-pjcc4                    1/1     Running   0          4m51s
argocd-repo-server-675bddcbb8-2tj8q             1/1     Running   0          4m51s
argocd-server-75877b6ffb-px9t6                  1/1     Running   0          4m51s
~~~


## Webコンソールにアクセスする

ログインパスワードの取得は以下のようにする。

~~~console:
$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
argocd-server-857476fd74-blv9h
~~~

ポートフォワードでローカルホストからアクセスできるようにする。

~~~console:
$ kubectl port-forward svc/argocd-server 8080:443
~~~


http://localhost:8080/ としてアクセスすると、以下の画面が表示されるので、ユーザー名 admin パスワードは前述で取得したパスワードをセットする。

![ss-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/86f0a449-ac6f-0548-e31b-d45a99570575.png)


自己署名のTLS暗号が設定され、ユーザー認証できるので、ロードバランサーのパッチをあて、ドメイン名でのアクセスも可能である。

~~~console:
$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

$ kubectl get svc argocd-server -n argocd
NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP                          PORT(S)                      AGE
argocd-server           LoadBalancer   172.21.29.236    1f22aca5-jp-tok.lb.appdomain.cloud   80:31216/TCP,443:31052/TCP   111m
~~~

## argocd コマンドのインストール

Macの場合、brewコマンドでインストールできる。

~~~
$ brew tap argoproj/tap
$ brew install argoproj/tap/argocd
~~~

ログインでは、ロードバランサーの設定があると良いね。

~~~
$ argocd login 1f22aca5-jp-tok.lb.appdomain.cloud
~~~

## GitHubのアドレスを登録する

左端のメニューからアプリケーションを選択する。 「+ NEW APP」をクリックして、GitHubのアドレスなどを登録する。その後、自動的に同期するか、手動とするかを選べば良い。あとは画面の表示に従って操作するだけで良い。

![ss-5-add-app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/c68c45ad-fe59-2c3f-203c-4749e7465633.png)



## まとめ

OpenShiftでは、デプロイ済みのアプリケーションのリストを表示してくれ、レプリカ数などの変更や、稼働状況を確認できるので、生のKubernetesを使うよりも簡単に運用することができる。その反面、OpenShiftに慣れてしまうと、生のKubernetesを使うスキルが失われないかと不安になる。この懸念に対して、ArgoはオープンソースのGitOpsを通しながら、可視化や運用性を改善してくれる便利なツールだ。

Kubernetesでアプリケーション運用するのであれば、アルゴCDは必須のツールであると思う。


## 参考資料

* https://github.com/argoproj/argo-cd/blob/master/docs/getting_started.md
* https://argoproj.github.io/projects/argo-cd