この記事は WESEEK Advent Calendar 2020 24日目の記事です。
こんにちは! WESEEK, Inc. で長期インターンをさせていただいております [yamagai] (https://twitter.com/yamagai_0919)と申します。
前回は 今日から始めるKubernetes-nativeなGitOps【CI編 ~pipeline構築~】を書きましたが、
今回は Tekton Pipeline にマニフェストリポジトリに対する pull request を作成する Task を追加し、ArgoCD を使ってCDする方法について書いていきます。
前回に引き続き、CI/CDを導入する対象のプロジェクトはフロントエンドが Next.jsでバックエンドが Rails のアプリです。
フロントエンドとバックエンドは一つのリポジトリにまとめています。
参考リポジトリ
こちらも、前回に引き続き以下のリポジトリを使います。
-
CIを使用するプロジェクトのリポジトリ
- https://github.com/bamboooo-dev/alcatraz
- /api 以下がバックエンドで、/ui 以下がフロントエンド
-
今回使用する CI の設定を書いたマニフェストのリポジトリ
-
アプリのマニフェストリポジトリ
Tekton Pipeline に Task を追加する
task を作る
リポジトリではこちらに定義しました。
helm chart 内の values.yaml のイメージタグを更新し、PR を投げるタスクになっています。
pull request を作成する際に使っている API に関しては公式のリファレンスをご覧ください。
task に必要な変数を TriggerBinding で定義する
git push の際に送られてくる情報のうちのコミットハッシュをイメージタグとして使用したいので、TriggerBinding に変数を定義してその値を task 内で使用するようにしましょう。
ArgoCD を導入する
CD のツールには ArgoCD を使用します。
ArgoCD はマニフェストリポジトリの状態を
ArgoCD のインストール
公式の Getting Started → https://argoproj.github.io/argo-cd/getting_started/
まずは argocd という namespace を作りましょう。
(⎈ |jukai:tekton-ci)❯ kubens argocd
Context "jukai" modified.
Active namespace is "argocd".
それではインストールです。
(⎈ |jukai:argocd)❯ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
ArgoCD CLI のインストール
自分は Mac なので brew でインストールします。他の OS の方はこちらを見てください。
(⎈ |jukai:argocd)❯ brew install argocd
ArgoCD を使ってみる
Argo API server にアクセスする
argocd-server service の type を LoadBalancer にしてアクセスすることも可能ですが、今回はポートフォーワードでいきましょう。
(⎈ |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 を使う場合
(⎈ |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 証明書の警告が出ますが気にせず飛ばすと以下の画面が出てきます。
あとは username と password を入力するだけです。こちらも簡単ですね。
アプリのsync設定
左上の + New APP
から設定ができます。
上記のようにそれぞれ設定します。
ここでは、SYNC POLICY
は Automatic にし、PRUNE RESOURCES
とSELF HEAL
を有効にしています。
PRUNE RESOURCES
は、マニフェストリポジトリに存在しないリソースは削除するというもので、
SELF HEAL
は、マニフェストリポジトリで管理しているリソースを直接編集しても反映されずにリポジトリの通りのリソース構成を維持してくれるというものです。
これらにより非常に厳密にマニフェストリポジトリと sync できますね!
なお、一番下の欄にDirectory
とありますが、
今回は Helm を使ってマニフェストを管理しているのでHelm
に変更しましょう。
この画面で全て Healthy になれば完了です。
以上で、PRをマージすることで ArgoCD が sync してくれるようになったので GitOps の完成です!!!
最後に
今回は、Tekton Pipeline にマニフェストで使用するアプリのイメージタグを更新する PR を作成する Task を追加し、ArgoCD を導入することで CI/CD を GitOps にしました。
現状だと、フロントとバックエンドのイメージを毎回両方とも build & push をしてしまうのでそういった部分の対策なども施し次第、追って更新していこうと思います。
※この記事は WESEEK Tips wiki に 2020/12/24 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開しています。