AKS に Argo CD を構築してデプロイする
ごきげんよう!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 つに分かれていて、それぞれの役割はドキュメントに書いてあります。
(コンポーネント自体は、次の記事に触りながら改めて書きたい気持ち)
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 用のデプロイアプリを使ってみます。
上記のリポジトリを 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
デプロイできてます。
まとめ
アプリケーションのデプロイまで完了できました。次はこれを CD として回したときの動作を確認していきたいと思います!
Argo CD の良さはこの後の CD をまわしてみたときに威力を感じることが出来ると思います。
今のところアイコンがかわいいので気に入っています。
では、良いコンテナーライフを!
Discussion