EKSでArgo CDを試してみたメモ。eksworkshop.comの手順に沿って実施。
参考リンク
手順
eksworkshop.comの手順通り実施する。
クラスターの作成
eksctl
でクラスターを作成する。
eksctl create cluster --name=argocd --nodes=3 --managed --ssh-access --ssh-public-key=sotosugi
Argo CDのデプロイ
Argo CDをデプロイするためのNamespaceを作成する。
kubectl create namespace argocd
Argo CDをデプロイするする。
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
CRDをはじめいろいろ作られる。
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created customresourcedefinition.apiextensions.k8s.io/appprojects.argoproj.io created serviceaccount/argocd-application-controller created serviceaccount/argocd-dex-server created serviceaccount/argocd-server created role.rbac.authorization.k8s.io/argocd-application-controller created role.rbac.authorization.k8s.io/argocd-dex-server 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-dex-server 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-rbac-cm created configmap/argocd-ssh-known-hosts-cm created configmap/argocd-tls-certs-cm created secret/argocd-secret created service/argocd-dex-server created service/argocd-metrics created service/argocd-redis created service/argocd-repo-server created service/argocd-server-metrics created service/argocd-server created deployment.apps/argocd-application-controller created deployment.apps/argocd-dex-server created deployment.apps/argocd-redis created deployment.apps/argocd-repo-server created deployment.apps/argocd-server created
Argo CD CLIをインストールする。Macの場合はbrewで入れられる。
brew tap argoproj/tap brew install argoproj/tap/argocd
CLIで補完を聞かせるには以下を.bashrc
等に追加する。MacのBash 3ではeksctlのこのIssueにあるように少し変わった書き方が必要。
source /dev/stdin <<<"$(argocd completion bash)"
argocd-server
ServiceのTypeをClusterIP
からLoadBalancer
に変えて外部公開する。これは必須ではなくport-forwardでもよいはず。
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}' ARGOCD_SERVER=`kubectl get svc argocd-server -n argocd -o json | jq --raw-output .status.loadBalancer.ingress[0].hostname`
初期パスワードはPod名なので、Pod名を取得する。
ARGO_PWD=`kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2`
CLIでのアプリケーションのデプロイ
CLIでログインする。
argocd login $ARGOCD_SERVER --username admin --password $ARGO_PWD --insecure
サンプルリポジトリをフォークする。
フォークしたリポジトリをクローンする。
git clone git@github.com:sotoiwa/ecsdemo-nodejs.git
CLIでクラスターを追加する。このステップはマルチクラスター対応する場合に必要で、Argo CDをデプロイしたクラスターの場合は不要であり、今回は不要と思われる。このときkube-system
Namespacesにargocd-manager
というServiceAccountが作られる。
$ CONTEXT_NAME=`kubectl config view -o jsonpath='{.contexts[].name}'` $ argocd cluster add $CONTEXT_NAME INFO[0000] ServiceAccount "argocd-manager" created in namespace "kube-system" INFO[0000] ClusterRole "argocd-manager-role" created INFO[0000] ClusterRoleBinding "argocd-manager-role-binding" created Cluster 'https://4022BA037A433E970884618C153C8187.gr7.ap-northeast-1.eks.amazonaws.com' added
クラスターを確認する。これはつまりはArgo CDのPodからみたKubernetesクラスターのAPI Serverエンドポイント。
$ argocd cluster list SERVER NAME VERSION STATUS MESSAGE https://4022BA037A433E970884618C153C8187.gr7.ap-northeast-1.eks.amazonaws.com sotosugi@argocd.ap-northeast-1.eksctl.io 1.15+ Successful https://kubernetes.default.svc
アプリケーションを作成する。
kubectl create namespace ecsdemo-nodejs argocd app create ecsdemo-nodejs \ --repo https://github.com/sotoiwa/ecsdemo-nodejs.git \ --path kubernetes \ --dest-server https://kubernetes.default.svc \ --dest-namespace ecsdemo-nodejs
アプリケーションを確認する。
$ argocd app get ecsdemo-nodejs Name: ecsdemo-nodejs Project: default Server: https://kubernetes.default.svc Namespace: ecsdemo-nodejs URL: https://ac26d3f0dcbe7481db5b63dd5dfb2b49-404223688.ap-northeast-1.elb.amazonaws.com/applications/ecsdemo-nodejs Repo: https://github.com/sotoiwa/ecsdemo-nodejs.git Target: Path: kubernetes SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from (219f52d) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service ecsdemo-nodejs ecsdemo-nodejs OutOfSync Missing apps Deployment default ecsdemo-nodejs OutOfSync Missing
OutOfSync状態なので、Syncを行う。認証を設定していないが、Publicなリポジトリだからと思われる。
$ argocd app sync ecsdemo-nodejs TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE 2020-05-25T17:42:53+09:00 Service ecsdemo-nodejs ecsdemo-nodejs OutOfSync Missing 2020-05-25T17:42:53+09:00 apps Deployment default ecsdemo-nodejs OutOfSync Missing 2020-05-25T17:42:53+09:00 Service ecsdemo-nodejs ecsdemo-nodejs Synced Healthy 2020-05-25T17:42:53+09:00 Service ecsdemo-nodejs ecsdemo-nodejs Synced Healthy service/ecsdemo-nodejs created 2020-05-25T17:42:53+09:00 apps Deployment default ecsdemo-nodejs OutOfSync Missing deployment.apps/ecsdemo-nodejs created 2020-05-25T17:42:53+09:00 apps Deployment default ecsdemo-nodejs Synced Progressing deployment.apps/ecsdemo-nodejs created Name: ecsdemo-nodejs Project: default Server: https://kubernetes.default.svc Namespace: ecsdemo-nodejs URL: https://ac26d3f0dcbe7481db5b63dd5dfb2b49-404223688.ap-northeast-1.elb.amazonaws.com/applications/ecsdemo-nodejs Repo: https://github.com/sotoiwa/ecsdemo-nodejs.git Target: Path: kubernetes SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to (219f52d) Health Status: Progressing Operation: Sync Sync Revision: 219f52df60800458d2ac2f30742459a6a174b834 Phase: Succeeded Start: 2020-05-25 17:42:53 +0900 JST Finished: 2020-05-25 17:42:53 +0900 JST Duration: 0s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service ecsdemo-nodejs ecsdemo-nodejs Synced Healthy service/ecsdemo-nodejs created apps Deployment default ecsdemo-nodejs Synced Progressing deployment.apps/ecsdemo-nodejs created
アプリケーションを確認する。Deploymentのyamlにdefault
Namespacesが指定されているので、Deploymentはdefault
Namespaceにできてしまっている。
$ kubectl get deploy -n default NAME READY UP-TO-DATE AVAILABLE AGE ecsdemo-nodejs 1/1 1 1 5m28s $ kubectl get service -n default NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 3h22m
ecsdemo-nodejs/kubernetes/deployment.yaml
を開いてレプリカ数を2
に変更してcommitしてpushする。
しばらくするとOutOfSync
となった。
$ argocd app get ecsdemo-nodejs Name: ecsdemo-nodejs Project: default Server: https://kubernetes.default.svc Namespace: ecsdemo-nodejs URL: https://ac26d3f0dcbe7481db5b63dd5dfb2b49-404223688.ap-northeast-1.elb.amazonaws.com/applications/ecsdemo-nodejs Repo: https://github.com/sotoiwa/ecsdemo-nodejs.git Target: Path: kubernetes SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from (081cce9) Health Status: Healthy GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service ecsdemo-nodejs ecsdemo-nodejs Synced Healthy service/ecsdemo-nodejs created apps Deployment default ecsdemo-nodejs OutOfSync Healthy deployment.apps/ecsdemo-nodejs created
Argo CDのCRDが2つあり、default
プロジェクトにecsdemo-nodejs
アプリケーションが作られたということのようだ。
$ kubectl get appprojects -A NAMESPACE NAME AGE argocd default 3h29m $ kubectl get application -A NAMESPACE NAME AGE argocd ecsdemo-nodejs 29m
WebUIでのSync
$ARGOCD_SERVER
からWebUIにアクセスし、admin
と$ARGO_PWD
でログインする。
「SYNC」ボタンを押して
右からメニューが出てくるので、「SYNCHRONIZE」を押す。
アプリをクリックすると詳細が表示される。UIもかっこいい。
DeploymentのyamlでNamespacesの指定を削除してcommitしてpushする。
またOutOfSync状態になるので、アプリの画面から「SYNC」を押す。変更がリアルタイムに表示されていくのがかっこいい。
削除はされないようだ。削除に関する挙動は確認が必要。
クリーンアップ
Argo CDのアプリケーション定義を削除する。
argocd app delete ecsdemo-nodejs watch argocd app get ecsdemo-nodejs
Argo CDを削除する。
kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectl delete ns argocd
デプロイ済みのアプリケーションをNamespaceごと削除する。
kubectl delete ns ecsdemo-nodejs