1 of 92

リアルタイムサーバー運用改善

〜メタバースプラットフォームにおけるEKS運用とDatadog活用によるオートスケール実践〜

2025年11月18日

CloudNative Days Winter 2025

1

1

2 of 92

自己紹介

2

Toshiki Ishii

CTO室インフラチーム所属

ホロアースSRE(2024/10~)

興味: Edge Computing/Peformance Tuning

3 of 92

カバーについて

01

3

3

4 of 92

VTuberの多面的な特性を活かした事業展開

日々の配信やライブイベントを通じて熱量の高いファンコミュニティを拡大。

バーチャルアバターの特性を活かして多面的なコマース展開を行う

多面的なコマース展開

VTuber IP・ファンベースを育成

※1:2025年3月期売上高に占める内訳

※2:月額料金を支払いチャンネルメンバーになり、バッジ・絵文字、限定動画視聴等の特典を得られる制度

※3: YouTubeのライブチャットを利用したライブ配信動画の公開時に視聴者が有料課金を行うことでチャットメッセージを目立たせることができる機能

主な�収益源

主な�コスト項目

サービス�概要

売上構成比 *1(売上高前期比)

配信/コンテンツ

マーチャンダイジング

ライセンス/タイアップ

ライブ/イベント

配信プラットフォームを通じた�ライブ配信

オフライン/オンラインでの�ライブイベント開催

フィジカル/デジタルの�VTuberグッズ販売

メーカー等へのIPライセンスアウトや�タイアップ広告等のプロモーション支援

chメンバーシップ *2 、 Super Chat *3

チケット販売、関連物販

自社/外部ECサイトでの販売

ライセンシーからのロイヤリティ�広告主からのプロモーション料

プラットフォーム手数料、演者分配

ライブイベント制作費、演者分配

販売手数料、グッズ原材料、演者分配

制作費、演者分配

47.3%

(YoY +64.6%)

13.2%

(YoY +29.4%)

18.0%

(YoY +39.1%)

21.5%

(YoY +21.9%)

5 of 92

ホロアースについて

02

5

5

6 of 92

メタバースプラットフォーム「ホロアース」

ゲームとオンラインライブを主軸とした3Dエンターテインメントプラットフォームとして、

世界中の人々が遊び、創造し、稼ぐ、が成立する世界を実現する

6

© COVER Corp.

VTuber

ユーザー

ライブ・コンサート

ファン・ミーティング

アバター衣装等の仮想空間内

アセットの製作・販売

人気アニメーターによる

アバター・衣装デザイン

7 of 92

メタバースプラットフォーム「ホロアース」

ユーザー間コミュニケーションを楽しめるオープンワールドプラットフォームとして、弊社ホロライブのタレントが降臨するイベントを積極開催中

7

8 of 92

SREのロードマップと課題

03

8

8

9 of 92

ホロアースSREロードマップ

9

2025/4

2025/10

2026/4

2024/10

サーバーサイドのテレメトリデータを

Datadogへ集約

UGCリリースの

負荷試験・インフラ構築支援

API Gateway/Database移行によるインフラの再構築

監視基盤構築/インフラ構築支援

インフラ構成の見直しと

プラットフォームエンジニアリング

SLI/SLO

導入推進

クライアントサイドへのSentry導入

リアルタイム通信の

Kubernetesの運用改善

アラート運用改善

エラートラッキング実装

SLO導入計画策定

UJの洗い出しと成功率の可視化

新規リリースのインフラ構築支援

2024年10月から最終目標のSLI/SLOアラートの運用を見据えて、監視基盤およびインフラ構成の見直しやプラットフォームエンジニアリングを進めている

10 of 92

ホロアースSREロードマップ

10

2025/4

2025/10

2026/4

2024/10

サーバーサイドのテレメトリデータを

Datadogへ集約

UGCリリースの

負荷試験・インフラ構築支援

API Gateway/Database移行によるインフラの再構築

監視基盤構築/インフラ構築支援

インフラ構成の見直しと

プラットフォームエンジニアリング

SLI/SLO

導入推進

クライアントサイドへのSentry導入

リアルタイム通信の

Kubernetesの運用改善

アラート運用改善

エラートラッキング実装

SLO導入計画策定

UJの洗い出しと成功率の可視化

新規リリースのインフラ構築支援

2024年10月から最終目標のSLI/SLOアラートの運用を見据えて、監視基盤およびインフラ構成の見直しやプラットフォームエンジニアリングを進めている

11 of 92

ホロアースSREロードマップ

11

2025/4

2025/10

2026/4

2024/10

サーバーサイドのテレメトリデータを

Datadogへ集約

UGCリリースの

負荷試験・インフラ構築支援

