こんにちは、よしぽ(@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環境を用意できます。
インストールされていない方は以下のマニュアルから設定してみてください。
セットアップ
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にはいくつかカスタムリソースがあります。
AppProject | Applicationをまとめる論理グループ | 権限などの設定を行うことができます |
Application | 実際にデプロイするアプリケーション | Gitリポジトリのパスを指定します |
今回はこちらのマニフェストを用意しましたので、こちらを使っていきます。
中身についての解説は省略します。
git clone https://github.com/yoshikiogawa/getting-started-argocd.git
argocd-application-test.yaml | カスタムリソースApplicationのマニフェストファイル |
argocd-appproject-test.yaml | カスタムリソースAppProjectのマニフェストファイル |
test-app-manifest | test用の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の基本的な動きは確認することができたと思います。
もっと色々設定をいじってみたいけれど膨大な時間を奪われそうなのでここらへんで終わりたいと思います。権限周りとか。。。
コメント