HA構成のArgoCDパフォーマンス最適化への道
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事では、HA構成のArgoCDパフォーマンスの課題を解決するための方法を紹介します。具体的には、リソース増加によるデプロイ遅延に対処するための最適化手法や、Shardingを活用した負荷分散の実装方法について解説するものです。
なにかの役に立てば幸いです。
ArgoCDが遅いある日、デプロイの遅延に気づく現状調査調査結果どうすればいいのかArgoCDパフォーマンスを影響する要素ArgoCDの主要コンポーネントコアとなるメトリクス要素1: RepoServer数
ArgoCDが遅い
弊社Aプロダクトの継続的デリバリー(CD)機能をArgoCDに移行してから、早くも4年が経ちました。この期間中、レガシーシステムから移設してきたサービスが増え続け、我々のCD環境で管理しているリソースも急速に拡大してきました。移行当初は、スムーズなデプロイを実現していたものの、ここ数年で発生してきた新たな課題により、最適化の必要性が浮き彫りになっています。
ある日、デプロイの遅延に気づく
ある日のこと、バックエンド開発者から「デプロイの時間が30分以上かかる」との報告を受けました。すぐにArgoCDのUIを確認すると、衝撃的な状況に直面しました。
全体の半数以上のArgoCD Applicationが、 で やなどの状態のまま数分間動かず、デプロイが停滞していたのです。さらに、特に多くのリソースを管理しているApplicationを開こうとしたところ、UIがフリーズし、動作が非常に遅くなる事態が頻発。最終的には、 というエラーメッセージが表示され、しばらく経つとChrome Tabがクラッシュになり、何も操作ができなくなりました。
現状調査
弊社Aプロダクトのパブリッククラウド部分は、単一のArgoCDで一元管理されており、ArgoCDが所在するEKSクラスタが複数のEKSクラスタを管理し、マルチクラスタデプロイを実現しています。この環境では、Primary Application経由で全てのArgoCD Applicationが管理されており、各Sub ApplicationはHelm Chartを用いて 分別定義されています。
ApplicationのSource Repoは用途に応じて、三つに分かれています。
- ArgoCD Application 定義 (Helm Chart)
- Application Manifest (Kustomize)
- ClusterコンポーネントCRD Manifest (Kustomize + Helm Chart)
Application数が約250、ArgoCD経由で管理・トラッキングしているリソース数が約3万です。
ArgoCDの構成はHAのデフォルト構成です。
調査結果
報告を受けて調査を始めた時点では、Application Controllerの2 CPU 6GB Memory Limitはそれぞれを超えてました。
Repo Serverのうち一つは、CrashLoopBackを繰り返していました。Repo Server内のログに、 が頻繁に出現し、Pod Eventでは、 のメッセージが現れています。Repo Server自体はResource Profileが設定されていませんでした。Redisのうち二つは、最近コンテナ再起動があったようです。
また、ArgoCD専用のモニタリングが存在していませんでした。
どうすればいいのか
まずArgoCD関連Podのメトリクスを取得し、Datadogで専用ダッシュボードを作ることにしました。
PodTemplateSpecに以下のAnnotationを入れれば、Datadog側提供してくれているArgoCDダッシュボードでメトリクスを確認できます。詳細はこちらのリンクです。
ArgoCD Application Controllerのスケール不足がかなり目立ちます。調査を進める中で、ArgoCDのHA構成に関しても再検討の必要性を感じ、いくつかの参考資料を基に詳細な調査を行いました。
- ArgoCDの公式ドキュメントに掲載されているHA構成に関するガイドラインです。特に詳細に書かれており、全ての可能性を網羅していますが、バージョンによって構成が変わることがあるため、バージョンとリリースノートを確認しながら進める必要があります。
- Sync 10,000 Argo CD Applications in One Shot. By Jun Duan, Paolo Dettori, Andy Anderson: ArgoCDのスケーラビリティについての定量的研究を紹介している資料です。1万件のアプリケーションをSyncする際のパフォーマンスに関するベンチマークとRepoServer数・Reconcile間隔などの実験データが掲載されており、ArgoCDのアプリケーション管理における負荷の指標として非常に有用です。
- Argo CD Benchmarkingシリーズ. By Andrew Lee: ArgoCDのパフォーマンスを影響する要素に関して一番包括的な分析です。今回のケースでのボトルネックを特定するのに役立ちました。
ArgoCDパフォーマンスを影響する要素
ArgoCDの主要コンポーネント
Argo CDのパフォーマンスを理解するためには、主要コンポーネントの役割と動作を正確に把握することが重要です。
API Server()
役割:
- 認証と認可のゲートウェイとして機能し、すべての操作リクエストを受け付ける
- CLI、Web UI、またはWebhookなどからのリクエストを処理する
- やなどのCRDリソースを操作する
動作:
- UI、CLI、またはGit Webhookイベントなどを通じてAPIリクエストを受け取る
- JWT、SSOを使用してユーザを認証し、RBACポリシーを適用する
- リクエスト内容に応じて、Application CRDリソースのCRUDを行う
2. Repo Server()
役割:
- Gitリポジトリからソースコードを取得し、Kubernetesマニフェストを生成する
- Helm、Kustomize、Plain YAMLなど、さまざまな形式のソースを処理する
動作:
- Application Controllerからのリクエストに応じて、指定されたGitリポジトリとリビジョンからソースコードを取得する
- Helm、Kustomizeなどを使用して、Kubernetesマニフェスト生成する
- 生成されたマニフェストをローカルファイルシステムにキャッシュする
- 一部の情報(マニフェストのハッシュ値)をメモリに保存する
3. Application Controller()
役割:
- リソースを監視し、望ましい状態(Desired State)と実際の状態(Live State)を比較・Reconcileする
- Kubernetesクラスタ上のリソースを適切に作成、更新、削除する
動作:
- KubernetesのInformerを使用してリソースのイベントを監視し、イベント発生時にReconcileをキューにPushする
- キューからを取得し、再調整を開始する
- Repo Serverを呼び出し、最新のマニフェストを取得する(Desired State)
- Kubernetes APIを通じて、現在のリソース状態を取得する(Live State)
- Desired StateとLive Stateを比較し、差分を計算する
- 差分に基づいて、必要なリソースCRUD操作を決定する
コアとなるメトリクス
Application Controller
- Workqueue Work Duration Seconds
Datadog Metrics:
ArgoCDのApplication ControllerがWorkQueue内でアイテムを処理する際にかかる時間を示すメトリクスです。処理時間が長い場合、ボトルネックが発生している可能性があるため、監視が必要です。
- Workqueue Depth
- ArgoCDがGitリポジトリとRedisの間でマニフェストの一貫性を保つために、Reconcileを実行するキューです。Gitリポジトリの状態とキャッシュの同期が行われます。リポジトリの変更が頻繁に発生する場合、このキューの処理が時間を要することがあります。
- ArgoCDがRedisとKubernetesクラスタの間でマニフェストの一貫性を保ち、アプリケーションのSyncやデプロイを実行するためのキューです。
Datadog Metrics:
と などのキューの深さ(未処理のアイテム数)を示すメトリクスです。
について
について
上記二つのキューはプロセッサ数ごとに処理されます。詳細は要素3になります。
- Process CPU Seconds
Datadog Metrics:
Application Controllerの消費CPU時間を示すメトリクスです。複数のApplication Controllerを使用している場合、平均値を取ってパフォーマンスの監視を行います。KubernetesのPod CPUメトリクスも代用可能です。
RepoServer
- Git Request Duration Seconds
Datadog Metrics:
ArgoCDのRepo ServerがGitリクエストを処理する際の時間を示すメトリクスです。Gitリポジトリへのアクセスに時間がかかる場合、Syncの遅延が発生する可能性があります。
要素1: RepoServer数
ArgoCDのパフォーマンスを向上させるためには、Repo Serverのレプリカ数を増加させることが有効です。レプリカ数を増加させることで、アプリケーション全体のSync時間が短縮されます。レプリカ数を適切に増やすことで、マニフェスト生成が並列化され、Sync処理が高速化されます。
