kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Argo CD に入門するために「Getting Started」をカスタマイズしながら試した

今回は Argo CD に入門するためにドキュメントに載っている「Getting Started」を試す.任意の Kubernetes クラスターに Argo CD をセットアップして,アプリケーションのデプロイを体験できる.また Argo CD UI を使った画面操作も体験できる.しかし GitOps を実現するには手順が簡単すぎるため,手順を少しカスタマイズしながら進めることにした.

argoproj.github.io

f:id:kakku22:20201012145956p:plain
GitHub - argoproj/argo-cd: Declarative continuous deployment for Kubernetes. より引用

前提

今回は 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 を直接適用する.他には HelmArgo 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

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 しておく.

github.com

今回は 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 StatusSynced になり,アプリケーションのデプロイが完了する.

$ 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」の手順としてはここまで.

f:id:kakku22:20201012153307p:plain
Argo CD UI : ログイン画面

f:id:kakku22:20201012153356p:plain
Argo CD UI : トップ画面

f:id:kakku22:20201012153800p:plain
Argo CD UI : アプリケーション詳細画面

追加課題 : Deployment の replicas3 に変更する

「Getting Started」をもう少し試していく.現状では DeploymentAVAILABLE1 になっている.

$ kubectl get deployments.apps
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
guestbook-ui   1/1     1            1           10m

そこで guestbook/guestbook-ui-deployment.yaml を修正して replicas3 にする.

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 PolicyAutomated に変更する.

argoproj.github.io

$ 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)

少し待つと DeploymentAVAILABLE3 になった.

$ kubectl get deployments.apps
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
guestbook-ui   3/3     3            3           35m

Argo CD UI でも変更を確認できた.

f:id:kakku22:20201012154013p:plain
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 には他にもまだ機能があるため,引き続き試していく!

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com