API Gateway/Database移行によるインフラの再構築

監視基盤構築/インフラ構築支援

インフラ構成の見直しと

プラットフォームエンジニアリング

SLI/SLO

導入推進

クライアントサイドへのSentry導入

リアルタイム通信の

Kubernetesの運用改善

アラート運用改善

エラートラッキング実装

SLO導入計画策定

UJの洗い出しと成功率の可視化

新規リリースのインフラ構築支援

2024年10月から最終目標のSLI/SLOアラートの運用を見据えて、監視基盤およびインフラ構成の見直しやプラットフォームエンジニアリングを進めている

システムの安定稼働のためにリアルタイムサーバーの運用を見直すことが最優先に

(タレント降臨に伴う負荷増加に耐える必要が出てきた)

12 of 92

現在のシステム構成

12

13 of 92

現在のシステム構成

13

クライアント

・ホロアース(Desktop App): Unity

・クリエイター用ツール(Web): React, WebGL

メインのホロアースを遊ぶためのUnityビルドとUGCコンテンツを作成するためのWebサイトを開発・運用

14 of 92

現在のシステム構成

14

各種テレメトリデータはクライアント・サーバーごとそれぞれ監視Saasへ集約

クライアントサイド:Sentry

サーバーサイド:Datadog

15 of 92

現在のシステム構成

15

●API サーバー

●リアルタイムサーバー

各機能ごとに別々のサーバーチームで開発・運用

16 of 92

現在のシステム構成

16

ここの話

17 of 92

一般的なゲームサーバーとKubernetes

17

・ゲームサーバーはステートフルなため負荷分散が難しい

 →Node IP経由でPodとUDP直接通信を行い、Ingress等での負荷分散が難しい

・ゲームクライアントは特定のゲームサーバーインスタンスに直接接続する

 →一部のCaaSではNode IPの利用に制約があり、ゲームサーバー運用に不向き

・大量のNode(VM)の管理を行う必要がある

 →KubernetesによるNodeプロビジョニングを活用したい

18 of 92

Diarkis(Room)について

18

Statefulなサーバー運用を簡素化できる仕組みを提供する商用ソフトウェア

・UDPでの高速な通信/HTTPによる接続先分散/MARSによるサーバーメッシュ

・サーバーサイドへのカスタムゲームロジックの記述

・同接数等取得のためのメトリクス生成(Prometheus)

・Goのバイナリのためポータビリティが高い

19 of 92

ホロアースのリアルタイムサーバー

19

ホロアースで利用している位置同期システムのこと

・DiarkisのRoomモジュールを利用し、EKS上で運用している

20 of 92

ホロアースでのDiarkisユースケース

20

同一Room内のユーザー間へのパケット(座標やエモート等のイベント)のブロードキャストを行っている

21 of 92

ホロアースにおけるEKS運用の課題

21

2025年の年始当時に抱えていた課題

  • リアルタイムサーバーとしての安定運用に難あり
    • 2025年4月にホロアースがv1.0としてリリース
      • これを機にタレントの協業を進めホロアースのユーザーを拡大していく方針へ
      • 大量のユーザーの流入・大型のアップデートが潜む中が、大規模なトラフィックに対応できる構成・運用体制ではなかった
  • 開発生産性・運用体制に難あり
    • EKSを運用できる人員が不足しており2023年ごろからほとんど塩漬けだった
      • Cluster/Addon等のアップデートや構成管理は全て手動(eksctl)
      • Github上のマニフェストの状態が稼働しているClusterの状態と一致しておらずいつ事故が起きてもおかしくない状況だった

22 of 92

ホロアースにおけるEKS運用の課題

22

2025年の年始当時に抱えていた課題

  • リアルタイムサーバーとしての安定運用に難あり
    • 2025年4月にホロアースがv1.0としてリリース
      • これを機にタレントの協業を進めホロアースのユーザーを拡大していく方針へ
      • 大量のユーザーの流入・大型のアップデートが潜む中が、大規模なトラフィックに対応できる構成・運用体制ではなかった
  • 開発生産性・運用体制に難あり
    • EKSを運用できる人員が不足しており2023年ごろからほとんど塩漬けだった
      • Cluster/Addon等のアップデートや構成管理は全て手動(eksctl)
      • Github上のマニフェストの状態が稼働しているClusterの状態と一致しておらずいつ事故が起きてもおかしくない状況だった

まずはSREチームの管理下に置き塩漬け状態を脱却することで、Kubernetes運用における最低限のセルフサービス化を目指す

23 of 92

ホロアースにおけるEKS運用の課題

23

ホロアースの状況をプラットフォームエンジニアリングの成熟度モデルに当てはめ、SRE・ホロアース開発チーム双方が協業していけるような構想をした

