Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

メルカリにおけるプラットフォーム主導のKubernetesリソース最適化とそこに生まれた🐢の可能性

 メルカリにおけるプラットフォーム主導のKubernetesリソース最適化とそこに生まれた🐢の可能性

sanposhiho

August 03, 2023
Tweet

More Decks by sanposhiho

Other Decks in Programming

Transcript

  1. 2 Mercari JP Platform team / 2022卒新卒 Kubernetes approver (SIG-Scheduling)

    Kubernetes Contributor award 2022 winner Kensei Nakada / sanposhiho
  2. 4 Mercari Kubernetes Cluster Overview Agenda 01 Workloads on cluster

    + About FinOps a. Node Level Optimization 02 Cluster Autoscaling a. Node machine type b. Utilize Spot VM instances c.
  3. 5 Agenda Workload Optimization 03 VPA / Resource recommender a.

    HPA fine tuning b. 🐢を使用したWorkload Autoscaling 04
  4. 8 Workload について - ほとんどがGoで実装されたWorkload - この登壇に含まれる調査結果等はGoのWorkloadと いうことを前提としてください - その他、ElasticSearch,

    php 等も居る - Istioを一部namespaceで使用 (全体の半分ほど) (拡大予定) - sidecarコンテナーがついているPodが割と存在する
  5. 9 FinOps! - 直近メルカリでは全社的な目標としてFinOpsを掲げている - Monolith -> Microserviceのマイグレーションを経 て、アーキテクチャを洗練していくフェーズ -

    Platformチームでもインフラリソースの効率化を推進 - 殆どのサービスが乗っているのでインパクトが超絶大き い - あくまでも安全性を担保しつつ、リソースの効率化を行う
  6. 14 GKE Autoscaling profiles GKE では Autoscaling profile を通して optimize-utilization

    💴 or balanced🛡 を選択できる: - Cluster Autoscaler がどのようにNodeを削除していくか - Aggressive 💴 vs Conservative🛡 - SchedulerがどのようにPodをスケジュールするか - MostAllocated(Bin packing) 💴 or LeastAllocated🛡
  7. 15 GKE Autoscaling profiles Mercariではoptimize-utilization 💴を選択 - Cluster Autoscaler がどのようにNodeを削除していくか

    - Aggressive 💴 vs Conservative🛡 - SchedulerがどのようにPodをスケジュールするか - MostAllocated(Bin packing) 💴 or LeastAllocated🛡
  8. 18 Tau T2D migration いくつかの大きなWorkloadのmachine typeをE2からT2Dに変更 - T2Dのinstance単位の単価はE2よりも高い - しかし、パフォーマンスが高く、多くのWorkloadでCPU使用量の減少を確認

    - プログラミング言語等の様々な要素によってCPU使用量の減少率が違う - Goの場合、大体 ~40%の減少 - HPAが正しく動作している場合、CPU使用量の減少はそのままPod数の減少に つながる → 総合的に見てコスパ 👍👍👍 (migration後のnodepoolではコスト3割削減)
  9. 19

  10. 21 Spot VM instances (検証段階) Spot VMはかなりの低価格で使用可能なインスタンス (60-91% cost down!)

    ただし... 1. GKE側の都合で急に停止される可能性がある 2. いつでも利用可能か保証されていない
  11. 23 Spot VM instances (検証段階) 2. いつでも利用可能か保証されていない    → Spot

    VM Nodeの数が足りずPodがスケジュールできない場合は    on-demand Nodeにスケジュールする (preferred NodeAffinity) また、定期的にon-demand上のPodをSpotへ移動し直すようなコンポーネントを実装予 定
  12. 33 1) Incident時のHPAのScale in問題 - UpstreamのサービスがIncidentで落ちる - Downstreamのサービスに通信が行かなくなる - DownstreamのサービスのCPU使用量が下がる

    この場合にDownstreamのサービスではHPAによるScale inが発生する ↓ Upstreamのサービスが復活した時に、一気にトラフィックが流れてDownstream のサービスが死ぬというインシデントが稀に発生
  13. 40 4) Multiple containers Pod with HPAめんどくさい問題 例: HPAのtarget utilization:

    sidecar: 80%/app container: 80% この場合、HPAはどちらかのcontainerのresource utilizationが80%を 大きく超えた時にスケールアウトを行う。 ↓ これによって、sidecar or app のどちらかのリソースが常に余っているということに なり得る。
  14. 43 4) Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar リソース使用量が増えて いく 50%
  15. 44 4) Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar SidecarのUtilizationが 80%に達したので、HPA はPodの数を増やす 50%
  16. 45 4) Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar 50% Appは30%のリソース余 している…
  17. 47 4) Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar 80% Appのresource request を下げる 同時に80%に達するの が一番リソースの無駄 がない
  18. 50 5) HPAのtarget utilization決めるの難しすぎ問題 HPAのtarget utilizationによって与えられる、「余分なリソース」は - Containerごとのリソース使用量のばらつき - スケールアウトの時間稼ぎ

    の対応のため リソース使用率の平均値が80%だとしても、いくつかのPodではcontainerの使用 率は100%を超えている可能性もある
  19. 52 5) HPAのtarget utilization決めるの難しすぎ問題 0. トラフィックが増えるにつれて、リソース使用量が増えていく 1. リソース使用率が閾値に達する 2. HPAが気がついてスケールアウトを実行する

    3. (Cluster AutoscalerがNodeを増やす) 4. 新しいPodが作られ実際に動き出し、READYになる (1) → (4)にかかる時間の間もリソース使用量が増えているため、 この間の時間稼ぎの必要性
  20. 53 5) HPAのtarget utilization決めるの難しすぎ問題 - Containerごとのリソース使用率のばらつき - トラフィックの増加のスピード - HPA

    controllerのリコンサイルの間隔 - (Nodeに空きができるまでの時間 (via Cluster Autoscaler) - Podが動き出すまでにかかる時間 これらを踏まえて、適切な「余分リソース」をtarget utilizationを通してPodに与え る必要がある
  21. 54 5) HPAのtarget utilization決めるの難しすぎ問題 - Containerごとのリソース使用率のばらつき - トラフィックの増加のスピード - HPA

    controllerのリコンサイルの間隔 - (Nodeに空きができるまでの時間 (via CA or overprovisioning Pods)) - Podが動き出すまでにかかる時間 これらを踏まえて、適切な「余分リソース」をtarget utilizationを通してPodに与え る必要がある 無理じゃね…?
  22. 55 ここまでの話 1. Incident時のHPAのScale in問題 2. HPAがレプリカ増やしすぎる問題 3. HPAがレプリカ全然増やさない問題 4.

    Multiple containers Pod with HPAめんどくさい問題 5. HPAのtarget utilization決めるの難しすぎ問題
  23. 56 ここまでの話 1. Incident時のHPAのScale in問題 2. HPAがレプリカ増やしすぎる問題 3. HPAがレプリカ全然増やさない問題 4.

    Multiple containers Pod with HPAめんどくさい問題 5. HPAのtarget utilization決めるの難しすぎ問題 無理じゃね…?
  24. 61 Simplified configuration apiVersion: autoscaling.mercari.com/v1alpha1 kind: Tortoise metadata: name: nginx-tortoise

    namespace: tortoise-poc spec: updateMode: Auto targetRefs: deploymentName: nginx-deployment Deployment name ONLY!
  25. 62 Simplified configuration - ユーザーは対象のdeploymentの指定のみを行う。 - Optional なフィールドはその他少し存在するが基本使 用不要 -

    「コーナーケースのために柔軟な設定を与える」ことはし ない - HPA, VPA, resource req/limの全ては🐢がいい感じに設定する - 一つのTortoiseを設定する => HPA, VPAを全ての
  26. 63 mercari/tortoiseの機能 - HPA optimization - 前章で「無理じゃね…?」と言ってたやつを全部自動で行 う - VPA

    optimization - HPAとVPAがうまいこと同時に動けるように調整 - Emergency mode
  27. 64 Horizontal Scaling 過去の振る舞いを元にHPAを調整し続ける - minReplicas: ½ * {過去数週間の同 時刻の最大レプリカ数}

    - maxReplicas: 2 * {過去数週間の同時 刻の最大レプリカ数} - HPA target utilization: 推奨の値を計 算し、設定
  28. 65 Horizontal Scaling 過去の振る舞いを元にHPAを調整し続ける - minReplicas: ½ * {過去数週間の同 時刻の最大レプリカ数}

    - maxReplicas: 2 * {過去数週間の同時 刻の最大レプリカ数} - HPA target utilization: 推奨の値を計 算し、設定 前述のdynamic minReplicasと 同様の振る舞い
  29. 67 Horizontal Scaling 過去の振る舞いを元にHPAを調整し続ける - minReplicas: ½ * {過去数週間の同 時刻の最大レプリカ数}

    - maxReplicas: 2 * {過去数週間の同 時刻の最大レプリカ数} - HPA target utilization: 推奨の値を計 算し、設定 Bug等の想定外ケースの際に、 無制限にscale upするのを防ぐ
  30. 68 Horizontal Scaling 過去の振る舞いを元にHPAを調整し続ける - minReplicas: ½ * {過去数週間の同 時刻の最大レプリカ数}

    - maxReplicas: 2 * {過去数週間の同時 刻の最大レプリカ数} - HPA target utilization: 推奨の値を 計算し、設定 How?
  31. 75 Tortoise のresource utilization計算の仕組み 80% 80% App Sidecar 50% 実際にはPodごとに利

    用率のばらつきがある + Scale upが完了するま でラグがある
  32. 79 Tortoise のresource utilization計算の仕組み 80% 90%-80% = 10% App Sidecar

    10%が必要な余分リソース → target utilization: 90%がベスト 50%
  33. 80 Horizontal Scaling 過去の振る舞いからコンテナサイズも調整: - ほぼ常にレプリカ数が3で、リソース使用率 が小さい時、一時的にVerticalに切り替 え、HPAが動作するようにする - 現在のコンテナサイズが小さく、かつピーク

    時にレプリカ数が多すぎる傾向にあると、コ ンテナサイズを大きくする - 片方のコンテナのリソース使用率が常に小 さい時、そのコンテナサイズを小さくする
  34. 81 Horizontal Scaling 過去の振る舞いからコンテナサイズも調整: - ほぼ常にレプリカ数が3で、リソース使用率 が小さい時、一時的にVerticalに切り替 え、HPAが動作するようにする - 現在のコンテナサイズが小さく、かつピーク

    時にレプリカ数が多すぎる傾向にあると、コ ンテナサイズを大きくする - 片方のコンテナのリソース使用率が常に小 さい時、そのコンテナサイズを小さくする
  35. 83 Horizontal Scaling 過去の振る舞いからコンテナサイズも調整: - ほぼ常にレプリカ数が3で、リソース使用率 が小さい時、一時的にVerticalに切り替 え、HPAが動作するようにする - 現在のコンテナサイズが小さく、かつピーク

    時にレプリカ数が多すぎる傾向にあると、コ ンテナサイズを大きくする - 片方のコンテナのリソース使用率が常に小 さい時、そのコンテナサイズを小さくする
  36. 85 Horizontal Scaling 過去の振る舞いからコンテナサイズも調整: - ほぼ常にレプリカ数が3で、リソース使用率 が小さい時、一時的にVerticalに切り替 え、HPAが動作するようにする - 現在のコンテナサイズが小さく、かつピーク

    時にレプリカ数が多すぎる傾向にあると、コ ンテナサイズを大きくする - 片方のコンテナのリソース使用率が常に小 さい時、そのコンテナサイズを小さくする
  37. 86 [復習] Multiple containers Pod with HPAめんどくさい問題 例: HPAのtarget utilization:

    sidecar: 80%/app container: 80% この場合、HPAはどちらかのcontainerのresource utilizationが80%を大きく超 えた時にスケールアウトを行う。 ↓ これによって、sidecar or app のどちらかのリソースが常に余っているということに なり得る。
  38. 87 [復習] Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar 50% Appは30%のリソース余 している…
  39. 88 [復習] Multiple containers Pod with HPAめんどくさい問題 80% 80% App

    Sidecar 80% Appのresource request を下げる 同時に80%に達するの が一番リソースの無駄 がない
  40. 90 Emergency mode apiVersion: autoscaling.mercari.com/v1alpha1 kind: Tortoise metadata: name: nginx-tortoise

    namespace: tortoise-poc spec: updateMode: Emergency targetRefs: deploymentName: nginx-deployment ←