Amazon EKSでArgo CDの検証環境を作成したいときはEKS Blueprints for Terraformが便利
Amazon EKS上にArgo CDの検証環境を作りたいときは、何を使っていますか?
最近環境を作る機会があって、EKS Blueprints for Terraformを使ったらとても楽だったので紹介します。
EKS BluePrints for Terraform
EKS BluePrints for TerraformはAmazon EKSのTerraformによる実装パターン集です。
概要は以下の記事がまとまっているので、ご確認ください。
今回ご紹介するArgo CDの他にも、KarpenterやIstio等の様々な実装パターンが公開されています。
Argo CDのパターン
現在公開されているのは以下です。
マルチクラスターパターンも公開されている点が個人的には嬉しいポイントでした。
Amazon EKSでArgo CDを使う際は、Amazon EKSクラスターにArgo CDをインストールして利用するのですが、外部のAmazon EKSクラスターを登録することもできます。
外部クラスター登録の検証をする際には、最低2台k8sクラスターが必要になります。
マルチクラスターパターンのブループリントでは、Argo CDがインストールされるAmazon EKSクラスター(hub)とワークロード用のAmazon EKSクラスター(spoke prd/stg/devの3台)が作成されます。
Amazon EKSクラスターの数が増えるため手動でやると手間なんですが、このBlueprintsを使うことで簡単に構築できます。
Argo CDのマルチクラスターパターンをspoke1台構成でやってみる
手順を参考に実際にマルチクラスターパターンでやってみます。
手順通りにやると合計4台のAmazon EKSクラスターが作成されます。
コストが気になるので、spoke 1台構成でやってみます。
準備
手順の実行には以下のツールが必要です。インストールしておきます。
- git
- terraform
- kubectl
- argocd
リポジトリをクローンします。
git clone git@github.com:aws-ia/terraform-aws-eks-blueprints.git
hub用のAmazon EKSクラスターをデプロイ
hub用(Argo CD)のAmazon EKSクラスターをデプロイします。
デフォルトでは、すべてのリソースがus-west-2
に作成されます。
us-west-2
を利用できない環境で実行する場合は、variables.tf
のregion
のデフォルト値を書き換えるか*.tfvars
を用意して、上書きする等の対応をしてください。
cd terraform-aws-eks-blueprints/patterns/gitops/multi-cluster-hub-spoke-argocd/hub
# AWS認証情報をセット
export AWS_ACCESS_KEY_ID=<AWSアクセスキーID>
export AWS_SECRET_ACCESS_KEY=<AWSシークレットアクセスキー>
export AWS_SESSION_TOKEN=<AWSセッショントークン>
# Terraform実行
terraform init
terraform apply -target="module.vpc" -auto-approve
terraform apply -target="module.eks" -auto-approve
terraform apply -auto-approve
Applyが 完了すると、Amazon EKSクラスターが作成されていることを確認できます。(Apply完了までは10分程度かかります)
kubectlで作成したAmazon EKSクラスターを操作できるようにするためにkubconfigを更新します。
必要な情報はterraform output
で確認できます。
terraform output -raw configure_kubectl
# 出力結果をコンソールで実行する
export KUBECONFIG="/tmp/hup-spoke"
aws eks --region us-west-2 update-kubeconfig --name hub-control-plane --alias hub
Argo CD用のリソースがAmazon EKSクラスター上にデプロイされていることが確認できます。
kubectl --context hub get all -n argocd
出力例
NAME READY STATUS RESTARTS AGE
pod/argo-cd-argocd-application-controller-0 1/1 Running 0 2m26s
pod/argo-cd-argocd-applicationset-controller-579c649bb9-tcwwn 1/1 Running 0 2m27s
pod/argo-cd-argocd-dex-server-5896478fbf-jfkwh 1/1 Running 0 2m27s
pod/argo-cd-argocd-notifications-controller-74fb7466f6-pjkl8 1/1 Running 0 2m26s
pod/argo-cd-argocd-redis-69dd89b5bd-h2fbk 1/1 Running 0 2m27s
pod/argo-cd-argocd-repo-server-74cd459bc9-phdpg 1/1 Running 0 2m27s
pod/argo-cd-argocd-server-6d9549674b-7dn7m 1/1 Running 0 2m27s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argo-cd-argocd-application-controller-metrics ClusterIP 172.20.102.64 <none> 8082/TCP 2m27s
service/argo-cd-argocd-applicationset-controller ClusterIP 172.20.56.138 <none> 7000/TCP 3m20s
service/argo-cd-argocd-applicationset-controller-metrics ClusterIP 172.20.69.202 <none> 8080/TCP 2m27s
service/argo-cd-argocd-dex-server ClusterIP 172.20.77.216 <none> 5556/TCP,5557/TCP 3m20s
service/argo-cd-argocd-redis ClusterIP 172.20.24.218 <none> 6379/TCP 3m20s
service/argo-cd-argocd-repo-server ClusterIP 172.20.189.152 <none> 8081/TCP 3m20s
service/argo-cd-argocd-repo-server-metrics ClusterIP 172.20.195.6 <none> 8084/TCP 2m27s
service/argo-cd-argocd-server LoadBalancer 172.20.164.115 a434cafd70f7f41399839f825736b8ad-29127262.ap-northeast-1.elb.amazonaws.com 80:31111/TCP,443:31936/TCP 3m20s
service/argo-cd-argocd-server-metrics ClusterIP 172.20.167.246 <none> 8083/TCP 2m27s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argo-cd-argocd-applicationset-controller 1/1 1 1 3m20s
deployment.apps/argo-cd-argocd-dex-server 1/1 1 1 3m20s
deployment.apps/argo-cd-argocd-notifications-controller 1/1 1 1 3m20s
deployment.apps/argo-cd-argocd-redis 1/1 1 1 3m20s
deployment.apps/argo-cd-argocd-repo-server 1/1 1 1 3m20s
deployment.apps/argo-cd-argocd-server 1/1 1 1 3m20s
NAME DESIRED CURRENT READY AGE
replicaset.apps/argo-cd-argocd-applicationset-controller-579c649bb9 1 1 1 2m27s
replicaset.apps/argo-cd-argocd-applicationset-controller-5db688844c 0 0 0 3m20s
replicaset.apps/argo-cd-argocd-dex-server-5896478fbf 1 1 1 2m27s
replicaset.apps/argo-cd-argocd-dex-server-cd48d7bc 0 0 0 3m20s
replicaset.apps/argo-cd-argocd-notifications-controller-74fb7466f6 1 1 1 2m26s
replicaset.apps/argo-cd-argocd-notifications-controller-7d7ccc6b9d 0 0 0 3m20s
replicaset.apps/argo-cd-argocd-redis-69dd89b5bd 1 1 1 2m27s
replicaset.apps/argo-cd-argocd-redis-7f89c69877 0 0 0 3m20s
replicaset.apps/argo-cd-argocd-repo-server-74cd459bc9 1 1 1 2m27s
replicaset.apps/argo-cd-argocd-repo-server-85f99fd4dd 0 0 0 3m20s
replicaset.apps/argo-cd-argocd-server-6d9549674b 1 1 1 2m27s
replicaset.apps/argo-cd-argocd-server-bc55fb96 0 0 0 3m20s
NAME READY AGE
statefulset.apps/argo-cd-argocd-application-controller 1/1 3m20s
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horizontalpodautoscaler.autoscaling/argo-cd-argocd-repo-server Deployment/argo-cd-argocd-repo-server 13%/50%, 3%/50% 1 5 1 2m27s
horizontalpodautoscaler.autoscaling/argo-cd-argocd-server Deployment/argo-cd-argocd-server 10%/50%, 2%/50% 1 5 1 2m27s
Argo CDにログインしてみます。以下のコマンドで、ログイン情報が確認できます。(Ingressで構成されていてALB経由でログインできます)
terraform output -raw access_argocd
echo "ArgoCD Username: admin"
echo "ArgoCD Password: $(kubectl --context hub get secrets argocd-initial-admin-secret -n argocd --template="{{index .data.password | base64decode}}")"
echo "ArgoCD URL: https://$(kubectl --context hub get svc -n argocd argo-cd-argocd-server -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')"
出力例
ArgoCD Username: admin
ArgoCD Password: <password>
ArgoCD URL: https://<ELBエンドポイント>
spoke用のAmazon EKSクラスターをデプロイ
spoke用(ワークロード)のAmazon EKSクラスターをデプロイします。
今回は1台だけ作成します。dev用のAmazon EKSクラスターを作成します。
cd ../spokes
./deploy.sh dev
deploy.sh
はterraform workspaceの切り替えやapplyをラップしたスクリプトです。
スクリプトの実行が完了すると、Amazon EKSクラスターが作成されていることを確認できます。
Argo CDを見てみると、作成したAmazon EKSクラスターspoke-dev
が登録されていることがわかります。
Applicationも登録されています。
これで環境の用意ができました。
後片付け
使い終わったら、リソースを削除します。
destroy.sh
を実行することで、terraform destroy
が行われリソースが削除されます。
# spoke側の削除
./destroy.sh dev
# hub側の削除
cd ../hub
./destroy.sh
おわりに
Argo CD外部クラスターの登録周りの検証で、環境用意が必要なことがありました。
Blueprintsを使えばほぼTerraform実行だけで済むので、かなり時間短縮できました。
他にも色々便利なパターンがありそうなので、時間を見つけて見ていこうと思います。
以上、AWS事業本部の佐藤(@chari7311)でした。