🐙

Argo CDに入門する

2025/01/03に公開

Kubernetes 用の CD(continuous delivery)ツールである Argo CD に入門します。

Argo CD とは

CIOps と GitOps

Kubernetes では、マニフェストファイルを使用して各種リソースをクラスタにデプロイしていきますが、マニフェストファイルを1つ1つ手動でデプロイしていくのは非常に非効率です。

Kubernetes のマニフェスト管理手法としては、CIOpsGitOps が利用されます。いずれの手法も、Git でマニフェストファイルを管理し、CI/CD の仕組みを用いてクラスタにデプロイします。

CIOps では、Git リポジトリのイベント(Push、Merge など)をトリガーとして、GitHub Actions などの仕組みを用いてクラスタへのデプロイを実施します(Push 型のデプロイ)。


CIOps

GitOps では、クラスタ側にデプロイの役割を持つエージェントを用意します。エージェントが Git リポジトリとクラスタの状態を比較し、差分を検出すると同期のためのデプロイを実施します(Pull 型のデプロイ)。


GitOps

Push 型の CIOps は構成がシンプルですが、Git 側がクラスタに対する操作権限を持ちすぎることが問題となります。また、Git 側からクラスタにアクセスできるようにネットワークを構成する必要もあります。

一方、Pull 型の GitOps はエージェントの管理が必要となるものの、エージェントが Git リポジトリの Read 権限さえ持っていればデプロイを行うことができます。このようなセキュリティ上のリスクの低さから、GitOps の利用が推奨されているようです。

その他、CIOps と GitOps の比較については、以下の記事などで詳しく解説されています。

Argo CD

Argo CD は GitOps を実現するツールであり、先ほど紹介した GitOps のエージェントの役割を果たします。

Argo CD では Git リポジトリをアプリケーションというリソースに登録します。アプリケーションはクラスタにデプロイされたリソースの情報を保持しています。

アプリケーションはクラスタで実行中のリソースの状態を監視しており、登録してある Git リポジトリ上のマニフェストと比較、差分がある場合に同期(Sync)を行います。


Argo CD による GitOps

Argo CD は GUI からの操作も可能となっており、当記事では GUI による設定を行っていきます。

リポジトリの準備

Argo CD を使用して同期するための Git リポジトリをあらかじめ用意しておきます。当記事では以下のシンプルな構成の GitHub リポジトリをプライベートリポジトリで用意します。

.
└── sample  # 同期対象のディレクトリ
    └── deployment.yaml  # Kubernetes マニフェストファイル

deployment.yaml の内容は以下のように記述しておきます。

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: nginx
        image: nginx:1.27
        ports:
        - containerPort: 80
        resources:
            requests:
              cpu: "250m"

当記事の使用環境

Kubernetes クラスタは Google Cloud の GKE を使用します。Kubernetes は以下のバージョンを使用しています。

$ kubectl version
Client Version: v1.29.2
Server Version: v1.30.6-gke.1125000

Argo CD のバージョンは v2.13.2 を使用します。

クラスタの作成

GKE の限定公開クラスタを使用します。Autopilot モードのクラスタ(もしくは Standard モードのゾーンクラスタ)は請求先アカウントにつき $74.40/月 の無料枠があるので、個人の学習用途であればかなり安価に利用できます。

以下の記事のように Terraform でクラスタを作成できるようにしておくと、検証用途のクラスタを手軽に作成・削除することができて便利です。

現在は DNS エンドポイントという仕組みでコントロールプレーンに接続することができるため、上記記事で作成しているような踏み台 VM は必要ありません。

DNS エンドポイントについては以下の記事をご一読ください。

Argo CD のセットアップ

インストール

Argo CD の公式チュートリアルを参考に、GKE クラスタに Argo CD をデプロイします。

Argo CD のインストール用マニフェストファイルは、デフォルトで Namespace「argocd」を使用するため、あらかじめ Namespace を作成しておきます。

# 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
  

インストール時に作成された Argo CD 関連の Pod を表示してみます。

# Argo CD 関連の Pod リソース一覧
$ kubectl -n argocd get pod
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          27m
argocd-applicationset-controller-5b868bd878-sl65s   1/1     Running   0          27m
argocd-dex-server-7566bf69d9-6bl7z                  1/1     Running   0          27m
argocd-notifications-controller-bf6cd7f55-clxqq     1/1     Running   0          27m
argocd-redis-cc44c56b-bzt5b                         1/1     Running   0          27m
argocd-repo-server-57f76b5479-xwkcc                 1/1     Running   0          27m
argocd-server-cb484bb4b-xp5j4                       1/1     Running   0          27m

GUI や CLI、REST API を公開する argocd-server や、Git リポジトリとやり取りする argocd-repo-server、クラスタを監視して Sync を実行する argocd-application-controller などがデプロイされています。

Argo CD の GUI にアクセス

admin ユーザーのパスワードを取得

Argo CD のインストール後、admin ユーザーが自動で作成されます。admin の初期パスワードは Secret リソースとして保存されているため、以下のコマンドで取得しておきます。

$ kubectl -n argocd get secret/argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
パスワードが出力される
  

admin の初期パスワードは初回ログイン時に変更し、その後 Secret は削除しておくのがよいでしょう。

ポートフォワードを使用してアクセス

Kubernetes では、LoadBalancer や Ingress などのリソースを使用しなくても、ポートフォワードを使用して Service や Pod にアクセスできる仕組みがあります。