https://tag-app-delivery.cncf.io/whitepapers/platform-eng-maturity-model/#model-table

SREチームが専任としてEKSクラスタの運用に責任を持ち開発者との運用境界を定める

ArgoCD等、業界標準のCI/CDツールの整備から既存の運用フローを再構築し直す

共通で利用可能なインフラとしてTerraformによるIaC化とCRDの導入を進める

開発チームが自立して横断リソースを運用できるようなドキュメンテーションする

DatadogをEKSへ導入し、計測値を元に議論しながら改善を進められるようにする

24 of 92

EKSプラットフォームへの道のり

04

24

24

25 of 92

バックログ

25

構想をもとに改善を進めるために大枠の課題を分割した。

1.EKSクラスタの管理の放置問題

2.ワークロードクラスタの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用に向けて

26 of 92

バックログ

26

構想をもとに改善を進めるために大枠の課題を分割した。

1.EKSクラスタの管理の放置問題

2.ワークロードクラスタの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用に向けて

27 of 92

1.EKSクラスタの管理の放置問題 - 改善前の当時のEKSの状況

27

当時はeksctl create cluster後、ほぼ何もしていない状態のEKSが塩漬けになって数年放置されていた

  • EKS関連リソースはIaC化されておらず全ての操作はeksctl(CFn)で手動管理
  • EKS Addon/CRDは無し
  • 諸々のバージョンアップグレードに伴う検証フロー未整備
  • GitOpsの未整備

28 of 92

1.EKSクラスタの管理の放置問題 - 目指す形

28

Github上で自動デプロイを行うGitOpsのパイプラインが構成され、開発チームは必要なリソースのみにアクセスできる状態を目指した。

29 of 92

1.EKSクラスタの管理の放置問題 - 改善前の当時のEKSの状況

29

当時はeksctl create cluster後、ほぼ何もしていない状態のEKSが塩漬けになって数年放置されていた

  • EKS関連リソースはIaC化されておらず全ての操作はeksctl(CFn)で手動管理
  • EKS Addon/CRDは無し
  • 諸々のバージョンアップグレードに伴う検証フロー未整備
  • GitOpsの未整備

30 of 92

1.EKSクラスタの管理の放置問題 - Terraform化

30

EKSはClusterごと入れ替えるのを前提にTerraformによるIaC化を推進

またこのタイミングで導入するCustom Resourceを選定

[Terraform管理対象]

EKS Cluster/Managed NodeGroup

EKS Addon

・kube-proxy

・VPC CNI plugin

・CoreDNS

・Pod Identity agent

・EBS CSI Driver�・Helm� ・AWS Load balancer controller

・Karpenter

[Terraform管理対象](基本はhelmfile)

管理対象以外のHelmリソース

・External Secrets

・External DNS

・KEDA

・Datadog

31 of 92

1.EKSクラスタの管理の放置問題 - Terraform化

31

EKSはClusterごと入れ替えるのを前提にTerraformによるIaC化を推進

またこのタイミングで導入するCustom Resourceを選定

[Terraform管理対象]

EKS Cluster/Managed NodeGroup

EKS Addon

・kube-proxy

・VPC CNI plugin

・CoreDNS

・Pod Identity agent

・EBS CSI Driver�・Helm� ・AWS Load balancer controller

・Karpenter

EKS Auto Modeを参考にSREチームの管理下におくリソースを定義

[Terraform管理対象](基本はhelmfile)

管理対象以外のHelmリソース

・External Secrets

・External DNS

・KEDA

・Datadog

利用ベンダー、CNCFコミュニティの成熟度を元に最低限のCustom Resourceのみを導入

32 of 92

1.EKSクラスタの管理の放置問題 - tfactionの導入

32

Terraformはモノレポで管理し、Terraform実行フローはtfactionをベースに作成

エントリーポイントごとにjobの並列実行/lockfileの自動更新/trivy, tflintスキャンの実行

33 of 92

1.EKSクラスタの管理の放置問題 - RenovateによるTerraform/Helmの更新

33

Renovateのdefault.jsonを作成し、Org内の複数のRepositoryで共通設定を利用

minReleaseAgeの指定/Group化によるPR数削減/ActionsのCommit hashの固定

34 of 92

1.EKSクラスタの管理の放置問題 - 改善前の当時のEKSの状況

34

当時はeksctl create cluster後、ほぼ何もしていない状態のEKSが塩漬けになって数年放置されていた

  • EKS関連リソースはIaC化されておらず全ての操作はeksctl(CFn)で手動管理
  • EKS Addon/CRDは無し
  • 諸々のバージョンアップグレードに伴う検証フロー未整備
  • GitOpsの未整備

35 of 92

