Argo CDのGetting Startedをシェルスクリプト化した
1. はじめに
Argo CD公式ドキュメントに記載されているGetting Startedの内容をシェルスクリプト化し、Argo CDをインストール&初期設定してマニフェストを適用する部分を自動化しました。
2. なぜシェルスクリプト化したのか?
私はできるだけ本番運用に近い形でKubernetesと戯れたいと思い、勉強の都度、EKSクラスターを立ててArgo CDをインストールしています。Argo CDのインストールとその設定自体は大した作業ではないのですが、毎回やるのも面倒だなと思い、1コマンドで実現できるようにシェルスクリプト化しました!
ちなみに、もっと面倒なEKSクラスター(EKS on EC2の構成)を構築する部分のIaC化(CDK for Go)については、こちらの記事にまとめていますので興味があればご参照ください^^
3. シェルスクリプト
シェルスクリプトの全体は以下のようになっています。
(実行ログをわかりやすくする工夫をしていますが、完璧に作り込んでいるわけではありませんので、その点はご容赦ください😉)
#!/usr/bin/env bash
# 1. kubeconfigを更新する
aws eks update-kubeconfig --region your-aws-region --name your-cluster-name --profile your-profile
echo -e "\n"
# 2. Argo CDをインストールする
ns_argocd=`kubectl get ns -o json | jq -r '.items[] | .metadata.name' | grep argocd`
if [ -z "$ns_argocd" ]; then
kubectl create namespace argocd
else
echo -e "Namespace of argocd already exists\n"
fi
svc_argocd=`kubectl get svc -n argocd -o json | jq -r '.items[] | .metadata.name' | grep argocd-applicationset-controller`
if [ -z "$svc_argocd" ]; then
echo -e "Start to apply ArgoCD manifest.\n"
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
echo -e "\nApplying ArgoCD manifest"
count=0
while [ -z "$svc_argocd" ]; do
count=`expr $count + 1`
if [ $count -gt 10 ]; then
echo -e "Timed out to apply ArgoCD manifest\n"
break
fi
echo -n "."
sleep 1
svc_argocd=`kubectl get svc -n argocd -o json | jq -r '.items[] | .metadata.name' | grep argocd-applicationset-controller`
done
echo -e "\nSuccessfully applied ArgoCD manifest\n"
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
echo -e "Successfully changed ArgoCD server to LoadBalancer type\n"
else
echo -e "ArgoCD manifest has already been applied\n"
fi
# 3. Argo CDのドメインを取得する
external_ip=`kubectl get svc argocd-server -n argocd -o json 2>/dev/null | jq -r '.status.loadBalancer.ingress[].hostname' 2>/dev/null`
if [[ -z $external_ip ]]; then
echo -e "\nWaiting to start argocd-server"
count=0
while [[ -z $external_ip ]]; do
count=`expr $count + 1`
if [ $count -gt 10 ]; then
echo -e "Timed out waiting for argocd-server to start"
break
fi
echo -n "."
sleep 1
external_ip=`kubectl get svc argocd-server -n argocd -o json 2>/dev/null | jq -r '.status.loadBalancer.ingress[].hostname' 2>/dev/null`
done
fi
echo -e "\n"
# 4. Argo CDの初期ユーザー名を設定する
initial_user="admin"
# 5. adminユーザーの初期パスワードを取得する
initial_password=`kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" 2>/dev/null | base64 -d; echo`
if [[ -z $initial_password ]]; then
echo -e "\nWaiting to start secret/argocd-initial-admin-secret"
count=0
while [[ -z $initial_password ]]; do
count=`expr $count + 1`
if [ $count -gt 20 ]; then
echo -e "Timed out waiting for secret/argocd-initial-admin-secret to start"
break
fi
echo -n "."
sleep 1
initial_password=`kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" 2>/dev/null | base64 -d; echo`
done
fi
# 6. Argo CDへログインする
if [ -n "$initial_password" ]; then
echo -e "\nLogin to Argo CD"
accessable_to_argocd=`nslookup -type=ns $external_ip | grep "Authoritative answers can be found from"`
count=0
while [ -z "$accessable_to_argocd" ]; do
count=`expr $count + 1`
if [ $count -gt 90 ]; then
echo -e "Timed out to login to Argo CD"
break
fi
echo -n "."
sleep 1
accessable_to_argocd=`nslookup -type=ns $external_ip | grep "Authoritative answers can be found from"`
done
argocd login "$external_ip" --username admin --password "$initial_password" --insecure
# 7. adminユーザーの初期パスワードを更新する
new_password=`openssl rand -base64 6`
echo -e "\nChange your login password to $new_password"
argocd account update-password --account admin --current-password "$initial_password" --new-password "$new_password" --insecure
echo -e "\n"
# 8. 初期パスワードを格納していたSecretリソースを削除する
kubectl --namespace argocd delete secret/argocd-initial-admin-secret
echo -e "\n"
else
:
fi
# 9. Argo CDのドメイン・ユーザー名・パスワードを表示する
echo "*********************************************************************************************"
echo "External IP : $external_ip"
echo "Initial User : $initial_user"
echo "Initial Password : $initial_password"
echo "New Password : $new_password"
echo "*********************************************************************************************"
echo -e "\n"
# 10. アプリケーションをデプロイする
kubectl apply -f ./your_application.yaml
4. ちょっと解説
シェルスクリプトのコメントに振っている番号順に概要を説明していきます。
4-1. kubeconfigを更新する
AWS CLI update-kubeconfig
コマンドでkubeconfigを更新しています。your-aws-region
とyour-cluster-name
とyour-profile
はご自身の値に書き換えてください。
4-2. Argo CDをインストールする
まず、argocd
というネームスペースがまだ存在しない場合は作成します。次に、argocd-applicationset-controller
というServiceリソースが存在していなければ(=まだArgo CDがインストールされていなければ)、Argo CDをインストールします。そして、argocd-server
というServiceリソースをLoadBalancer
タイプに変更し、外部アクセスを可能とします。
4-3. Argo CDのドメインを取得する
Argo CDをインストールしてからargocd-server
が起動するまでに多少時間がかかるので、ここでは、1秒ごとに最大10秒までArgo CDドメインの取得を試みています。コマンドの後ろに2>/dev/null
を追加しているのは、標準エラーの内容を破棄して実行ログの見栄えを良くするためです。ループの中で標準エラーが出力されるのは鬱陶しいですので^^
4-4. Argo CDの初期ユーザー名を設定する
adminとしてログインするので、ここでは代入しているだけですね。
4-5. adminユーザーの初期パスワードを取得する
adminユーザーの初期パスワードはargocd-initial-admin-secret
というSecretリソースの中に記録されているので、この値を取得しています。ここでも、argocd-initial-admin-secret
が起動するのに時間がかかるので、1秒ごとに最大20秒まで初期パスワードの取得を試みています。
4-6. Argo CDへログインする
adminユーザーの初期パスワードが存在する場合はArgo CDへログインします。このスクリプトの最後で初期パスワードを格納しているSecretを削除するので、初期パスワードが存在するということはこのスクリプトの実行は初めてということになるからです。ここでも、Argo CDのDNSが起動するまでに時間がかかるためArgo CDのドメインが有効になるのを1秒ごとに確認し、有効になった後でログインを試みています。
4-7. adminユーザーの初期パスワードを更新する
openssl
コマンドを利用してランダムな文字列を生成し、パスワードをこれに置き換えています。
4-8. 初期パスワードを格納していたSecretリソースを削除する
パスワードを更新したため、初期パスワードを格納していたargocd-initial-admin-secret
が不要になり、これを削除しています。
4-9. Argo CDのドメイン・ユーザー名・パスワードを表示する
以上で取得したドメイン・ユーザー名・パスワードをわかりやすく表示しています。
4-10. アプリケーションをデプロイする
最後に、アプリケーションをデプロイして完了です🎉
5. シェルスクリプトの実行結果
上述のスクリプトを実行した結果をサンプルとして貼っておきます。
myname%@mynamenoMacBook-Air ~/mypath
→ argocd/bootstrap/init.sh
Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/myuser:
Updated context arn:aws:eks:my-region:xxxxxxxxxxxx:cluster/my-cluster-name in /Users/myname/.kube/config
namespace/argocd created
Start to apply ArgoCD manifest.
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created
serviceaccount/argocd-application-controller created
serviceaccount/argocd-applicationset-controller created
serviceaccount/argocd-dex-server created
serviceaccount/argocd-notifications-controller created
serviceaccount/argocd-redis created
serviceaccount/argocd-repo-server created
serviceaccount/argocd-server created
role.rbac.authorization.k8s.io/argocd-application-controller created
role.rbac.authorization.k8s.io/argocd-applicationset-controller created
role.rbac.authorization.k8s.io/argocd-dex-server created
role.rbac.authorization.k8s.io/argocd-notifications-controller created
role.rbac.authorization.k8s.io/argocd-server created
clusterrole.rbac.authorization.k8s.io/argocd-application-controller created
clusterrole.rbac.authorization.k8s.io/argocd-server created
rolebinding.rbac.authorization.k8s.io/argocd-application-controller created
rolebinding.rbac.authorization.k8s.io/argocd-applicationset-controller created
rolebinding.rbac.authorization.k8s.io/argocd-dex-server created
rolebinding.rbac.authorization.k8s.io/argocd-notifications-controller created
rolebinding.rbac.authorization.k8s.io/argocd-redis created
rolebinding.rbac.authorization.k8s.io/argocd-server created
clusterrolebinding.rbac.authorization.k8s.io/argocd-application-controller created
clusterrolebinding.rbac.authorization.k8s.io/argocd-server created
configmap/argocd-cm created
configmap/argocd-cmd-params-cm created
configmap/argocd-gpg-keys-cm created
configmap/argocd-notifications-cm created
configmap/argocd-rbac-cm created
configmap/argocd-ssh-known-hosts-cm created
configmap/argocd-tls-certs-cm created
secret/argocd-notifications-secret created
secret/argocd-secret created
service/argocd-applicationset-controller created
service/argocd-dex-server created
service/argocd-metrics created
service/argocd-notifications-controller-metrics created
service/argocd-redis created
service/argocd-repo-server created
service/argocd-server created
service/argocd-server-metrics created
deployment.apps/argocd-applicationset-controller created
deployment.apps/argocd-dex-server created
deployment.apps/argocd-notifications-controller created
deployment.apps/argocd-redis created
deployment.apps/argocd-repo-server created
deployment.apps/argocd-server created
statefulset.apps/argocd-application-controller created
networkpolicy.networking.k8s.io/argocd-application-controller-network-policy created
networkpolicy.networking.k8s.io/argocd-dex-server-network-policy created
networkpolicy.networking.k8s.io/argocd-redis-network-policy created
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
Applying ArgoCD manifest
.
Successfully applied ArgoCD manifest
service/argocd-server patched
Successfully changed ArgoCD server to LoadBalancer type
Waiting to start argocd-server
..
Waiting to start secret/argocd-initial-admin-secret
.....
Login to Argo CD
.....................................................'admin:login' logged in successfully
Context 'a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com' updated
Change your login password to M2d6DseQ
Password updated
Context 'a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com' updated
secret "argocd-initial-admin-secret" deleted
*********************************************************************************************
External IP : a6854b4f776f1437fb1c32d966c566b3-1676847073.my-region.elb.amazonaws.com
Initial User : admin
Initial Password : kwKK6Pu33Cd1lMB1
New Password : M2d6DseQ
*********************************************************************************************
application.argoproj.io/myapplication created
6. まとめ
本記事では、Argo CD公式ドキュメントに記載されているGetting Startedの内容をシェルスクリプト化しました。Kubernetes環境を勉強の都度構築している方々にとっては、環境構築の効率が上がってちょっと便利になるかもです。
Discussion