はじめてのArgo CD

Tech

こんにちは、よしぽ(@yspo107)です。

今回はArgo CDはなんぞやということでArgo CDのインストールからアプリケーションのデプロイまでの一連の流れをやってみました。業務ですこーし触ることがあったのですが、UIでポチポチしたりするくらいだったので、実際にArgoCD自体を構築するのははじめてになります。
(ArgoCDのロゴを見た時タコさんウィンナーかと思った)

ArgoCDとは

Kubernetes 環境で GitOps でデプロイする CD ツールです。
Gitリポジトリのマニフェストに合わせて、自動デプロイメントを行ってくれます。

ArgoCDは、実行中のk8sアプリケーションを継続的に監視しており、アプリケーションの現実状態(今現在の状態)とGitリポジトリのマニフェスト理想状態を比較するKubernetesのカスタムコントローラーとして実装されます。
現実状態と理想状態に差がある場合にその違いを視覚的に確認することができます。そして、自動もしくは手動で理想状態へとアプリケーションの同期を行うことができます。

環境

  • PC – mac M1
  • k8sクラスタ – Docker Desktop for Mac
  • kubernetes – v1.24.0

kubectlなどの基本的な設定はしてあります。

k8sクラスターの準備

今回はDocker Desktopを使用して、ローカルPCに簡易的なk8s環境を準備します。
WindowsならWSL2とDocker Desktopをインストール、MacならDocker Desktopをインストールします。設定からKubernetesを有効化インストールするだけなので簡単にk8s環境を用意できます。
インストールされていない方は以下のマニュアルから設定してみてください。

Docker Desktop 概要
 

セットアップ

Argo CDのインストール

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

リソースの確認

kubectl get pod -n argocd

NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          6m53s
argocd-applicationset-controller-6b4b7969b8-98qfb   1/1     Running   0          6m53s
argocd-dex-server-6445d44bd9-7brsd                  1/1     Running   0          6m53s
argocd-notifications-controller-98464fc99-td8hq     1/1     Running   0          6m53s
argocd-redis-5dff748d9c-4ng25                       1/1     Running   0          6m53s
argocd-repo-server-7778dffc44-dztjw                 1/1     Running   0          6m53s
argocd-server-5f687c8b99-fp6n2                      1/1     Running   0          6m53s

port-fowardを使って、ArgoCDのUIに接続できるようにします

kubectl -n argocd port-forward service/argocd-server 8080:443

ArgoCDへログイン(UI)

 https://localhost:8080に接続します。ArgoCDのログイン画面が表示されますので、ユーザー名とパスワードを入力していきます。

usernameはadmin
passwordは以下のコマンドで初期パスワードを取得しましょう

kubectl get secret argocd-initial-admin-secret -n argocd -o jsonpath='{.data.password}' | base64 --decode

アプリケーションのデプロイ

Argo CDにはいくつかカスタムリソースがあります。

AppProjectApplicationをまとめる論理グループ権限などの設定を行うことができます
Application実際にデプロイするアプリケーションGitリポジトリのパスを指定します

今回はこちらのマニフェストを用意しましたので、こちらを使っていきます。
中身についての解説は省略します。

git clone https://github.com/yoshikiogawa/getting-started-argocd.git
argocd-application-test.yamlカスタムリソースApplicationのマニフェストファイル
argocd-appproject-test.yamlカスタムリソースAppProjectのマニフェストファイル
test-app-manifesttest用のdeploymentのマニフェストファイル。nginxのpodが1つできる基本的なものになります。

AppProject

kubectl apply -f argocd-appproject-test.yaml

projectが追加されています。左歯車マーク[setting]→[Projects]から確認できます。

Application

kubectl apply -f argocd-application-test.yaml

アプリケーションが追加されています。

Gitのyamlファイルを参照してデプロイできているか確認してみます。

kubectl get depoly,rs,po

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           25m

NAME                              DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-8f458dc5b   1         1         1       25m

NAME                        READY   STATUS    RESTARTS   AGE
pod/nginx-8f458dc5b-sb7f5   1/1     Running   0          25m

ArgoCD上でも確認してみます。問題なく表示されています。

Gitのソースを変更するか手動でkubernetesのリソースを変更するとArgoCDは差分があることがわかるようになっています。ここでいうGit上のソースが理想の状態で、実際に動いているリソース(podとか)が現実状態になります。手動でリソースに変更を掛けてみます。

#nginxという名前のdeploymentをレプリカ数を3へと変更しています。podが3つにスケールアウトします。
kubectl scale --replicas=3 deploy/nginx

#podが増えているか確認します。
kubectl get po

NAME                    READY   STATUS    RESTARTS   AGE
nginx-8f458dc5b-jpnnt   1/1     Running   0          13m
nginx-8f458dc5b-k95z8   1/1     Running   0          10s
nginx-8f458dc5b-v954k   1/1     Running   0          10s

podの数がArgoCDからも増えていることを確認することができます。
理想状態と現実状態に差分があるとOutOfSyncという表示に変わってしまっています。

ArgoCD上で差分の詳細を確認してみます。これがとても便利で感動します。
OutOfSyncのマークが付いているdeployから[Details]をクリックします。

deployの詳細が表示されるので中段のDIFFタブを選択します。

そしてスクロールしていくと、差分があるところが確認できます。
左が現実状態。右が理想状態です。

OutOfSyncを解決します。つまり、理想状態へと戻していきます。
[SYNC]をクリックします。すると右側に出てくる[SYNCHRONIZE]をクリックしていきます。

理想状態へと戻りました。podの数が1台になっています。

コマンドでも確認してみます。同じように1台になっています。

kubectl get pod

NAME                    READY   STATUS    RESTARTS   AGE
nginx-8f458dc5b-jpnnt   1/1     Running   0          20m

なので間違ってリソースを変更してしまった場合でも、Gitにあるマニフェスト(理想状態)へとすぐに戻すことができます。
また、逆にGitに最新のマニフェストをpushすることで自動的にリソースの変更をすることももちろんできますので、やってみます。

Git側でdeplaoymentのマニフェストを変更してみました。レプリカ数を1から2へ変更しています。

すると自動的にアプリケーションの方もデプロイされていました。
ArgoCDとコマンドで確認。

NAME                    READY   STATUS    RESTARTS   AGE
nginx-8f458dc5b-gcgd8   1/1     Running   0          3m52s
nginx-8f458dc5b-jpnnt   1/1     Running   0          50m

私の職場では、本番環境にGitにpushしても自動的にアプリケーションがデプロイされないように自動syncオフにしています。こちらの設定はSYNCPOLICYで設定できます。マニフェストは空欄にしてありますが、デフォルトで自動syncが有効になっています。

自動syncオフにしていてもpushするともちろん差分が発生し、OutOfSync状態となります。
本番リリースの際に手動でsyncボタンを押して理想状態へと変更するみたいなことをやっています。

おかたづけ

kubectl delete -f argocd-application-test.yaml
kubectl delete -f argocd-appproject-test.yaml
kubectl delete ns argocd

おわりに

ArgoCDの基本的な動きは確認することができたと思います。
もっと色々設定をいじってみたいけれど膨大な時間を奪われそうなのでここらへんで終わりたいと思います。権限周りとか。。。

コメント

タイトルとURLをコピーしました