無心でコピペしてGitOpsを試してみた with Argo CD

![eyecatch_2103BrainlessGitOps_withArgoCD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/35d34187-87ac-15af-7690-640c3aaa21e2.png)

※ 本稿は <a href="https://tech.drecom.co.jp/?_src=qiita">Tech Inside Drecom</a> に掲載された記事、「<a href="https://tech.drecom.co.jp/gitops-withargocd/?_src=qiita">無心でコピペしてGitOpsを試してみた with Argo CD</a>」の Qiita 出張版です。

# はじめに

「<a href="https://tech.drecom.co.jp/ac2020-beginning-gitops/?_src=qiita" target="_blank">俺、今期が終わったらGitOpsするんだ</a>」という記事を書いたのが昨年末。
気づいたら今期が終わっているじゃありませんか。

<b>あれ、GitOpsの準備ぜんぜん出来てなくね…？</b>

うん、まぁ大体そうなりますよね。
プロジェクトには優先度高なタスクってのが往々にしてあるもんです。
しかし導入のための準備は進めておくに越したことはありません。
ということで、とりあえず[GitOps](https://www.weave.works/technologies/gitops/)ツールの代表格である[Argo CD](https://argoproj.github.io/argo-cd/)を試してみました！っていう記事です。

「GitOpsって聞くけど、実際どんな感じになるのかチョロっと試したいな」

そんな軽い気持ちの内容で、基本的にコピペすれば誰でも動かせるような形でまとめています。
もし興味があれば、試してみて頂ければと思います。

#GitOpsとは

前述した「<a href="https://tech.drecom.co.jp/ac2020-beginning-gitops/?_src=qiita" target="_blank">俺、今期が終わったらGitOpsするんだ</a>」という記事にまとめてありますm(_ _)m

#前提条件

Macで[Docker Desktop](https://docs.docker.jp/docker-for-mac/install.html)をインストールしてある環境が前提になっています。
環境が異なる方は、よしなに読み換えてください。
Docker Desktopで[Kubernetesを有効化](https://docs.docker.jp/docker-for-mac/index.html#kubernetes)するのもお忘れなく。

#レッツトライ GitOps

それではArgo CDを使ってGitOpsを試してみます。

##1. Namespaceの作成

まずはArgo CDのリソースを動かすNamespaceを作成します。

```
kubectl create namespace argocd
```

##2. Podの作成
Namespaceが出来たら、次はPodを作ります。
マニフェストはArgo CDの[GitHubに上がっているもの](https://github.com/argoproj/argo-cd/blob/master/manifests/install.yaml)を使います。

```
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```
マニフェストが適用できたら、Podが作られているか確認します。

```
kubectl get pod -n argocd
```
```
NAME                                 READY   STATUS    RESTARTS   AGE
argocd-application-controller-0      1/1     Running   0          32s
argocd-dex-server-567b48df49-mrqfq   1/1     Running   0          32s
argocd-redis-6fb68d9df5-gwtkk        1/1     Running   0          32s
argocd-repo-server-6dcbd9cb-sl99q    1/1     Running   0          32s
argocd-server-69678b4f65-b84wd       1/1     Running   0          32s
```
うん、いいですね。
大体30秒くらいで全てのPodがRunningになります。

##3. GUI画面へアクセス

```
kubectl port-forward svc/argocd-server -n argocd 8080:443
```
こんな感じでargocd-serverのServiceをport-forwardすると、GUI画面にアクセス出来るようになります。
https://localhost:8080 にアクセスしてみて、
![001_optimized-1024x503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/96ef05dc-b541-2c16-d018-4c07bcc2d95e.png)

タコさんウインナーが出てきたらOKです。笑
（余談ですが、ArgoってArgonauta argoから取ってるんですかね？）
さて、次はログインですが、アカウント情報は以下の通りになります。

<table border>
<tr><td>Username</td><td>admin</td></tr>
<tr><td>Password</td><td>（argocd-serverのPod名）</td></tr>
</table>

Pod名はさっき表示した一覧からコピペすれば事足りますが、コマンドで抽出するならこうです。

```
kubectl get pod -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
```
無事にログインが出来ると、
![Applications-Argo-CD-2021-03-15-22-48-52-1024x503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/7c5c33bf-29e6-7bb7-eade-f2337670c102.png)
こんな画面になります。

<b>おいおいおいおいおいおいおい簡単だぜ！</b>

あとはアプリケーションを設定すれば、GitOpsを試せるはずです。

## 4. デモ用のリポジトリをフォーク

ここでせっかくなので楽しいアプリケーションを作りたいという気持ちが湧き出てくると思いますが、グッと堪えてください。
今回はコストカットのためにArgo CDが用意してくれている[デモ用のリポジトリ](https://github.com/argoproj/argocd-example-apps)をフォークして使わせてもらいます。

![github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/168b4a45-2e9d-86e2-650e-3b7ca737678a.png)

さて、アプリケーションも用意できたので、あとはGUI画面でポチポチ設定していくだけです。

## 5. リポジトリの登録

まずは「Setting」から「Repositories」を選択。
![041-1024x503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/41cce78a-fb9c-8bb8-8e3b-9feea3e8cea5.png)

パブリックリポジトリとしてフォークしていれば、認証情報は必要ありません。
なので「CONNECT REPO USING HTTPS」を選択して、
![Repositories-Settings-Argo-CD-2021-03-15-22-52-50-1024x503.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/d4e4fa26-1ae6-f6ba-6a4a-22b206245008.png)

URLを設定するのみ。
![url.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/1329192f-80fe-9bae-ea63-5a9cdcad880d.png)

「CONNECT」すると、
![connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/f51b7455-e7b5-00ca-880a-9d2444b1172b.png)

接続に成功しましたね。
順調極まりない。

##6. アプリケーションの設定・同期

まずは、デプロイするアプリケーション用のNamespaceを作っておきます。

```
kubectl create ns develop
```
Namespaceが作成できたら「NEW APP」を選択して、デプロイ対象のアプリケーション情報を登録しましょう。
今回はデモ用の[kustomize-guestbook](https://github.com/argoproj/argocd-example-apps/tree/master/kustomize-guestbook)をデプロイします。
「Repository URL」には先ほど登録したリポジトリを、「Path」はkustomize-guestbookを選択。
Namespaceはdevelopを指定します。

![repo-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/0b21ef4d-1ec9-bc74-de91-7fdd75fdb38a.png)
![repo-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/40369184-2f51-389f-a5d5-2784df4fee8b.png)
![repo-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/6d2f7230-6f0e-47c8-97c8-f532bf69d892.png)


こんな具合ですね。
「CREATE」を押すとGitHubとの同期が開始されて、デプロイが行われます。
![create-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/4f6be6bf-be81-e9e6-4390-068c3730c0c0.png)
![create-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/d4bc3106-7e6e-3b7b-d939-14af84f716a8.png)

オールグリーンになれば、デプロイが完了。
kubectlでリソースがちゃんと作られているか確認してみます。

```
kubectl get deploy,svc,pod -n develop
```
```
NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kustomize-guestbook-ui   1/1     1            1           9s
 
NAME                             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kustomize-guestbook-ui   ClusterIP   10.103.78.215   <none>        80/TCP    9s
 
NAME                                          READY   STATUS    RESTARTS   AGE
pod/kustomize-guestbook-ui-779bc8b498-tpnzg   1/1     Running   0          9s
```

問題なさそうですね。
アプリケーションのほうも確認してみましょう。

```
kubectl port-forward svc/kustomize-guestbook-ui -n develop 8081:80
```

port-forwardしてhttp://localhost:8081/ にアクセスすると、
![guestbook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/9a3ef263-9936-6397-f6c4-93fb4416f41c.png)

動いてますね。
（使い方はよう分からんですが…）
では、Argo CDの良い感じの画面に戻ります。
![argocd-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/f0e96fad-03e9-0720-c5e0-7565b60dff5c.png)

ここでアプリケーションが更新されていくのをニヤニヤしながら見れるわけですね。
ちなみに、アンテナマークみたいのを選択すると、ReplicaSetなどすべてのリソースが表示されるようになります。
![argocd-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/4a37ee0f-3b61-476f-a22d-4f2adecac1da.png)

「APP DETAILS」を見ると、設定やkubectlで取得できるような情報を確認することが出来ます。




同様に各ノードを選択すると、マニフェストやイベント・ログといった情報を確認することも出来ます。



<b>ええやん。</b>

##7. マニフェストを更新
さぁ、ここまでは設定ということで、ようやくGitOpsなところに入っていきます。
（もう殆ど記事終わりなんですけどね）
Argo CDと同期したGitHubのリポジトリで管理しているマニフェストを更新すれば、それに応じてデプロイされたアプリケーションの状態も更新されるはず。
ということで、replicaCountを増やしてみます。
![replicaCount.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/b329c33f-1c8f-5774-b56c-657ec31fe17a.png)

ポチッとコミット。
しばらく待っていると…
![replicaCount-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218415/1d2f1eaf-ab98-85ab-b98c-30d609104023.png)

おぉ、Podが3つに増えましたね！
kubectlでも確認しておきます。

```
kubectl get pod -n develop
```
```
NAME                                      READY   STATUS    RESTARTS   AGE
kustomize-guestbook-ui-779bc8b498-hl54k   1/1     Running   0          20s
kustomize-guestbook-ui-779bc8b498-tpnzg   1/1     Running   0          10m
kustomize-guestbook-ui-779bc8b498-vc5pq   1/1     Running   0          20s
```
完全に反映されているじゃあないか！
つまりこれは、

<b>GitOpsしちった</b>

ということで良いですよね。
以上のように、Argo CDを使うとGitOpsのフローを簡単に試してみることが出来ます！
Argo CD、使いやすそうだな。

#おわりに

今回はタイトルの通り、簡単なGitOpsの試し方の紹介でした。
自分がいるプロジェクトで運用しているサービスもAmazon EKSに移行が完了したので、GitOpsの導入を検討し始めています。
EKS移行時の話も記事になっているので、そちらもぜひ。

* [古き良きRailsアプリケーションをコンテナ化してKubernetes上で動かす](https://tech.drecom.co.jp/migrate-rails-app-to-container/?_src=qiita)
* [ダウンタイムなしでEC2からEKSへ移行しました！](https://tech.drecom.co.jp/ec2toeks-without-downtime/?_src=qiita)

実際にGitOpsを導入して運用を開始したら、また書きたいですね。
それでは。

---

Tech Inside Drecom の最新の情報は Facebook や Twitter からお届けしています、フォローよろしくおねがいします！

* Twitter: <a href="https://twitter.com/DRECOM_TECH" target="_blank">@DRECOM_TECH</a>
* Facebook: <a href="https://www.facebook.com/tech.inside.drecom" target="_blank">tech.inside.drecom</a>

---

※ その他の Tech Inside Drecom の記事は、<a href="https://tech.drecom.co.jp/?_src=qiita">コチラ</a>からお探しいただけます！!