HA構成のArgoCDパフォーマンス最適化への道

メディア統括本部 サービスリライアビリティグループ(SRG)の石川 雲(@ishikawa_kumo)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事では、HA構成のArgoCDパフォーマンスの課題を解決するための方法を紹介します。具体的には、リソース増加によるデプロイ遅延に対処するための最適化手法や、Shardingを活用した負荷分散の実装方法について解説するものです。
なにかの役に立てば幸いです。

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ダッシュボードでメトリクスを確認できます。詳細はこちらのリンクです。
収集可能なメトリクスはPrometheusと違うため、詳細はこのリストになります。

ArgoCD Application Controllerのスケール不足がかなり目立ちます。調査を進める中で、ArgoCDのHA構成に関しても再検討の必要性を感じ、いくつかの参考資料を基に詳細な調査を行いました。
  1. ArgoCDの公式ドキュメントに掲載されているHA構成に関するガイドラインです。特に詳細に書かれており、全ての可能性を網羅していますが、バージョンによって構成が変わることがあるため、バージョンとリリースノートを確認しながら進める必要があります。
  1. Sync 10,000 Argo CD Applications in One Shot. By Jun Duan, Paolo Dettori, Andy Anderson: ArgoCDのスケーラビリティについての定量的研究を紹介している資料です。1万件のアプリケーションをSyncする際のパフォーマンスに関するベンチマークとRepoServer数・Reconcile間隔などの実験データが掲載されており、ArgoCDのアプリケーション管理における負荷の指標として非常に有用です。
  1. Argo CD Benchmarkingシリーズ. By Andrew Lee: ArgoCDのパフォーマンスを影響する要素に関して一番包括的な分析です。今回のケースでのボトルネックを特定するのに役立ちました。

ArgoCDパフォーマンスを影響する要素


ArgoCDの主要コンポーネント

Argo CDのパフォーマンスを理解するためには、主要コンポーネントの役割と動作を正確に把握することが重要です。
API Server(
役割:
  • 認証と認可のゲートウェイとして機能し、すべての操作リクエストを受け付ける
  • CLI、Web UI、またはWebhookなどからのリクエストを処理する
  • などのCRDリソースを操作する
動作:
  1. UI、CLI、またはGit Webhookイベントなどを通じてAPIリクエストを受け取る
  1. JWT、SSOを使用してユーザを認証し、RBACポリシーを適用する
  1. リクエスト内容に応じて、Application CRDリソースのCRUDを行う

2. Repo Server(
役割:
  • Gitリポジトリからソースコードを取得し、Kubernetesマニフェストを生成する
  • Helm、Kustomize、Plain YAMLなど、さまざまな形式のソースを処理する
動作:
  1. Application Controllerからのリクエストに応じて、指定されたGitリポジトリとリビジョンからソースコードを取得する
  1. Helm、Kustomizeなどを使用して、Kubernetesマニフェスト生成する
  1. 生成されたマニフェストをローカルファイルシステムにキャッシュする
  1. 一部の情報(マニフェストのハッシュ値)をメモリに保存する

3. Application Controller(
役割:
  • リソースを監視し、望ましい状態(Desired State)と実際の状態(Live State)を比較・Reconcileする
  • Kubernetesクラスタ上のリソースを適切に作成、更新、削除する
動作:
  1. KubernetesのInformerを使用してリソースのイベントを監視し、イベント発生時にReconcileをキューにPushする
  1. キューからを取得し、再調整を開始する
    1. Repo Serverを呼び出し、最新のマニフェストを取得する(Desired State)
    2. Kubernetes APIを通じて、現在のリソース状態を取得する(Live State)
    3. Desired StateとLive Stateを比較し、差分を計算する
    4. 差分に基づいて、必要なリソースCRUD操作を決定する

コアとなるメトリクス

Application Controller
  • Workqueue Work Duration Seconds
    • Datadog Metrics:
      ArgoCDのApplication ControllerがWorkQueue内でアイテムを処理する際にかかる時間を示すメトリクスです。処理時間が長い場合、ボトルネックが発生している可能性があるため、監視が必要です。
  • Workqueue Depth
    • Datadog Metrics:
      などのキューの深さ(未処理のアイテム数)を示すメトリクスです。
      💡
      について
      • ArgoCDがGitリポジトリとRedisの間でマニフェストの一貫性を保つために、Reconcileを実行するキューです。Gitリポジトリの状態とキャッシュの同期が行われます。リポジトリの変更が頻繁に発生する場合、このキューの処理が時間を要することがあります。
      について
      • ArgoCDがRedisとKubernetesクラスタの間でマニフェストの一貫性を保ち、アプリケーションのSyncやデプロイを実行するためのキューです。
      上記二つのキューはプロセッサ数ごとに処理されます。詳細は要素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処理が高速化されます。