😽

AKS に Argo CD を構築してデプロイする

2025/01/14に公開

ごきげんよう!mihohoi です。

以前、技術書典で Aoi さんが「まんがではじめるGitOps」を出版されていて、購入して試したのですがそれ以降触っていなかったので、今回改めて AKS に導入してみました。
Argo CD を使ったデプロイについては、Microsoft のドキュメントにも記載されており、採取的にこの構成をイメージして一通りの流れをつかんでいきます。

Azure Kubernetes Service 向け GitOps - Azure Example Scenarios | Microsoft Learn

最終的なイメージとしては上図の方に寄せたいと思いますが、まず第一歩として Argo CD のデプロイをして動作を確認します。

余談ですが、こちらの本とても分かりやすかったので超おススメです!
まんがではじめるGitOps:おとうふ工房

今回「Argo CD とは何ぞや?」については詳しく述べません。こちらをぜひ参考にしてください。

AKS を作成する

AKS を作成します。今回は Argo CD の動作を確認するだけなので、細かい設定は実施していきません。

% myResourceGroup=<リソースグループ名>
% location=<リージョン>
% myAKSCluster=<AKS クラスター名>

% az group create --name $myResourceGroup --location $location
% az aks create -g $myResourceGroup -n $myAKSCluster  --enable-managed-identity --node-count 1 --enable-addons monitoring --enable-msi-auth-for-monitoring  --generate-ssh-keys

作成が出来たので、kubectl の情報を収集します。

% az aks get-credentials --resource-group $myResourceGroup --name $myAKSCluster --overwrite-existing
% kubectl get nodes

これで準備完了です。

Argo CD を導入する

それでは Argo CD を導入していきます。
基本的には Getting Started を参考に入れていきます。

Install

argocd という名前で新しく namespace を作成します。その後、作成した名前空間に Argo CD をデプロイしていきます。
マニフェストがあるのは便利ですね。

% kubectl create namespace argocd
% kubectl get namespaces
NAME                STATUS   AGE
argocd              Active   4s
default             Active   9m29s
gatekeeper-system   Active   8m50s
kube-node-lease     Active   9m29s
kube-public         Active   9m29s
kube-system         Active   9m29s
% kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

namespace を見てみます。

% kubectl get all -n argocd
NAME                                                    READY   STATUS    RESTARTS   AGE
pod/argocd-application-controller-0                     1/1     Running   0          34s
pod/argocd-applicationset-controller-684cd5f5cc-2bvt7   1/1     Running   0          37s
pod/argocd-dex-server-77c55fb54f-xc8bq                  1/1     Running   0          36s
pod/argocd-notifications-controller-69cd888b56-mxwpp    1/1     Running   0          36s
pod/argocd-redis-55c76cb574-dlwdb                       1/1     Running   0          35s
pod/argocd-repo-server-584d45d88f-62kc8                 1/1     Running   0          35s
pod/argocd-server-8667f8577-5mfm5                       1/1     Running   0          34s

NAME                                              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/argocd-applicationset-controller          ClusterIP   10.0.140.30    <none>        7000/TCP,8080/TCP            43s
service/argocd-dex-server                         ClusterIP   10.0.248.5     <none>        5556/TCP,5557/TCP,5558/TCP   42s
service/argocd-metrics                            ClusterIP   10.0.240.86    <none>        8082/TCP                     42s
service/argocd-notifications-controller-metrics   ClusterIP   10.0.235.69    <none>        9001/TCP                     41s
service/argocd-redis                              ClusterIP   10.0.187.176   <none>        6379/TCP                     41s
service/argocd-repo-server                        ClusterIP   10.0.254.230   <none>        8081/TCP,8084/TCP            40s
service/argocd-server                             ClusterIP   10.0.189.223   <none>        80/TCP,443/TCP               40s
service/argocd-server-metrics                     ClusterIP   10.0.252.241   <none>        8083/TCP                     40s

NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-applicationset-controller   1/1     1            1           38s
deployment.apps/argocd-dex-server                  1/1     1            1           38s
deployment.apps/argocd-notifications-controller    1/1     1            1           37s
deployment.apps/argocd-redis                       1/1     1            1           36s
deployment.apps/argocd-repo-server                 1/1     1            1           36s
deployment.apps/argocd-server                      1/1     1            1           36s

NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-applicationset-controller-684cd5f5cc   1         1         1       39s
replicaset.apps/argocd-dex-server-77c55fb54f                  1         1         1       39s
replicaset.apps/argocd-notifications-controller-69cd888b56    1         1         1       38s
replicaset.apps/argocd-redis-55c76cb574                       1         1         1       37s
replicaset.apps/argocd-repo-server-584d45d88f                 1         1         1       37s
replicaset.apps/argocd-server-8667f8577                       1         1         1       37s

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     36s

Argo CD API サーバーにアクセスするための設定

Getting Start を読み進めていくと、Argo CD は、API サーバーというコンポーネントが存在しています。
その API サーバーにアクセスする必要があるため、いくつかの方法が提案されています。

Component Architecture - Argo CD - Declarative GitOps CD for Kubernetes

コンポーネント図を抜粋します。レイヤーが 4 つに分かれていて、それぞれの役割はドキュメントに書いてあります。
(コンポーネント自体は、次の記事に触りながら改めて書きたい気持ち)
Argo CD コンポーネント図

Load Balancer/ Ingress/ Port Forwarding の3種類がありますが、今回は Load Balancer のタイプにします。

% kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
% kubectl get svc -n argocd

External IP が argocd-server に付与されました。

管理者アカウント

管理者アカウントの初期パスワードは自動生成されるようです。これを取得するために以下のコマンドを使用します。
Argo CD の CLI もインストールしておきます。

% brew install argocd
% argocd admin initial-password -n argocd

取得したパスワードを使用してログインします。

% argocd login <argo-server IP>

パスワードをアップデートします。

% argocd account update-password

ではではログインしてみましょう!
ログイン画面が表示される

アプリケーションを作成

ドキュメントを見ると、Argo CD の getstarted 用のアプリが用意されていますが、今回 AKS 用のデプロイアプリを使ってみます。

GitHub - Azure-Samples/aks-store-demo: Sample microservices app for AKS demos, tutorials, and experiments

上記のリポジトリを Fork し、GitHub Codespace などで修正します。

  • argobook のディレクトリの作成
  • argobook/kustomization.yaml ファイルを作成
  • aks-store-quickstart.yaml ファイルを argobook に移動 or コピー
  • 上記ファイルの中に、aks-store-quickstart.yaml を記載

yaml は以下のように記載しました。

resources:
- aks-store-quickstart.yaml

CLI or UI 経由のどちらかが提示されています。今回は CLI 経由でデプロイします。

% kubectl config set-context --current --namespace=argocd

アプリ用に namespace を作成し、そこにデプロイします。

% kubectl create namespace aks-app
% argocd app create aks-app --repo https://github.com/<自分のアカウント>/aks-store-demo.git --path argobook --dest-server https://kubernetes.default.svc --dest-namespace aks-app

アプリケーションの sync (デプロイ)する

Argo CD では、アプリケーションの作成デプロイは別なんですね。
ステータスを確認します。

% argocd app get aks-app
Name:               argocd/aks-app
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          aks-app
URL:                https://XXXXXX/applications/aks-app
Source:
- Repo:             https://github.com/mihohoi0322/aks-store-demo.git
  Target:
  Path:             argobook
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        OutOfSync from  (d5c9479)
Health Status:      Missing
()

ドキュメントを確認すると、このステータスはアプリケーションがまだ展開されておらず、Kubernetes としてのリソースがまだ作成されていない状態のため、OutOfSync となっているようです。
では、アプリケーションを sync(デプロイ)します。

% argocd app sync aks-app

これでデプロイしました!せっかくなので UI を確認します。

ステータスの確認

ステータスが変わっていることが確認できました。
Pod の状態も念のため見てみましょう

% kubectl get pods -n aks-app
NAME                               READY   STATUS    RESTARTS   AGE
order-service-584b7f9747-wpzbb     0/1     Running   0          2m22s
product-service-6b59f857b8-8hpq2   1/1     Running   0          2m22s
rabbitmq-0                         1/1     Running   0          2m22s
store-front-bfb8f484c-82l9l        1/1     Running   0          2m22s

デプロイされた Contoso アプリ
デプロイできてます。

まとめ

アプリケーションのデプロイまで完了できました。次はこれを CD として回したときの動作を確認していきたいと思います!
Argo CD の良さはこの後の CD をまわしてみたときに威力を感じることが出来ると思います。
今のところアイコンがかわいいので気に入っています。

では、良いコンテナーライフを!

GitHubで編集を提案
Microsoft (有志)

Discussion