今日から始めるKubernetes-nativeなGitOps【CD編】


この記事は [WESEEK Advent Calendar](https://qiita.com/advent-calendar/2020/weseek) 2020 24日目の記事です。

こんにちは！ [WESEEK, Inc.](https://weseek.co.jp/) で長期インターンをさせていただいております [yamagai] (https://twitter.com/yamagai_0919)と申します。

前回は [今日から始めるKubernetes-nativeなGitOps【CI編 ~pipeline構築~】](https://qiita.com/yamagai/items/4344875ef479a664f9ff)を書きましたが、
今回は Tekton Pipeline にマニフェストリポジトリに対する pull request を作成する Task を追加し、ArgoCD を使ってCDする方法について書いていきます。

前回に引き続き、CI/CDを導入する対象のプロジェクトはフロントエンドが Next.jsでバックエンドが Rails のアプリです。
フロントエンドとバックエンドは一つのリポジトリにまとめています。


# 参考リポジトリ
こちらも、前回に引き続き以下のリポジトリを使います。

- CIを使用するプロジェクトのリポジトリ
    - https://github.com/bamboooo-dev/alcatraz
    - /api 以下がバックエンドで、/ui 以下がフロントエンド

- 今回使用する CI の設定を書いたマニフェストのリポジトリ
    - https://github.com/bamboooo-dev/alcatraz-tekton

- アプリのマニフェストリポジトリ
    - https://github.com/bamboooo-dev/alcatraz-manifests

# Tekton Pipeline に Task を追加する

### task を作る

リポジトリでは[こちら](https://github.com/bamboooo-dev/alcatraz-tekton/blob/main/tekton/tasks/create-pr/create-pr.yaml)に定義しました。

helm chart 内の values.yaml のイメージタグを更新し、PR を投げるタスクになっています。

pull request を作成する際に使っている API に関しては[公式のリファレンス](https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls#create-a-pull-request)をご覧ください。

### task に必要な変数を TriggerBinding で定義する

git push の際に送られてくる情報のうちのコミットハッシュをイメージタグとして使用したいので、TriggerBinding に変数を定義してその値を task 内で使用するようにしましょう。


# ArgoCD を導入する

CD のツールには [ArgoCD](https://argoproj.github.io/argo-cd/) を使用します。
ArgoCD はマニフェストリポジトリの状態を

## ArgoCD のインストール
公式の Getting Started → https://argoproj.github.io/argo-cd/getting_started/

まずは argocd という namespace を作りましょう。

```jsx
(⎈ |jukai:tekton-ci)❯ kubens argocd
Context "jukai" modified.
Active namespace is "argocd".
```

それではインストールです。

```jsx
(⎈ |jukai:argocd)❯ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```

## ArgoCD CLI のインストール

自分は Mac なので brew でインストールします。他の OS の方は[こちら](https://argoproj.github.io/argo-cd/cli_installation/)を見てください。

```jsx
(⎈ |jukai:argocd)❯ brew install argocd
```

## ArgoCD を使ってみる

### Argo API server にアクセスする
argocd-server service の type を LoadBalancer にしてアクセスすることも可能ですが、今回はポートフォーワードでいきましょう。

```jsx
(⎈ |jukai:argocd)❯ kubectl port-forward svc/argocd-server 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
```

### ログインする
ログイン方法としては、CLI を使う方法と GUI からログインする方法の二つあります。
どちらの方法でも`username`と`password`の二つが必要になります。

デフォルトでは、それぞれ
Username: `admin`
Password: `argocd-server pod の名前` となっています。

Passwordは、以下のコマンドで取得することができます。

```
$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2
```

それではそれぞれの方法を試していきましょう。

- CLI を使う場合

```jsx
(⎈ |jukai:argocd)❯ argocd login localhost:8080
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin' logged in successfully
Context 'localhost:8080' updated
```
WARNING に対して y を選択し、username と password を入力するだけです。簡単ですね。


- GUI を使う場合

`http://localhost:8080`にアクセスしましょう。
CLI の場合と同じく TLS 証明書の警告が出ますが気にせず飛ばすと以下の画面が出てきます。
![スクリーンショット 2020-12-24 20.40.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/2b20601c-e813-5ed4-6785-27f4091bcd7c.png)

あとは username と password を入力するだけです。こちらも簡単ですね。


### アプリのsync設定
ログインが完了すると以下の画面が表示されます。
![スクリーンショット 2020-12-24 21.01.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/a2f159c5-ecc7-8687-e093-88786cc6066c.png)

左上の `+ New APP`から設定ができます。

![スクリーンショット 2020-12-24 21.24.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/bff5284b-14fc-beec-753e-8a54599d1d87.png)

![スクリーンショット 2020-12-24 21.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/c97a2191-d3ce-98da-1270-e3a2bd90e5f0.png)
上記のようにそれぞれ設定します。
ここでは、`SYNC POLICY`は　Automatic にし、`PRUNE RESOURCES`と`SELF HEAL`を有効にしています。

`PRUNE RESOURCES`は、マニフェストリポジトリに存在しないリソースは削除するというもので、
`SELF HEAL`は、マニフェストリポジトリで管理しているリソースを直接編集しても反映されずにリポジトリの通りのリソース構成を維持してくれるというものです。

これらにより非常に厳密にマニフェストリポジトリと sync できますね！

なお、一番下の欄に`Directory`とありますが、
今回は Helm を使ってマニフェストを管理しているので`Helm`に変更しましょう。

![スクリーンショット 2020-12-24 22.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/27673d12-6223-696a-1d6b-c8bc8c5fa2fc.png)

この画面で全て Healthy になれば完了です。

![スクリーンショット 2020-12-24 22.29.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640444/4ae0e46e-223a-974d-e83a-6b3101379dbd.png)
直感的にわかりやすくて良いですね〜

以上で、PRをマージすることで ArgoCD が sync してくれるようになったので GitOps の完成です！！！


# 最後に

今回は、Tekton Pipeline にマニフェストで使用するアプリのイメージタグを更新する PR を作成する Task を追加し、ArgoCD を導入することで CI/CD を GitOps にしました。

現状だと、フロントとバックエンドのイメージを毎回両方とも build & push をしてしまうのでそういった部分の対策なども施し次第、追って更新していこうと思います。





※この記事は [WESEEK Tips wiki](https://tips.weseek.co.jp/) に 2020/12/24 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開しています。