こんにちは、やまなかです。今回はGitOpsパラダイムに従ったKubernetesのCD(Continuous Delivery)ツールであるArgo CDについて分かりやすく簡単にまとめていこうと思います。Argo CDはCDに特化したツールであり、CI/CDで言うところのCI(Continuous Integration)の機能はありません。
まずはCI/CDやGitOpsといった部分からまとめていきます。
CI/CDとは
Continuous Integration / Continuous Deliveryの略称で、継続的インテグレーション&継続的デリバリーという意味です。具体的に継続的インテグレーションと継続的デリバリーが何を指すかというと以下の通りです。
継続的インテグレーション
ビルドとテストを自動化させることを指します。新しいコミットがメインブランチにマージされるたびに、アプリケーションが壊れていないかどうかをチェックする自動テストに重点が置かれています。
継続的デリバリー
コード変更後にステージング環境などにデプロイしてテストなどを行います。自動テストに加えて自動リリースもあり、いつでもアプリケーションをデプロイできる状態にすることを指します。
CI/CDに戻ると、コードチェックやテストの自動化、デプロイの自動化などを行うことで生産性の向上を図る開発手法です。
GitOpsとは
次にArgo CDの思想であるGitOpsです。GitOpsはバージョン管理やCI/CDなどの開発及び運用(DevOps)の手法をインフラ管理に適用した運用モデルです。Gitを使ってインフラやアプリケーションなどのシステム全体を管理する手法と考えることができます。
Argo CDとは
本題のArgo CDは、監視している実行中のKubernetesアプリケーションの状態と、Gitリポジトリの状態を比較するコントローラとして実装されています。状態に差がある場合にその違いを視覚化して、自動もしくは手動でアプリケーションの同期を行います。
基本的な流れとしては、Kubernetesマニフェストを使用してGitリポジトリのコミットを監視します。コミットが発生するとKubernetesクラスタ(コンテナ化されたアプリケーションを実行するノードの集合体)構成とGitの内容を同期するといった流れになります。
GitOpsのCDツールで良く上げられるのが、Argo CDとFluxになります。両者に大きな機能差はないものの、Argo CDはGUIで操作が可能であるため、kubectlコマンドをあまり理解していなくてもクラスタ運用できる点がメリットとして挙げられます。FluxはGUIやユーザー管理機能はないもののシンプルで軽量に作られています。
アーキテクチャ
前項にもあったようにArgo CDはKubernetesのコントローラとして実装されています。単体のアプリケーションと複数のアプリケーションをまとめるリソースが定義されています。このリソースをクラスタに適用することで参照するGitリポジトリと管理するクラスタ、ネームスペース、リソースなどを指定することができるようになっています。
デモ
KubernetesクラスタとGitリポジトリを同期するデモGettingStartを行ってみます。
実行環境
OS : WSL2 – Ubuntu 22.04.2 LTS
minikube : version: v1.30.1
minikubeを起動します。
$ minikube start
Argo CD をインストールします。
$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
Argo CD CLI をダウンロードします。
$ curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
$ sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
$ rm argocd-linux-amd64
Argo CD API サーバーにアクセスします。
デフォルトでArgoCDは外部IPから接続できないようになっているので、ここではPort Forwardingしてローカルから接続できるようにします。Port Forwardingとは簡単に言うとデータを転送することです。
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
localhost:8080でArgoCDのログイン画面に行きます。
デフォルトのユーザーadminのパスワードはこのコマンドで確認できます。adminとパスワードを入力してログインします。
$ argocd admin initial-password -n argocd
トップページにアクセスできました。
サンプルのGit リポジトリを自身のGitHubアカウント上にフォークします。この作業はコードの変更を加えたときの挙動を見るために行います。試しに動かしたいだけのときはサンプルのGitリポジトリをそのまま使っても大丈夫です。
https://github.com/argoproj/argocd-example-apps
NEW APPボタンからアプリケーションの情報を入力していきます。
GENERAL | |
Application Name | guestbook |
Project Name | default |
SYNC POLICY | Manual |
SOURCE | |
Repository URL | https://github.com/{GitHubのユーザー名(なければargoproj)}/argocd-example-apps.git |
Revision | HEAD |
Path | guestbook |
DESTINATION | |
Cluster URL | https://kubernetes.default.svc |
Namespace |
default |
UI上部のCREATEを押してアプリケーションを作成します。
ステータスがOutOfSyncになっていることを確認します。
SYNC→SYNCHRONIZEを実行してアプリケーションをデプロイします。
ステータスがSyncedになってアプリケーションをデプロイできました。
guestbookを押すとKubernetesリソースを確認することができます。
GitHub上でフォークしたサンプルアプリケーションに変更を加えます。guestbook/guestbook-ui-deployment.yaml内のreplicasを好きな数に変更してみます。
REFRESHを押すとステータスがOutOfSyncになっていることを確認できます。
UI上部のAPP DIFFを見てみると変更箇所を確認できます。
戻ってSYNCを実行します。podの数がreplicasで指定した数になっていることを確認できます。
デプロイしたアプリケーションを確認してみましょう。以下のコマンドでguestbookをPort Forwardingしてローカルから接続できるようにします。
$ kubectl port-forward svc/guestbook-ui -n default 8000:80
localhost:8000にアクセスするとguestbookが表示されました。
まとめ
Argo CDはGitOpsパラダイムに従ったKubernetesのCDツールでした。実行中のアプリケーションの状態と、Gitリポジトリの状態を比較しており、状態に差がある場合にその違いをUIで視覚化して、今回は手動でアプリケーションの同期を行いました。このように、Argo CDを使うことでアプリケーションのデプロイをシンプルで効率的に管理することができます。
参考文献
https://www.cncf.io/blog/2020/12/17/solving-configuration-drift-using-gitops-with-argo-cd/
https://www.redhat.com/ja/topics/devops/what-is-gitops
https://dev.classmethod.jp/articles/kind_kubernete_argocd_getting_started/