1.EKSクラスタの管理の放置問題 - ArgoCDの導入

35

開発環境、本番環境それぞれにOpsClusterとしてArgoCD用のEKSを構築

・1つのClusterから複数アカウントのワークロードクラスタを管理

各環境にArgoCDをインストールするのは手間

・dev

・test

・qa

・....

36 of 92

1.EKSクラスタの管理の放置問題 - ArgoCD Image Updaterの導入(v0.x)

36

各環境のベースブランチに対してPRを作成するようにImage Updaterを構成

・ApplicationSetでnewest-buildを指定

→同一のコミット内容でコミットハッシュが別のPRができてしまう問題があるため、各アプリケーション単位でブランチを固定

<env>環境の<Application>に対してのImage Tagの更新と分かるようでPRを作成

37 of 92

1.EKSクラスタの管理の放置問題 - ArgoCDに対する最低限のRBAC

37

Github Teamをベースとしてアクセス可能なApplicationを制御

・Custom ResourceはSREチームのみ、ワークロードのApplicationは各チーム管理

38 of 92

1.EKSクラスタの管理の放置問題 - マニフェスト/Helm管理

38

マニフェストはKustomize + Helmfileのシンプルな構成

・開発チーム/SREチームのそれぞれのリポジトリで管理

・各チームのアプリケーションはApplicationSet管理

・preserveResourcesOnDeletion:on/autoSync:off

・helmfile

・+αリソースはraw chartを利用し一括管理

・各種Security設定はSAST(弊チームメンバー製)+Trivyで検査

https://note.cover-corp.com/n/n39460f36d3ac

39 of 92

1.EKSクラスタの管理の放置問題 - Cluster管理

39

OpsClusterではEKS Auto Modeを使用

・管理工数を可能な限り下げたい(EKSの面倒を見れる人が少ない)

・現状管理用のクラスタのユースケースは限られており導入しやすい

・一部ワークロードの制約

・Fargateの利用

・Security for Podsの利用

・ノードの自動削除を許容できない(21日間)

Auto Mode採用

Auto Mode未使用

40 of 92

1.EKSクラスタの管理の放置問題 - 振り返り

40

変更容易性を手に入れワークロードクラスタに対してテコ入れがしやすくなった

Terraformでリソースを管理を統一できたことで、マルチアカウントのEKSクラスタ、アドオンのバージョンを容易に統一可能に

Org横断で利用可能なRenovateやtfactionのReusable Workflowの定義により、簡単なセットアップでセキュリティ、バージョン管理が可能に

Custom Resourceはhelmfileで管理し、ManifestはArgoCD管理下に置くことでGithubをSSoTとしたデプロイ基盤を構築

41 of 92

バックログ

41

構想をもとに改善を進めるために大枠の課題を分割した。

1.EKSクラスタの管理の放置問題

2.ワークロードクラスタの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用における課題への対応

42 of 92

2.ワークロードクラスタの内部状態の可視化 - メトリクス

42

ホロアースリアルタイムサーバーとして観測可能なメトリクスとして下記がある

・一般的なKubernetesのメトリクス(CPU, Memory...etc)

・Custom Resourceのメトリクス(KEDA, Karpenter...etc)

・Diarkisがデフォルトで提供するメトリクス(Room数、パケット数...etc)

・Diarkisに登録したカスタムメトリクス(各エリアの人数、メッセージ数...etc)

https://help.diarkis.io/diarkis-server/metrics-api

43 of 92

2.ワークロードクラスタの内部状態の可視化 - Datadog Operator

43

Datadog Operatorを導入し、各Podレベルの状態を観測可能にする

・各NodeへDaemonSetとしDatadog Agentとして配置

・Datadog Cluster Agent経由でDiarkisのPrometheusのエンドポイントからメトリクスを収集

※リアルタイムに変わる指標取得するためエンドポイントへのアクセスは4~5秒に一回実行している

44 of 92

2.ワークロードクラスタの内部状態の可視化 - Datadog Tracing

44

Tickに対して計装を行いカスタムロジックを観測可能な状態にする

※サーバーが一定間隔でゲーム状態を更新する処理

ex)TickのカスタムロジックではRedisに対してRoom情報を同期している、ユーザー影響が大きい箇所には計装を行いエラー率およびレイテンシを監視

45 of 92

2.ワークロードクラスタの内部状態の可視化 - Trace Agentの分離

45

APMを有効化したDatadog AgentはDatadog のバックエンド(SaaS)へトレースを送信したホストがAPM Hostとしてカウントされる

・デフォルトだとNode数分がAPM Hostとしてカウントされコストが高い

→アプリケーションPodからのTraceの送信先を統合する(Trace Agentを切り出す)

46 of 92

