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


この記事は WESEEK Advent Calendar 2020 24日目の記事です。

こんにちは! WESEEK, Inc. で長期インターンをさせていただいております yamagaiと申します。

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

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

参考リポジトリ

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

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 からログインする方法の二つあります。
どちらの方法でもusernamepasswordの二つが必要になります。

デフォルトでは、それぞれ
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 RESOURCESSELF 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企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開しています。