EKSでArgo CDを試す

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等に追加する。MacBash 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のyamldefault 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でログインする。

f:id:sotoiwa:20200525184119p:plain

「SYNC」ボタンを押して

f:id:sotoiwa:20200525184135p:plain

右からメニューが出てくるので、「SYNCHRONIZE」を押す。

f:id:sotoiwa:20200525184149p:plain

アプリをクリックすると詳細が表示される。UIもかっこいい。

f:id:sotoiwa:20200525184201p:plain

DeploymentのyamlでNamespacesの指定を削除してcommitしてpushする。

またOutOfSync状態になるので、アプリの画面から「SYNC」を押す。変更がリアルタイムに表示されていくのがかっこいい。

f:id:sotoiwa:20200525184216p:plain

削除はされないようだ。削除に関する挙動は確認が必要。

クリーンアップ

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