Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

Kumo Ishikawa
November 07, 2024
350

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

Kumo Ishikawa

November 07, 2024
Tweet

Transcript

  1. AmebaにおけるArgoCDの運用 運用開始: 2020年6月 ❏ Ameba刷新プロジェクト、Ameba Platform誕生 ❏ AmebaBlogと周辺サービスのDelivery ❏ CI/CD刷新時、ArgoCD採択

    ❏ 採択理由について: Findy Tools ArgoCD レビュー 石川雲:「AmebaにおけるArgoCDの導入と運用」 https://findy-tools.io/product s/argo-cd/379/292 Findy-Tools: Amebaにおけ るArgoCDの導入と運用
  2. AmebaにおけるArgoCDの運用 パフォーマンス最適化前のArgoCD HA構成 ❏ Application Controller: 1 ❏ CPU, Memory

    R/L: 1~2 core, 3~6 Gi ❏ Repository Server: 2 ❏ API Server: 2 ❏ Redis Server/Proxy: 3 ❏ その他: 1つずつ LastCommited: 2023/2
  3. ArgoCDのパフォーマンス問題 パフォーマンス問題に気づく 定期開催のプラットフォームユーザ討論会でユーザの声 ❏ UI上、Filterをかけないと画面がフリーズして動かない ❏ UIが開けない時間帯がある ❏ ImagePush ->

    Deployまで20~30分かかる Platform管理者が確認したところ... ❏ 平常時ApplicationControllerはCPU1.9Core、メモリ5Gi使用 ❏ 半分のRepoServerとRedis Proxyは1分単位で再起動繰り返す ❏ 全体Applicationの45%はProgressing・Status Unknown
  4. ArgoCDのパフォーマンス問題 分析 ❏ ArgoCD専用監視がなかった ❏ リソース総数の増加によるPlatformの膨大化 ❏ リソース数: 10k(2022) ->

    35k(2024) ⇨ 現行処理能力の限界 ❏ 数十名ユーザ直接利用 ❏ アクセス集中時間帯がある ⇨ たまに遅い原因 ❏ 各Application内リソース数が不均等 ❏ 1Applicationが100~2000 ⇨ 一部のApplication UIが極遅い原因 ❏ マルチクラスタ運用 ❏ 環境ごとにクラスタ分け、クラスタ間のリソース数・優先度が不均等 ❏ ⇨優先度に応じた負荷分散が必要
  5. コンポーネント概要 - argocd-server - api server + UI - application-controller

    - manifest deploy, reconciler - repo-server - git clone, manifest build 【ArgoCD🐙】ArgoCDのマイクロ サービスアーキテクチャと自動デプ ロイの仕組み https://hiroki-hasegawa.hatenablo g.jp/entry/2023/05/02/145115
  6. ArgoCDコンポーネント - argocd-server - api server + UI - application-controller

    - manifest deploy, reconciler - repo-server - git clone, manifest build 【ArgoCD🐙】ArgoCDのマイクロ サービスアーキテクチャと自動デプ ロイの仕組み https://hiroki-hasegawa.hatenablo g.jp/entry/2023/05/02/145115
  7. パフォーマンスに影響するパラメータ パフォーマンスを表す 2つのメトリクス 1. Work Queueの処理時間 2. Work Queueの深さ 6つのパラメータ

    1. SyncとReconcileの頻度 2. Controller Processor数 3. Repo キャッシュ時間 4. Helm/Kustomizeの使用 5. MonoRepoの使用 6. レプリカ数
  8. パフォーマンスに影響するパラメータ キューの種類 ❏ app_operation_processing_queue / appOperationQueue ❏ operation processor数で決まる ❏

    ApplicationのSync実行 ❏ app_reconciliation_queue / appRefreshQueue ❏ status processor数で決まる ❏ ApplicationのReconcile実行 ❏ project_reconciliation_queue / projectRefreshQueue
  9. パフォーマンスに影響するパラメータ パフォーマンスを表す 2つのメトリクス 1. Work Queueの深さ 2. Work Queueの処理速度 6つのパラメータ

    1. Reconcileの頻度 2. Controller Processor数 3. Repo キャッシュ時間 4. Helm/Kustomizeの使用 5. MonoRepoの使用 6. レプリカ数
  10. パフォーマンスに影響するパラメータ 1. Reconcileの頻度 ❏ 頻度が高い -> 前の処理が終わらない -> WorkQueue(reconciliation)の消化が間に合わない ->

    Controller負荷高 -> 遅い ❏ 適切に設定することで、平常時Controller負荷低減 2. Controller Processor数 ❏ WorkQueueの処理能力(デフォルトApplication 400対応) ❏ 一説: 効果はKubeClient QPS/Burstと関係あり
  11. パフォーマンスに影響するパラメータ 3. Repo キャッシュ時間 ❏ 短すぎるとRepo Server i/o timeoutエラー発生しやすい ❏

    長すぎるとVolume過剰使用 ❏ バランス: 適切なキャッシュ時間 4. Helm/Kustomizeの使用 ❏ Helm/Kustomize使う場合、RepoServer負荷高 ❏ 並列数減 -> 負荷減 -> 処理が遅い -> Timeout(90s)エラー発生 ❏ バランス: RepoServer並列数調整・実行Timeout調整
  12. パフォーマンスに影響するパラメータ 5. MonoRepoの使用 ❏ マニフェスト生成: Repo内同時処理可能のApplication数が1 ❏ 対策: 並列処理有効化 ❏

    キャッシュ: Repo更新したらキャッシュが消える ❏ 対策: Manifest Paths Annotation指定 6. レプリカ数 ❏ 処理能力が足りない: Repo・API・Controller ❏ Repo/API: Deployment ❏ Controller: StatefulSet(Sharding)
  13. シャーディング考察 シャーディングアルゴリズム(手動指定も可能) ❏ Legacy(v1.8以降) ❏ ClusterIDのハッシュでShard決定 ❏ シンプルさを優先するなら ❏ Round-Robin(v2.8以降,

    Alpha) ❏ ClusterIDでソート後、均等にShard決定 ❏ (クラスタ数において)均等な負荷分散を求めるなら ❏ Consistent-Hash(v2.12以降, Alpha) ❏ 特殊ハッシュでShard決定 ❏ (クラスタ数)変更に対する耐性と安定性を求めるなら
  14. シャーディング考察 実験A(Shard数3 < クラスタ数5) SHAR D RESOURCES COUNT CLUSTER COUNT

    0 15372 (123%) 2 1 21936 (176%) 3 2 0 (0%) 0 Legacy Round-Robin Consistent-Has h SHAR D RESOURCES COUNT CLUSTER COUNT 0 12122 (98%) 1 1 21939 (177%) 3 2 3165 (26%) 1 SHAR D RESOURCES COUNT CLUSTER COUNT 0 12534 (134%) 2 1 18871 (202%) 2 2 5938 (64%) 1
  15. シャーディング考察 実験A(Shard数3 < クラスタ数5)       全てのアルゴリズムは最適解だと言えない SHAR D RESOURCES COUNT

    CLUSTER COUNT 0 15372 (123%) 2 1 21936 (176%) 3 2 0 (0%) 0 Legacy Round-Robin Consistent-Has h SHAR D RESOURCES COUNT CLUSTER COUNT 0 12122 (98%) 1 1 21939 (177%) 3 2 3165 (26%) 1 SHAR D RESOURCES COUNT CLUSTER COUNT 0 12534 (134%) 2 1 18871 (202%) 2 2 5938 (64%) 1
  16. シャーディング考察 SHARD RESOURCES COUNT CLUSTER COUNT 0 2767 (37%) 1

    1 9827 (132%) 1 2 9330 (125%) 1 3 9390 (126%) 1 4 5930 (80%) 1 Round-Robin 実験B(Shard数5 = クラスタ数5) 1 Shard メモリ: 700Mi~1Gi使用 ⇨リソースの浪費
  17. シャーディング考察 注意 ❏ Shard計算はStatic ❏ Replicaの追加・削除時、StatefulSet再起動してShard再計算 ❏ 動的にしたい場合: Dynamic Cluster

    Distribution機能(v2.9, Alpha) ❏ StatefulSet -> Deployment、Replicaの追加・削除時自動再計算 ❏ Shardが停止した場合、そのShardのタスクは他のShardに 引き継がれない ❏ 負荷の適切設定と監視
  18. 改善の結果 パフォーマンス最適化後のArgoCD HA構成 ❏ Application Controller: 1 -> 4 ❏

    CPU, Memory R/L: 1~2 core -> 200m~500m core, 3Gi~6Gi -> 500Mi~1 Gi ❏ Repository Server: 2 -> 4 ❏ API Server: 2 -> 4 ❏ Redis Server/Proxy: 3 ❏ その他: 1つずつ
  19. 改善の結果 Amebaの各パラメータの設定 ❏ Reconcile間隔: 3m -> 5m ❏ Jitter: 1m

    ❏ RepoCache時間: 24h -> 48h ❏ Controller⇨Repo Timeout: 1m -> 3m ❏ Repo Exec Timeout: 90s -> 180s ❏ Helm並列化: false -> true ❏ Controller Processors: 2x ❏ status 20-> 40 operation 10 -> 20 ❏ ARGOCD_K8S_CLIENT_QPS: 50 -> 100 ❏ ARGOCD_K8S_CLIENT_BURST: 100 -> 200
  20. まとめ ❏ ArgoCDの大規模運用ならチューニング必須 ❏ キャッシュ関連・Reconcile頻度関連・並列化関連 ❏ まだ改善の余地がある ❏ Server-side Pagination

    でUI速度の大幅改善が期待できそう ❏ 特定Shardに対応するために、Redisが過負荷 ❏ 2.13から改善される