今回は Argo CD に入門するためにドキュメントに載っている「Getting Started」を試す.任意の Kubernetes クラスターに Argo CD をセットアップして,アプリケーションのデプロイを体験できる.また Argo CD UI を使った画面操作も体験できる.しかし GitOps を実現するには手順が簡単すぎるため,手順を少しカスタマイズしながら進めることにした.
前提
今回は Docker Desktop for Mac "Edge" を使って,以下の Kubernetes 環境で試す.
$ kubectl version --short Client Version: v1.18.6 Server Version: v1.18.6
1. Install Argo CD
最初に Argo CD をセットアップする.リソースとしては Namespace / Service / Deployment / ConfigMap など.今回は GitHub に公開されているマニフェスト install.yaml
を直接適用する.他には Helm で Argo CD Chart を使う選択肢もある.
$ kubectl create namespace argocd $ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml 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-gpg-keys-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
2. Download Argo CD CLI
次に argocd
コマンドをインストールする.今回は Homebrew を使う.
$ brew install argocd $ argocd version --short argocd: v1.7.7+33c93ae.dirty
https://argoproj.github.io/argo-cd/cli_installation/argoproj.github.io
3. Access The Argo CD API Server
デフォルト設定だと Argo CD の API に直接アクセスできないため,以下に載せた選択肢を使って API を公開する.今回は1番簡単な「Port Forwarding」を使う.kubectl port-forward
コマンドを使って https://localhost:8080/
にアクセスできるようにする.
- Service Type Load Balancer
- Ingress
- Port Forwarding
$ kubectl port-forward svc/argocd-server -n argocd 8080:443
4. Login Using The CLI
Argo CD の API にアクセスする場合,事前に認証が必要になる.ユーザー名は admin
で,初期パスワードは Argo CD の Pod 名になっている.kubectl get pods
コマンドで初期パスワードを確認したら argocd login
コマンドで認証をする.さらに argocd account update-password
コマンドを使ってパスワードを更新しておく.
$ kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2 argocd-server-xxxxxxxxxx-yyyyy $ argocd login localhost:8080 WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y Username: admin Password: 'admin' logged in successfully Context 'localhost:8080' updated $ argocd account update-password *** Enter current password: *** Enter new password: *** Confirm new password: Password updated Context 'localhost:8080' updated
5. Register A Cluster To Deploy Apps To (Optional)
Argo CD をセットアップした Kubernetes クラスター以外にアプリケーションをデプロイする場合は argocd cluster add
コマンドを使って登録しておく必要がある.今回は全て Docker Desktop を使っているため,手順としては割愛する.
6. Create An Application From A Git Repository
argocd app create
コマンド or Argo CD UI を使ってアプリケーションを登録する.今回は GitHub に公開されている Argo CD のサンプルアプリ guestbook
を使う.また今回は少しカスタマイズをするために argoproj/argocd-example-apps
リポジトリを kakakakakku/argocd-example-apps
リポジトリとして Fork しておく.
今回は argocd app create
コマンドを使う.
$ argocd app create guestbook --repo https://github.com/kakakakakku/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default application 'guestbook' created
7. Sync (Deploy) The Application
argocd app create
コマンドを使った後に argocd app get
コマンドを使って Sync Status
を確認する.すると OutOfSync
となり,アプリケーションはまだデプロイされていないことがわかる.
$ argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://localhost:8080/applications/guestbook Repo: https://github.com/kakakakakku/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from (6bed858) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui OutOfSync Missing apps Deployment default guestbook-ui OutOfSync Missing
今回は argocd app sync
コマンドを使う.Argo CD は GitHub リポジトリからマニフェストをダウンロードして kubectl
を実行する.結果的に Sync Status
が Synced
になり,アプリケーションのデプロイが完了する.
$ argocd app sync guestbook TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE 2020-10-10T22:00:00+09:00 Service default guestbook-ui OutOfSync Missing 2020-10-10T22:00:00+09:00 apps Deployment default guestbook-ui OutOfSync Missing 2020-10-10T22:00:00+09:00 Service default guestbook-ui Synced Healthy 2020-10-10T22:00:01+09:00 apps Deployment default guestbook-ui OutOfSync Missing deployment.apps/guestbook-ui created 2020-10-10T22:00:01+09:00 Service default guestbook-ui Synced Healthy service/guestbook-ui created 2020-10-10T22:00:01+09:00 apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: default URL: https://localhost:8080/applications/guestbook Repo: https://github.com/kakakakakku/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to (6bed858) Health Status: Progressing Operation: Sync Sync Revision: 6bed858de32a0e876ec49dad1a2e3c5840d3fb07 Phase: Succeeded Start: 2020-10-10 22:00:00 +0900 JST Finished: 2020-10-10 22:00:01 +0900 JST Duration: 1s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service default guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment default guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
今度はデプロイしたアプリケーションを確認するために Argo CD UI にアクセスする.認証情報は「4. Login Using The CLI」と同じ.以下に Argo CD UI のキャプチャを載せておく.特に Deployment / ReplicSet / Pod / Service など,Kubernetes リソースを可視化できる機能は非常に便利だと思う.「Getting Started」の手順としてはここまで.
追加課題 : Deployment の replicas
を 3
に変更する
「Getting Started」をもう少し試していく.現状では Deployment の AVAILABLE
は 1
になっている.
$ kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE guestbook-ui 1/1 1 1 10m
そこで guestbook/guestbook-ui-deployment.yaml
を修正して replicas
を 3
にする.
apiVersion: apps/v1 kind: Deployment metadata: name: guestbook-ui spec: replicas: 3 (中略)
「7. Sync (Deploy) The Application」と同じように argocd app sync
コマンドを実行するのではなく,push をトリガーにして自動的にデプロイをしたくなる.デフォルトだと Sync Policy
が <none>
になっているため,argocd app set
コマンドを使って Sync Policy
を Automated
に変更する.
$ argocd app get guestbook | egrep '^Sync ' Sync Policy: <none> Sync Status: Synced to (6ad30c5) $ argocd app set guestbook --sync-policy automated $ argocd app get guestbook | egrep '^Sync ' Sync Policy: Automated Sync Status: Synced to (6ad30c5)
少し待つと Deployment の AVAILABLE
が 3
になった.
$ kubectl get deployments.apps NAME READY UP-TO-DATE AVAILABLE AGE guestbook-ui 3/3 3 3 35m
Argo CD UI でも変更を確認できた.
リソース削除
手順には載っていなかったけど,最後にリソースを削除しておく.
$ argocd app delete guestbook $ kubectl delete -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml $ kubectl delete namespace argocd
まとめ
GitOps を実現するツールとして,過去に Flux を試した.今回は最近よく聞く Argo CD に入門した.ドキュメントに載っている「Getting Started」を使えば Argo CD の基礎を学べる.実際に試すと簡単すぎるため,GitHub リポジトリを Fork して,少しカスタマイズすると良いと思う.Argo CD には他にもまだ機能があるため,引き続き試していく!