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
1.3k

Ameba CI/CD: Terraform and Argo CD Improvements

Avatar for Kumo Ishikawa

Kumo Ishikawa

July 11, 2025
Tweet

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