GitOpsについては以下の記事の後半で触れました。
GitOpsツールは様々ありますが、今回はいくつかある中でArgo CDについて取り上げようと思います。
Kubernetesのセットアップ
まず初めにAlgo CDを実行するためのKubernetesクラスターを用意します。 今回はMicroK8sを使ってクラスターを作成しています。
$ sudo snap install microk8s --classic --channel=1.22/stable $ sudo microk8s enable dns rbac $ sudo snap alias microk8s.kubectl kubectl
K8sのセットアップが終わったら、次にAlgo CDを動かします。
インストール
Algo CDは次のように実行すると最新のバージョンをセットアップできます。 まずはじめに、Algo CD用のNamespaceを作成します。
% kubectl create namespace argocd
次に用意されているマニフェストファイルを使って、クラスターにデプロイします。
% kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
各サービスの稼働状況を確認
デプロイ中のサービスの稼働状況は次のように確認できます。READYが1になることを確認します。
% kubectl get all -n argocd NAME READY STATUS RESTARTS AGE pod/argocd-applicationset-controller-66689cbf4b-chtnh 1/1 Running 0 3m23s pod/argocd-notifications-controller-77866c485-btgx5 1/1 Running 0 3m23s pod/argocd-redis-d486999b7-cv7hx 1/1 Running 0 3m22s pod/argocd-server-66fff94644-5x8dz 1/1 Running 0 3m21s pod/argocd-application-controller-0 1/1 Running 0 3m20s pod/argocd-dex-server-7b896cc4f6-5hrqw 1/1 Running 0 3m23s pod/argocd-repo-server-bfd68b66f-cp7g6 1/1 Running 0 3m22s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/argocd-applicationset-controller ClusterIP 10.152.183.213 <none> 7000/TCP 3m25s service/argocd-dex-server ClusterIP 10.152.183.56 <none> 5556/TCP,5557/TCP,5558/TCP 3m25s service/argocd-metrics ClusterIP 10.152.183.207 <none> 8082/TCP 3m24s service/argocd-notifications-controller-metrics ClusterIP 10.152.183.180 <none> 9001/TCP 3m24s service/argocd-redis ClusterIP 10.152.183.130 <none> 6379/TCP 3m24s service/argocd-repo-server ClusterIP 10.152.183.96 <none> 8081/TCP,8084/TCP 3m24s service/argocd-server ClusterIP 10.152.183.222 <none> 80/TCP,443/TCP 3m24s service/argocd-server-metrics ClusterIP 10.152.183.159 <none> 8083/TCP 3m24s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/argocd-applicationset-controller 1/1 1 1 3m24s deployment.apps/argocd-notifications-controller 1/1 1 1 3m23s deployment.apps/argocd-redis 1/1 1 1 3m23s deployment.apps/argocd-server 1/1 1 1 3m22s deployment.apps/argocd-dex-server 1/1 1 1 3m23s deployment.apps/argocd-repo-server 1/1 1 1 3m23s NAME DESIRED CURRENT READY AGE replicaset.apps/argocd-applicationset-controller-66689cbf4b 1 1 1 3m23s replicaset.apps/argocd-notifications-controller-77866c485 1 1 1 3m23s replicaset.apps/argocd-redis-d486999b7 1 1 1 3m23s replicaset.apps/argocd-server-66fff94644 1 1 1 3m22s replicaset.apps/argocd-dex-server-7b896cc4f6 1 1 1 3m23s replicaset.apps/argocd-repo-server-bfd68b66f 1 1 1 3m22s NAME READY AGE statefulset.apps/argocd-application-controller 1/1 3m22s % kubectl get -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
サービスの公開
デフォルトでは、Argo CD APIサーバーは外部IPで公開されていません。APIサーバーにアクセスするため、今回はNodePortを使って対応します。
% kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}' service/argocd-server patched
サービスポートの確認
% kubectl get svc argocd-server -n argocd NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE argocd-server NodePort 10.152.183.222 <none> 80:30180/TCP,443:31990/TCP 8m26s
パスワードを確認(デフォルトユーザーはadmin)
% kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo Sz2ym8oDOEN5EuIR
アクセス
ブラウザーで「http://Node-IP-Address:NodePort」にアクセスします(例えば私の環境は「192.168.0.49」のIPアドレスのサーバーでNodePortは30180なので、「http://192.168.0.49:30180」にアクセスします)。
次のような画面が表示されたと思います。
ログインすると、次のような画面に遷移されます。
argocdコマンドラインのインストール
Linuxにargocdコマンドをインストールするには、次のように実行します。
$ wget https://github.com/argoproj/argo-cd/releases/download/v2.3.1/argocd-linux-amd64 && mv argocd-linux-amd64 argocd && chmod +x argocd && sudo mv argocd /usr/local/bin/
他のOS向けについてはGitHub Argo CD Releasesからダウンロードしてください。
コマンドラインを使ったログイン
次のように実行することで、Argo CD Serverにログインできます。'admin:login' logged in successfully
と表示されればログインできています。
$ argocd login 192.168.0.49:30180 WARNING: server certificate had error: x509: cannot validate certificate for 192.168.0.49 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y Username: admin Password: 'admin:login' logged in successfully Context '192.168.0.49:30180' updated
外部クラスターを追加する(任意)
標準設定はArgo CDをデプロイしたクラスターに対してアプリケーションをデプロイします。 別のノードを追加したい場合は「ノードの追加」が必要です。
別のクラスターを追加するには「Getting Started 5. Register A Cluster〜」をご覧ください。
またCLIではアプリケーションのデプロイ毎にデプロイ対象のサーバーの指定をする必要があります。例えばCLIの場合は--dest-server
オプションを利用して指定します。
アプリケーションを実行
それでは早速Gitベースでアプリケーションを実行する「GitOps」をArgo CDで体験してみましょう。 今回はサンプルとして用意されているリポジトリーを使ってみます。
% kubectl create ns guestbook % argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace guestbook
application 'guestbook' created
と出力されれば成功です。
コマンドオプションについて、さらっと解説します。今回利用するアプリケーションソースは次のものを利用します。実際にアクセスしてみるといくつかのディレクトリーがあるはずです。対象のソースは--path
で指定しています。ディレクトリーにアクセスすると、二つのマニフェストファイルがあるはずです。これらはKubernetesのマニフェストファイルです。Argo CDではCDを実行するための設定を別途リポジトリーに用意することなく動きます。 --dest-server
はアプリケーションのデプロイ先のクラスターを指定します。上記例はデフォルトのノードです。--dest-namespace
はサービスなどをデプロイするNamespaceの指定です。省略するとdefaultを利用しますが多くのサービスが実行されるため、別のNamespaceを使うと良いと思います。
アプリの状態を確認
CLIを使って、追加したアプリケーションの状態を確認してみましょう。OutOfSync Missing
と表示されると思います。まだ情報を追加しただけなので、これで問題ありません。
% argocd app get guestbook Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: guestbook URL: https://192.168.0.49:30180/applications/guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: OutOfSync from (53e28ff) Health Status: Missing GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service guestbook guestbook-ui OutOfSync Missing apps Deployment guestbook guestbook-ui OutOfSync Missing
GUIでみた場合は次のように表示されます。
Gitと同期を実施
アプリケーションを同期するには、GUIでは該当のアプリケーションの「SYNC」ボタンを押すと、Gitソースと同期され、最新のコードを使って指定されたKubernetesクラスターにアプリケーションを実行します。
% argocd app sync guestbook TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE 2022-03-18T07:45:19+00:00 Service guestbook guestbook-ui OutOfSync Missing 2022-03-18T07:45:19+00:00 apps Deployment guestbook guestbook-ui OutOfSync Missing 2022-03-18T07:45:23+00:00 Service guestbook guestbook-ui OutOfSync Missing service/guestbook-ui created 2022-03-18T07:45:23+00:00 apps Deployment guestbook guestbook-ui OutOfSync Missing deployment.apps/guestbook-ui created 2022-03-18T07:45:23+00:00 Service guestbook guestbook-ui Synced Healthy service/guestbook-ui created Name: guestbook Project: default Server: https://kubernetes.default.svc Namespace: guestbook URL: https://192.168.0.49:30180/applications/guestbook Repo: https://github.com/argoproj/argocd-example-apps.git Target: Path: guestbook SyncWindow: Sync Allowed Sync Policy: <none> Sync Status: Synced to (53e28ff) Health Status: Progressing Operation: Sync Sync Revision: 53e28ff20cc530b9ada2173fbbd64d48338583ba Phase: Succeeded Start: 2022-03-18 07:45:19 +0000 UTC Finished: 2022-03-18 07:45:23 +0000 UTC Duration: 4s Message: successfully synced (all tasks run) GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE Service guestbook guestbook-ui Synced Healthy service/guestbook-ui created apps Deployment guestbook guestbook-ui Synced Progressing deployment.apps/guestbook-ui created
状況はargocd app list
コマンドやGUIで確認できます。
% argocd app list NAME CLUSTER NAMESPACE PROJECT STATUS HEALTH SYNCPOLICY CONDITIONS REPO PATH TARGET guestbook https://kubernetes.default.svc guestbook default Synced Progressing <none> <none> https://github.com/argoproj/argocd-example-apps.git guestbook
GUIで確認する場合はこのようになります。
Gitと同期が実行されるとGitの変更に伴って、最新のコードを使ってアプリケーションがデプロイされます。 Argo CDで管理されたアプリケーションはどのようなサービスがどのようにクラスター上で実行されているか分かりやすく表示されます。アプリケーションが正常に動いているかもある程度判断できます。
ツリー表示モードにすれば、アプリケーションがどういった構成でKubernetesクラスターで動いているか一目瞭然です。
次のような一覧表示も可能です。
Podsモードにすると、どのノードでアプリが動いているか確認できます(複数のノードをArgo CDノードとして追加すると、ここに複数のノードが表示されます)。
ネットワークモード表示にするとサービスとPodのつながりが視覚化されます。複数のPodで構成されるアプリケーションであれば、それらがどのような経路でアクセスできるのか分かります。
以上のように、簡単に使えるのが分かります。
DevOps CI/CDの実践により、開発とデプロイのサイクルが効率化されつつあります。さらにGitOpsを実践すれば、アプリケーションデリバリーの自動化が可能になります。アプリケーションソースコードの正当性はCircleCIやGitHub Actions、GitLab CIといったCIツールでチェックでき、安全に想定したノードにサービスをデリバリーできます。
Argo CDのようなGitOpsツールは、Kubernetesでアプリケーションをデプロイするのならば、ぜひ使っておきたいツールです。