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

Ameba CI/CD: Terraform and Argo CD Improvements

Avatar for Kumo Ishikawa Kumo Ishikawa
July 11, 2025
3.1k

Ameba CI/CD: Terraform and Argo CD Improvements

Avatar for Kumo Ishikawa

Kumo Ishikawa

July 11, 2025

More Decks by Kumo Ishikawa

Transcript

  1. •2023年11月中途入社 •横断組織 Service Reliability Group (SRG)所属 •Ameba Platform 担当 •得意領域

    Security Multi-Tenant・Zero Trust・Runtime Monitoring CI/CD ArgoCD・FluxCD・Terraform PipeCD Contribute (Auth) 石川 雲 Kumo Ishikawa
  2. 本セッションの内容 Ameba PlatformにおけるCI/CDの進化と運用改善 具体的には... ❏ CI/CDの構成 と2022年以降に顕在化した課題の解決 ❏ Terraform /

    ArgoCD / FluxCDの パフォーマンス最適化 事例 ❏ ArgoCD上の Resource Tracking と生成Resource の扱い ❏ CI/CD後の Workflow自動化 に向けた検討
  3. CI/CDの構成 - CI (Product) CI (Product) ❏ Image Push ❏

    ECRへ ❏ Test ❏ Code管理 CD (Product) ❏ Platformへ ❏ 手動実行 ❏ CDN操作 ❏ Schema操作
  4. CI/CDの構成 - 責任分界点 開発者(Product) ❏ Product Side ❏ Shared Side

    ❏ Terraform ❏ Manifest ❏ Platform Side ❏ ArgoCD 開発者(Platform) ❏ Shared Side ❏ Platform Side
  5. Terraformの構成(旧) tfstate State構成 ❏ S3 Backend利用 ❏ Workspace利用 ❏ Env名=

    Workspace名 ❏ マイクロサービス単位でState分け
  6. CIの課題 データで見てみると Plan ❏ 平均時間:741.2s (12.4min ) ❏ 中央値: 347.0s

    (5.8min ) ❏ p75: 363.0s (6.1min ) Apply ❏ 平均時間:387.4s (6.5min ) ❏ 中央値: 335.0s (5.6min ) ❏ p75: 417.0s (7.0min )
  7. Terraformの速度を上げる方法 一般的な方法 遅いCloud Resourceの分離 ❏ 極端に遅いCloud Resourceは個別のモジュール・Terraform以外で管理 tfstateの分割 ❏ 使いやすい程度で分割(~500KB)

    並列処理数を上げる ❏ Runner性能とリソース間依存/順序によって効果がない場合がある Providerダウンロード時間を減らす ❏ ProviderのCache設定
  8. Terraformの速度を上げる方法 トリック Planファイルを利用してApply ❏ terraform apply -auto-approve xxx.tfplan ❏ Applyがとても速くなるが、tfplanの最新性を保つ必要がある

    Targetを指定する ❏ terraform apply -target="module.eks_addon" ❏ 単体ターゲットの定期実行に向いてる Refreshを無効化 ❏ terraform plan -refresh=false ❏ stateが大きい場合、ある程度時間を削減できる
  9. Amebaでの対策 具体的には ❏ 一部Cloud ResourceをTerraformから廃止検討 ❏ EKS EC2 AutoScalingGroup、Karpenterへ移行 ❏

    Auroraなどは検討中 ❏ Planファイルを利用してApply ❏ Runnerの上限まで並列処理数を上げる ❏ 大きいState: 10(Default) ❏ 小さいState: 30 ❏ Providerファイルのキャッシング
  10. 改善結果 改善前(2024/2) Plan ❏ 平均時間:741.2s (12.4min ) ❏ 中央値: 347.0s

    (5.8min ) ❏ p75: 363.0s (6.1min ) Apply ❏ 平均時間:387.4s (6.5min ) ❏ 中央値: 335.0s (5.6min ) ❏ p75: 417.0s (7.0min ) 改善後(2025/5) Plan ❏ 平均時間:234.0s (3.9min ) ❏ 中央値: 72.1s (1.2min ) ❏ p75: 117.6s (1.9min ) Apply ❏ 平均時間:251s (4.2min ) ❏ 中央値: 99.2s (1.7min ) ❏ p75:195.0s (3.3min ) 実行時間: 最大9割削減、平均7割削減を達成
  11. CDの課題 ❏ ArgoCD: ❏ 同期が遅い ❏ ImagePush -> AutoSync ->

    Sync完了まで20~30分かかる ❏ 画面が遅い ❏ UI上、Filterをかけないと画面がフリーズして動かない ❏ FluxCD: ❏ FluxCDの動きが遅く、ImageTag更新が止まる
  12. CDの課題 ArgoCD Core Componentの状態 ❏ ApplicationControllerは平常時でもカツカツ状態 ❏ CPU 95%、メモリ 90%使用(Limit)

    ❏ 2/3のRepoServerとRedis Proxyは1分単位で再起動繰り返す ❏ 全体Applicationの45%はProgressing・Status Unknown FluxCD Componentの状態 ❏ ECR更新のタイミングで、ImageXXXControllerがOOM Killedで再起動
  13. CDの課題 原因: リソース総数の増加 ❏ リソース数合計: 10k(2022) -> 35k(2024) ❏ 1

    MicroServiceのKubernetesリソース数 ❏ 平均: 100(2022) -> 500 (2024) ❏ 一部: 2000~3000
  14. ArgoCDのパフォーマンス改善 水平スケーリング Application Controller ❏ Shardingの分割単位: クラスタ ❏ Shardへ自動・手動クラスタ指定 Repo

    Server・API Server ❏ スケールすることでパフォーマンス激的に改善 Redis ❏ 3つという前提 Dexなど ❏ スケールすると不整合が起きる
  15. ArgoCDのパフォーマンス改善 MonoRepo問題とは ❏ MonoRepo運用 ❏ 複数のArgoCD Applicationが単一のGit Repoをポーリングしている ❏ 専用のManifest用Repo

    ❏ ArgoCD特性 ❏ 新しいコミットが同期されると、そのRepoに関する全てのキャッシュが再作成される ❏ MonoRepoの場合 ❏ デプロイ対象のManifestだけでなく、それ以外のManifestの変更があっても キャッシュが再作成される ❏ Repo内のAppが数十個以上の場合、パフォーマンスに大きな影響
  16. ArgoCDのパフォーマンス改善 パラメータチューニング Application Controller ❏ 調整(Reconcile)期間: デフォルト3min ❏ timeout.reconciliation ❏

    短すぎるとWorkQueueの処理待ち件数が滞留して常にピーク状態、適切に伸ばす ❏ Processor数: ❏ controller.status.processors (appRefreshQueue: Application状態監視) ❏ controller.operation.processors (appOperationQueue: Kubernetesリソース操作) ❏ 上げるとWorkQueueの処理効率が上がる ❏ 調整Jitter: ❏ timeout.reconciliation.jitter ❏ 複数Appの実行タイミングを乱数化、スパイク回避 ❏ timeout.reconciliationが3min, jitterが1minの場合: 調整間隔区間が[3min, 3min+1min]
  17. Amebaの改善 Application Controller ❏ Reconcile Timeout: 3min -> 5min ❏

    Processor数: status/operation 3倍 ❏ Reconcile Jitter: 1min (Reconcile Timeout: 5min~6min) ❏ Shareds: 1台運用 -> 1クラスタ = 1Shard運用 Repo Server ❏ キャッシュ期間: 24h -> 48h ❏ Replicas: 3 -> 6
  18. CDの課題 GitOps定義内の範囲: ❏ ArgoCD App ❏ KubeVela App(CR) GitOps定義外の範囲: ❏

    Raw Resource ❏ KubeVela生成 Gitにないため、 Prune Statusになる
  19. ソリューション 2 Tracking IDを導入して、意図的にNon SelfReferencing Resourceに誘導 ❏ Tracking IDとは ❏

    全てのリソースに一意的なTracking IDが存在 ❏ Tracking IDを間違って利用するリソースはNon SelfReferencing Resource
  20. ソリューション 2 Tracking IDを導入して、意図的にNon SelfReferencing Resourceに誘導 1. Tracking IDを導入し、KubeVela Custom

    ResourceにTracking IDが生成 される 2. 生成ResourceにKubeVela Custom ResourceのAnnotationをコピー させる 3. 本来持つべきTracking IDと一致しない ため、NonSelfReferencingと判断される
  21. ソリューション 2 Tracking IDを導入して、意図的にNon SelfReferencing Resourceに誘導 1. Tracking IDを導入し、KubeVela Custom

    ResourceにTracking IDが生成 される 2. 生成ResourceにKubeVela Custom ResourceのAnnotationをコピー させる 3. 本来持つべきTracking IDと一致しない ため、NonSelfReferencingと判断される
  22. ソリューション 2 Tracking IDを導入して、意図的にNon SelfReferencing Resourceに誘導 1. Tracking IDを導入し、KubeVela Custom

    ResourceにTracking IDが生成 される 2. 生成ResourceにKubeVela Custom ResourceのAnnotationをコピー させる 3. 本来持つべきTracking IDと一致しない ため、NonSelfReferencingと判断される
  23. ソリューション 2 Tracking IDを導入して、意図的にNon SelfReferencing Resourceに誘導 1. Tracking IDを導入し、KubeVela Custom

    ResourceにTracking IDが生成 される 2. 生成ResourceにKubeVela Custom ResourceのAnnotationをコピー させる 3. 本来持つべきTracking IDと一致しない ため、NonSelfReferencingと判断される Non Self-Referencing ResourceのStatusは Unknown UI表示のみ、Pruneされない
  24. ソリューション 2 推測 ❏ GitにないManifestに対するStatus Checkは、Application Controllerの負 荷増加と関係している可能性がある ❏ 意図的にUnknown

    Statusにすることで、負荷低減の可能性も考えられる 測るタイミングを逃してしまったので、知っている方がいれば教えてください
  25. CDの課題 PostSync問題 ❏ 当初設計: Sync後に何かを実行したい ❏ CDN Cache Purge ❏

    Assets処理 ❏ ArgoCD Resource Hookでは解決できない ❏ ArgoCD Application単位、リソース単位ではない
  26. CDの課題 GitOps定義内の範囲: ❏ ArgoCD App ❏ KubeVela App(CR) GitOps定義外の範囲: ❏

    Raw Resource ❏ KubeVela生成 Resourcehook のトリガー単位 望ましい トリガー単位
  27. ソリューション 検討したソリューション ❏ Argo Events・Argo Workflow (運用負荷が高い) ❏ ArgoCD Notification

    + Webhook Server (自由度が低い) ❏ KubeVela Application Workflow (バランス案、最終的に選定)
  28. まとめ ❏ Ameba Platform CI/CDの全体像・細部まで紹介 ❏ CIとCDのパフォーマンスなどの改善 ❏ Terraform CIの高速化

    ❏ ArgoCD/FluxCDのスケーリング・パラメータチューニング ❏ ArgoCD上生成リソースのステータスハンドリング ❏ ArgoCDとKubeVelaを活用したPost Release Workflow