とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Argo CDでかんたんGitOps

GitOpsについては以下の記事の後半で触れました。

tech.virtualtech.jp

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でアプリケーションをデプロイするのならば、ぜひ使っておきたいツールです。