2.ワークロードクラスタの内部状態の可視化 - ダッシュボードとアラート

46

同接数、ワークロードのパケット数(IN/OUT)、CPU Usage等の指標を収集し、

ダッシュボード・Slackへアラート・オートスケールに活用をしている

47 of 92

2.ワークロードクラスタの内部状態の可視化 - 振り返り

47

EKSにDatadogを導入したことでリアルタイムサーバーも含め観測可能な状態となった

Diarkis/Kubernetes どちらのメトリクス・トレースを収集することができ、リアルタイムサーバーのボトルネックの調査が可能に

ダッシュボード・アラートを整備することで、開発チームも簡単にリアルタイムサーバーの状態を確認可能に

48 of 92

バックログ

48

構想をもとに改善を進めるために大枠の問題を分割し進めた。

1.EKSクラスタの管理の放置問題

2.Kubernetesの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用に向けて

49 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - Room管理

49

ホロアースでは様々なエリアがあり、そのほとんどのエリアの1Roomが1Node上の1Podに対して割り当てられるようになっている※ユーザーが遊んだり交流できる場所

50 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - Room管理

50

Diarkis Roomの制約上、位置同期は同じRoom(Hostnetworkが有効化されたPod)に対して行われる

・Diakisはリレーサーバーのような使い方をしているため、人数に比例してサーバー側のI/Oの負荷が高くなる

51 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - Room管理

51

過去ホロアースにおいてはc5n.4xlarge EC2インスタンスにおいて秒間アウトバウンドのパケット処理数が24万あたりを超えると、経験則的に安定運用ができないとされていた。

n: Room内のプレイヤー数

f: 同期頻度(updates/second)

インバウンド(クライアント→サーバー): PPS_in = n × f

アウトバウンド(サーバー → クライアント): PPS_out = PPS_in× (n - 1)

PPS_total = n² × f となり大体O(n^2)でパケットの量が指数関数的に増加する

実数値を当てはめるとn=200人, f=6回

PPS_total=24万Pakets/second 経験に基づくと1Roomあたり200人が限界...?

52 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - 計測1

52

[計測1]

c5n.4xlargeで200人(動き続けるBOT)を1Roomへ投入、ネットワークのIN/OUTの状態を計測

[結果1]

200人到達前にユーザーがルームから追い出され計測が中断された。

追い出し時に下記のENAドライバーのメトリクスは特に観測されなかった。

・bw_in_allowance_exceeded

・bw_out_allowance_exceeded

・pps_allowance_exceeded

・CPU使用率は40~50%程度

→NICのI/Oではなくアプリケーション側に問題があると判断、暫定的な対応として1Roomの上限人数を設定し運用を行うことにした。

53 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - 計測2

53

[計測2]

c5n.4xlarge ~ c5n.xlargeで100人(動き続けるBOT)を投入、ネットワークのIN/OUTの状態を計測

[結果2]

どのパターンも下記のENAドライバーのメトリクスは特に観測されなかった。

・bw_in_allowance_exceeded

・bw_out_allowance_exceeded

・pps_allowance_exceeded

CPU使用率は4xlarge:5%, 2xlarge:10%, xlarge:20%とコア数に対してほぼ線形に推移していた。

→Diarkis社と相談しピークのCPU使用率が20%程度で運用するのが良いと判断したため、

1Room 100人を上限としてc5n.xlargeでUDPサーバーのインスタンスで運用を決断

54 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - 帯域幅

54

EC2にはベースライン/バースト帯域幅があり、c5n系ではバースト帯域幅は同じでもベースライン帯域幅に差がある。

今回はNetworkOutの合計が最大で2GB/min程度であったため、帯域幅の差は運用に問題はないという判断だった。

https://docs.aws.amazon.com/ja_jp/ec2/latest/instancetypes/co.html#co_network

55 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - 最新の機能

55

最新のホロアースでは、タレントのみ複数のRoom間の状態を同期する仕組みがリリースされている

・Roomに対しての人数制限があったとしてもタレントとユーザーの交流が可能な仕組みが実装されている

https://holoearth.com/news/ver110-update/

56 of 92

3.Room管理とインスタンスのサイジングによるコスト適正化 - 振り返り

56

EC2のサイジングを行なったことにより、EKSのコストを大幅に下げることができた。

c5n.4xlargeからc5n.xlarge系のEC2インスタンスの変更により、AWSの料金の大幅削減を行うことができた

ENAドライバーのメトリクスまで収集できたことで、今後の運用の際に観測するべき指標を整理することができた

57 of 92

バックログ

57

構想をもとに改善を進めるために大枠の問題を分割し進めた。

1.EKSクラスタの管理の放置問題

2.Kubernetesの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用に向けて

58 of 92

