Argo CDに入門する
Kubernetes 用の CD(continuous delivery)ツールである Argo CD に入門します。
Argo CD とは
CIOps と GitOps
Kubernetes では、マニフェストファイルを使用して各種リソースをクラスタにデプロイしていきますが、マニフェストファイルを1つ1つ手動でデプロイしていくのは非常に非効率です。
Kubernetes のマニフェスト管理手法としては、CIOps や GitOps が利用されます。いずれの手法も、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.yaml
の spec.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