Argo CD の GUI は argocd-server で公開されているため、argocd-server の Service に対してポートフォワードを行います。

# Argo CD 関連の Service リソース一覧
$ kubectl -n argocd get service
NAME                                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
argocd-applicationset-controller          ClusterIP   172.18.197.25    <none>        7000/TCP,8080/TCP            28m
argocd-dex-server                         ClusterIP   172.18.113.172   <none>        5556/TCP,5557/TCP,5558/TCP   28m
argocd-metrics                            ClusterIP   172.18.128.62    <none>        8082/TCP                     28m
argocd-notifications-controller-metrics   ClusterIP   172.18.59.136    <none>        9001/TCP                     28m
argocd-redis                              ClusterIP   172.18.248.80    <none>        6379/TCP                     28m
argocd-repo-server                        ClusterIP   172.18.159.85    <none>        8081/TCP,8084/TCP            28m
argocd-server                             ClusterIP   172.18.60.203    <none>        80/TCP,443/TCP               28m
argocd-server-metrics                     ClusterIP   172.18.183.146   <none>        8083/TCP                     28m

ポートフォワードには kubectl port-forward コマンドを使用します。

$ kubectl port-forward svc/argocd-server -n argocd 8080:443

上記コマンドではローカルホストのポート8080で Argo CD の GUI にアクセスすることができるようになります。ブラウザで 127.0.0.1:8080 にアクセスすると、ログイン画面が表示されます。


Argo CD GUI のログイン画面

admin ユーザーを使用し、先ほど確認したパスワードでログインします。

ポートフォワードを使用しない場合

今回は試していませんが、実際の運用では、Ingress を作成して HTTPS で接続できるようにするとよいでしょう。公式ドキュメントに Ingress の設定手順が記載されています。

また、GKE を使用する場合は、以下の記事のように Ingress に対して Identity-Aware Proxy を設定することで、Google アカウントによる認証を簡単に実装することができます。

アプリケーションの設定

プライベートリポジトリの登録(HTTPS)

まず、アプリケーションの同期元となる Git リポジトリを Argo CD に登録します。

GUI で [Setting] > [Repositories] > [CONNECT REPO] を選択します。


[Setting] > [Repositories] > [CONNECT RE
PO]

当記事では手順がシンプルな HTTPS 接続でプライベートリポジトリに接続します。接続の方法はいくつかあるので、詳細な手順は以下のドキュメントを参照してください。

以下のように各項目に値を設定します。

項目名 備考
Choose your connection method: VIA HTTPS
Project default
Repository URL 使用するリポジトリの URL
Username (optional) Git のユーザー名
Password (optional) Git のアクセストークン 参考

値を設定したあと、[CONNECT] を押下します。


リポジトリの接続情報を入力 > [CONNECT]

アプリケーションの作成

先ほど登録したリポジトリとの同期を行うアプリケーションを作成していきます。[Applications] > [NEW APP] を選択します。


[Applications] > [NEW APP]

以下のように各項目に値を設定します。

項目名 備考
Application Name sample
Project Name default
Sync Policy Manual 手動で Sync を行う設定
Repository URL 登録したリポジトリ URL
Revision HEAD
Path sample 同期対象のリポジトリ内パス(当記事では sample

上記の設定値を入力したら、画面上部の [CREATE] でアプリケーションを作成します。

Argo CD によるデプロイ

同期の実行

Argo CD による GitHub リポジトリ上のマニフェストファイルの同期を行います。

アプリケーション作成後、同期が行われていない状態(OutOfSync)のアプリケーションが表示されるので、[SYNC] を押下します。


[SYNC]

SYNCHRONIZE を押下して同期を実行します。


[SYNCHRONIZE]

同期が完了すると、アプリケーションの状態が Synced になります。

デプロイ確認

リポジトリ内のマニフェストファイルが適用され、Deployment リソースが作成されています。

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   1/1     1            1           42s

マニフェストを編集して再同期

マニフェストファイルの編集

マニフェストファイル deployment.yamlspec.replicas の値を 3 に変更してリポジトリにプッシュします。

プッシュ後、Argo CD の GUI でアプリケーションの [REFRESH] を押下します。リポジトリの状態とアプリケーションの状態が一致しないため、OutOfSync となります。


[REFRESH] を押下すると OutOfSync 状態になる

再同期の実行

再び [SYNC] を押下し、同期を行います。

アプリケーションが Synced 状態になったら、再度デプロイ状況を確認します。Deployment のレプリカ数が 3 に変更されていることがわかります。

$ kubectl get deployment
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
myapp   3/3     3            3           58m

GUI でアプリケーションを選択すると、このアプリケーションが管理しているリソースの状態を確認することができます。


アプリケーションの詳細画面

例えば、右側にある Pod を選択すると、Pod の詳細設定やログなどを確認することができます。


Pod の詳細を Argo CD の GUI から確認する

アプリケーションの削除

最後に、作成したアプリケーションを削除します。アプリケーションの [DELETE] を押下します。


[DELETE]

以下のような警告が表示されるので、アプリケーション名を入力して [OK] を押下します(デプロイしたリソースが削除されるので注意)。


アプリケーション名を入力 > [OK]

アプリケーションの削除後、クラスタ上のリソースの状態を確認すると、リソースが削除されていることがわかります。

$ kubectl get deployment
No resources found in default namespace.

参考

Discussion