4.オートスケールの改善

58

ホロアースではピークタイム以外で以下の2パターンのスケールが起こりうる

・事前に予定されたイベント: タレントの降臨祭等

・突発のイベント: Youtubeでのタレントのホロアース配信等

59 of 92

4.オートスケールの改善

59

ホロアースではピークタイム以外で以下の2パターンのスケールが起こりうる

・事前に予定されたイベント: タレントの降臨祭等

・突発のイベント: Youtubeでのタレントのホロアース配信等

事前に予測できるものではないため

オートスケールが必須

60 of 92

4.オートスケールの改善 - 元々のオートスケール運用

60

UDP PodのCPUの使用率は低めにでる傾向があり、一般的なCPUベースのHPA+Cluster Autoscaleだと高速にかつ精度よくRoomを増やすことが非常に難しい

・ユーザーが動かなければ位置同期の必要がない

・ユーザーはコストの高い動きを常にするわけではない(エモート等)

→不要な同期の処理が減り、CPUの使用率が下がる

61 of 92

4.オートスケールの改善 - 元々のオートスケール運用

61

UDP PodのCPUの使用率は低めにでる傾向があり、一般的なCPUベースのHPA+Cluster Autoscaleだと高速にかつ精度よくRoomを増やすことが非常に難しい

・ユーザーが動かなければ位置同期の必要がない

・ユーザーはコストの高い動きを常にするわけではない(エモート等)

→不要な同期の処理が減り、CPUの使用率が下がる

CPU使用率は低いが

Roomの人数は満員に近い状況があり得る

62 of 92

4.オートスケールの改善 - Datadogのカスタムメトリクスの利用

62

UDPサーバーにおいてRoom数を正確にスケールアウトさせるためにDatadogMetricを定義する

・Roomに対するカスタムメトリクスを新規に定義

・各エリアごとの合計人数

・各Roomに対して1人以上の参加者がいる合計Room数

[Room占有率]

・1ルームあたりの平均参加者数の割合

クエリ: 各エリアごとの合計人数

/ 各エリアのRunningのPod数 × Room数 >= 0.5

[アクティブRoom率]

・全ルームのうち、参加者がいるルーム数の割合

クエリ: 各エリアごとの参加者がいるRoom数

/ 各エリアのRunningのPod数 × Room数 >= 0.5

63 of 92

4.オートスケールの改善 - KEDAを導入

63

下記のどちらのパターンにも柔軟に対応するためにKEDAの導入を検討

・事前に予定されたイベント: タレントの降臨祭等: Metrics API

・突発のイベント: Youtubeでのタレントのホロアース配信等: Datadog Scaler

→複数のTriggerを組み合わせ柔軟なスケールを行うことができる

https://keda.sh/docs/2.18/scalers/metrics-api/

https://keda.sh/docs/2.18/scalers/datadog/

64 of 92

4.オートスケールの改善 - KEDAとDatadogを連携(Datadog Scaler)

64

DatadogのTriggerを構成し、各エリアごとに定義されたDatadogMetricを評価する

(評価間隔はHPAと同じ15秒、現状EKSでは15秒以下にはできない。https://github.com/aws/containers-roadmap/issues/1809)

・Cluster Agent Proxyを利用: Datadog APIのレート制限を考慮

・データの収集: Cluster Agent側の構成で4~5秒でカスタムメトリクスを収集

・Cluster Agent <-> KEDA間はBound Service Account Tokensを利用しTokenの管理を簡素化

65 of 92

4.オートスケールの改善 - KEDA(Metrics API Scaler)と管理用APIを連携

65

Metrics APIのTriggerを構成し、APIのレスポンスに定義されたレプリカ数へスケールさせられるようにする

External metrics(MetricsType: Value)では、

desiredReplicas = ceil(currentMetricValue / targetValue)

計算式で評価されるため、targetValue1に設定しておくことでAPIレスポンスの値がそのままDesiredReplica数となり、マニフェストを触らずにPodをスケールさせられる

66 of 92

4.オートスケールの改善 - Karpenter検討

66

元々はCluster Autoscalerを活用していたが、Auto Modeの登場や移行事例等を踏まえ、ホロアースのユースケースにも合致していたためKarpenterの導入を検討

・EC2 Fleet APIを直接コールするためEC2の起動が早い

・NodePoolごとに細かくDisruptionを制御できる

https://aws.amazon.com/jp/blogs/news/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/

67 of 92

4.オートスケールの改善 - Karpenter導入

67

ホロアースにおいてはNodeの管理コストを下げ、細かい中断制御を行うためにKarpenterを全てのクラスタへ導入を行なった

[導入背景]

管理面

・ UDP用のNodeGroupがエリアごとに定義されておりManaged NogeGroupの管理が煩雑になっていた

コスト面

・開発環境でSpotインスタンスが活用できていなかった

その他

・UDPサーバーはNode単位のスケールアウトとなるため、EC2の起動速度を改善させたかった

・本番環境の中断時間を細かく制御したかった

68 of 92

4.オートスケールの改善 - Karpenter運用考慮点

68

NodeClass

・IMDSを利用しているためホップカウントを2に設定

・AMIを固定(AMIの更新AL2→AL2023でNIC名が変更)

・[開発環境]maxPodsを調整しIPの割り当て数を増加(VPC CNI のPrefix Delegationを有効化)

NodePool

・[開発環境]Spot Instanceを優先的に使用

・Diarkisの各コンポーネントごとにNodePoolを分割しインスタンスタイプを割り当てる

expireAfter: Neverで運用、イベント時にNodeの入れ替えが起きないようにしている

※AutoModeでは21日の生存期間があるが、メンテナンス時間をコントロールできず導入を断念した

・[本番環境]DisruptionはDiarkisのWorkload Podが存在しない場合 & ピーク時間以外のみ行う

・consolidationPolicy: WhenEmpty

・budgets: 特定時間内のみ許可、nodeは1台ずつ減らす(それ以外は0台)

69 of 92

4.オートスケールの改善 - 本番環境のスケールイン運用

69

KEDAのScaleDown PolicyはCronJobによって特定時間のみ有効化

70 of 92

4.オートスケールの改善 - 本番環境のスケールイン運用

70

スケールアウトしたPod及びNodeを特定時間内のみスケールインするようにしている

・Node(Karpenter): terminationGracePeriod

・Pod: terminationGracefulPeriodSeconds

・Diarkis: DIARKIS_SHUTDOWN_TIMEOUT

スケールインが許可される時間帯の場合:

PodにSIGTERM

猶予時間(セッションは維持される)

PodにSIGKILL

Node削除

[Consolidation]

WhenEmptyの状態のNodeから1Nodeずつ削除

71 of 92

4.オートスケールの改善 - 振り返り

71

KEDAとKarpenterによってオートスケールの最適化を行うことができた

KEDA導入により複数のtriggerを設定し、柔軟にオートスケールを調整可能に

カスタムメトリクスの活用によってDiarkisのワークロードにあったスケール方法を定義が可能に

Karpenter導入によってNodeのプロビジョニングが大幅に改善し、NodePoolの管理とコストの削減に

72 of 92

バックログ

72

構想をもとに改善を進めるために大枠の問題を分割し進めた。

1.EKSクラスタの管理の放置問題

2.Kubernetesの内部状態の可視化

3.Room管理とインスタンスのサイジングによるコスト適正化

4.オートスケールの改善

5.大規模利用に向けて

73 of 92

5.大規模利用に向けて - 大型イベントに関して

73

ホロアースのイベント時、リアルタイムサーバーの同接は数千人以上となる

特にタレントが絡む場合は特定エリアと移動先に負荷が集中するため、移動対象となるエリアは基本的に全てのエリアを事前にスケールアウトさせておく必要がある

同接数 / (100人/Room) ×エリア数 ≒ Node数

例えば移動対象が5エリアあり、3000人の同接が予想される場合は150Node程度あらかじめ起動させる必要がある

74 of 92

5.大規模利用に向けて - PodとNodeの配置と可用性

74

AZは3つに分散し、DeploymentにpodAntiAffinityを設定

・1Node 1 Pod(UDP)として扱うようにしている

ZoneA

ZoneB

ZoneC

Area A

Area B

Area C

Area A

Area C

Area A

Area B

Pod Topology Spread Constraints(maxSkew:1, whenUnsatisfiable: ScheduleAnyway)を設定し、可能な限りZone分散を行う

75 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

75

イベント時にDiarkisのPrometheus Endpoint(via Service)が遅延が発生

[当時の状況]

・Cluster AgentからDiarkisへのリクエストがTimeOut

→メトリクスの収集ができず、オートスケール、ダッシュボードが停

→暫定でタイムアウトを伸ばしたが、1データポイントの取得に1分以上かかっていた...

76 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

76

開発環境で複数のパターンで負荷実験を行い原因を調査

・Room数/Node(Pod)数それぞれを増やすパターンで検証

time curl -s http://<svc>/metrics/prometheus/v/3を実行し、平均をとる

77 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

77

開発環境で複数のパターンで負荷実験を行い原因を調査

・Room数/Node(Pod)数それぞれを増やすパターンで検証

time curl -s http://<svc>/metrics/prometheus/v/3を実行し、平均をとる

Node数の増加がレイテンシ増加の主要因であることがわかった

78 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

78

根本原因を探るためにNode数を増やした状態で、HTTP Serverに対してプロファイリングを実施

・pprofを仕込み計測

79 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

79

根本原因を探るためにNode数を増やした状態で、HTTP Serverに対してプロファイリングを実施

・pprofを仕込み計測

内部の文字列の結合処理が負荷を与えていることが判明

→GOGC or GOMEMLIMITをいじってGCの頻度を調整

→最終的にDiarkis社と相談し、パッチを当ててもらいメトリクスの計算の内部ロジックを差し替えた

80 of 92

5.大規模利用に向けて - パフォーマンス問題1 メトリクス収集の遅延

80

結果HTTP Serverへの負荷偏りは消え、メトリクス収集の遅延は解消された

・1PodにCPU負荷が集中してしまっていたために、水平分散が適切に行えていなかった問題も同時に解決

HTTP Server用のNodePoolの見直しPodのCPU Requestを調整しコスト削減、可用性向上に繋がった

81 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

81

イベント時にCoreDNS全体への負荷が非常に高くなる現象が起きていた

[当時の状況]

・事前スケールアウト中(2000人~)にCoreDNSのCPUの使用率が100%付近に...

・直後にイベントを控えていたため、この時は直接Replica数を増やして緊急対応...

82 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

82

UDPサーバーを増やした際にCoreDNSの負荷が増加することはわかっていたため、状況を再現し原因調査を進めた

・CoreDNSはデフォルトの2Replicaのまま、UDPサーバーの台数を増やし調査

CoreDNSのmetricsのエンドポイントにcurl

83 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

83

UDPサーバーを増やした際にCoreDNSの負荷が増加することはわかっていたため、状況を再現し原因調査を進めた

・CoreDNSはデフォルトの2Replicaのまま、UDPサーバーの台数を増やし調査

→CoreDNSのmetricsのエンドポイントにcurl

NOERROR: 517,036回

NXDOMAIN: 1,993,104回

※該当するドメイン名が存在しない

存在しないドメインに対してのアクセスが集中していた

84 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

84

UDPサーバーを増やした時に負荷増加するため、UDPのPodからのアクセス先を確認

/etc/resolv.confを確認したところ、search対象のドメインとndots:5が指定されていた(デフォルト値)

85 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

85

UDPサーバーを増やした時に負荷増加するため、UDPのPodからのアクセス先を確認

/etc/resolv.confを確認したところ、search対象のドメインとndots:5が指定されていた(デフォルト値)

ドットの数が 5未満の場合にサーチリストに指定されているドメインを末尾に追加して名前解決

結果として存在しないドメイン名へのアクセスが大量発生していた

86 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

86

UDPサーバーを増やした時に負荷増加するため、UDPのPodからのアクセス先を確認

/etc/resolv.confを確認したところ、search対象のドメインとndots:5が指定されていた(デフォルト値)

ドットの数が 5未満の場合にサーチリストに指定されているドメインを末尾に追加して名前解決

結果として存在しないドメイン名へのアクセスが大量発生していた

UDPのPodが増えるとMarsのServiceに対しての名前解決が大量発生していたことが判明

→DeploymentのdnsConfigをndots: 1として設定し、

常にFQDNとして解決されるように修正

87 of 92

5.大規模利用に向けて - パフォーマンス問題2 CoreDNSの負荷

87

同等の対応をDatadogのNodeAgent等にも行うことで、NXDOMAINの数はほぼ0となり、Replica数2の状態でCoreDNSのCPU使用率はピーク時の1/4程度

CoreDNSはEKS Addonで管理しているため、

Terraformに対してautoScalingの設定を追加し、さらなるPod数の増加にも対応した

88 of 92

5.大規模利用に向けて - 振り返り

88

大規模なNode運用に向けてパフォーマンス上の課題へ対応し、イベントを乗り越えるための基盤を整備ができた

リアルタイムサーバーの可用性を向上させるためにNodeの配置戦略を見直した

大規模イベント時に起きたパフォーマンス上の課題を負荷試験を行いながら改善し、安定運用が可能なようにチューニングを行なった

89 of 92

今後の展望とまとめ

05

89

89

90 of 92

今後の展望

90

開発環境のEKSを1つにまとめ、コストおよび運用の最適化を目指す

・各環境ごとにEKSを運用

・固定バージョン1つのみ

・共通EKSを1つを運用

・namespaceごとにバージョンを可変に

91 of 92

まとめ

91

  • SREチームの管理下でEKSを管理し、開発チームと協力しながら新しいリアルタイムサーバー基盤を構築をした
  • 大規模な運用に備えて信頼性・可用性を向上させるために負荷試験や監視基盤の整備を行なった

92 of 92

Thank You!

92