電通総研 テックブログ

電通総研が運営する技術ブログ

Kubernetesを使ってUnreal Engine Dedicated Serverをスケーラブルに運用する【Part1】

こんにちは!金融ソリューション事業部の孫です。
以前の記事ではUnreal Engine Dedicated Serverの構築方法について紹介しました。
今回は続きの記事として、以下の3部で、AWSが提供するEKSを使用してマッチメイキング機能を持つAgonesでGameServerを運用する環境の構築プロセスを説明します。
なお、EKSはKubernetesクラウドサービスの一つであり、同様のものとして「GoogleのGKE」や「MicrosoftAKS」などが存在します。

以下3記事(Part)に分けて解説します。

Part1:環境設定(「EKS環境構築」と「Agones/Open Matchのインストール」)、および動作確認

Part2:マッチメイキングサービスのカスタマイズ処理を実装します

Part3:UnrealEngineを使用したGameServerとGameClientを用意します、Part2で開発したマッチメイキングサービスをGameClientに統合します。

はじめに

現代のゲーム業界では、Dedicated Serverが重要な要素となっています。あるマルチプレイゲームの裏側では、大量のDedicated Serverを所有しており、プレイヤーに安定かつ効率的なサービスを提供します。
これらのサーバーの管理とスケジューリングは、プレイヤーのゲーム体験に直接影響する重要な問題です。この問題を解決するために、Agonesは登場し、Dedicated Serverの管理とスケジューリングをよりシンプルにするソリューションを提供します。

しかし、専用サーバーの管理とスケジューリングだけでは不十分で、これらのサーバーを効率的に利用するためにはマッチングシステムが必要です。
例えば、同じ地域のプレイヤーが最も近いゲームサーバーにマッチングされることで、彼らのゲーム体験を向上させることを望んでいます。そのため、Open Matchは、柔軟でスケーラブルなマッチングシステムとして生まれました。

したがって、AgonesとOpenMatchは相互補完的な存在です。一方で、AgonesはDedicated Serverの管理とスケジューリングを行い、サーバーの使用効率を向上させます。
一方で、Open Matchは効率的なマッチングアルゴリズムを通じて、プレイヤーを最も適したサーバーにマッチングします。
これら二つは、ゲームに対して柔軟でスケーラブルで効率的なインフラストラクチャを提供します。

これから、このようなインフラストラクチャを作成する方法を3記事に分けてステップバイステップで説明します。

実行環境

実施手順

以下の手順で環境を構築し、テストを行います。

  1. EKSの環境構築
  2. Agonesのインストール
  3. Openmatchのインストール
  4. 動作確認

1.EKSの環境構築

EKSの構築方法については、AWS公式ドキュメントの「Amazon EKS の開始方法」に従って以下の手順を実施します。

  1. EKS展開用のネットワーク環境を作成する
  2. Kubernetesクラスタを作成する
  3. クラスタのノードグループを作成する

これから、EKSの構築を実施します。

  • a.EKS展開用のネットワーク環境を作成する

今回は検証目的のため、公式サイトで推奨されるネットワークアーキテクチャ(PrivateとPublicの構造)は使用せず、2つのPublicネットワークのみを設定します。
実施結果を確認します。

VPC CIDR: 192.168.0.0/16
Subnet:
$ aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=[VPC ID]" \
    --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \
    --output table
--------------------------------------------------------------------
|                          DescribeSubnets                         |
+------------------+------------------+----------------------------+
| AvailabilityZone |    CidrBlock     |         SubnetId           |
+------------------+------------------+----------------------------+
|  ap-northeast-1a |  192.168.0.0/24  |  パブリックサブネットID1     |
|  ap-northeast-1c |  192.168.1.0/24  |  パブリックサブネットID2     |
+------------------+------------------+----------------------------+

ここでは、クラスタを作成する方法として「eksctl」と「マネジメントコンソール」の2つの選択肢があります。
初心者がステップバイステップで進めたい場合は後者のマネジメントコンソールを使用することをおすすめしますが、今回は手間を省略するためにeksctlコマンドを使用してクラスタを作成します。
以下のコマンドを使用してクラスタを作成しますが、「クラスタ名」・「パブリックサブネットID1」・「パブリックサブネットID2」はそれぞれ実際のクラスタ名とパブリックサブネットIDに置き換えてください

# コマンドガイドライン
## https://eksctl.io/usage/vpc-configuration/#use-existing-vpc-other-custom-configuration
eksctl create cluster --name 「クラスタ名」\ 
          --region ap-northeast-1 \ 
          --without-nodegroup \ 
          --vpc-public-subnets=[パブリックサブネットID1],[パブリックサブネットID2]

NodeGroupをAWSコンソールを介して作成する場合、まず一連のロールを設定する必要があります。手続きを簡略化するために、今回も引き続きeksctlコマンドを使用してNodeGroupを作成します。

以下のコマンドを使用してNodeGroupを作成します。「クラスタ名」「ノードグループ名」はそれぞれ希望する名前に置き換えてください。
※次にOpen Matchをインストールしますが、インストールコマンドを簡略化するために、デフォルトの設定を使用します。このため、最低でも3つ以上のCPUが必要となりますので、今回はt3.xlargeタイプのサーバを選択します。

# コマンドガイドライン
## https://eksctl.io/usage/managing-nodegroups/
eksctl create nodegroup \
  --cluster 「クラスタ名」 \
  --region ap-northeast-1  \
  --name 「ノードグループ名」 \
  --node-type t3.xlarge \
  --nodes 2 \
  --nodes-min 2 \
  --nodes-max 2

ここまでは、EKSの環境設定が完了しました。
次に、AgonesとOpen Matchをインストールします。

2.Agonesのインストール

Agonesをインストールする方法については、基本的には Agonesの公式ドキュメンテーションに従います。

インストール方法としては、yamlインストールとHelmインストールの2つの方法がありますが、以下の理由からHelmを使用してAgonesをインストールする方法を選択しました。

  • ① Helmを使用すると、Kubernetesアプリケーションのデプロイを再現可能で一貫性のある形で行うことができます。これにより、運用上の一貫性と信頼性を確保する
  • ② Helmはチャートと呼ばれるパッケージ形式を使用するため、チーム間での共有や再利用が容易になる
  • ③ 複雑なアプリケーションを構成するためのパラメータ化された設定を提供します。これにより、カスタマイズや再構成が容易になる
  • ④ Helmはデプロイのバージョン管理、つまりリリースの管理を容易にします。これにより、バージョン間の移行がスムーズに行う

Agonesのインストールコマンドは以下のとおりです。
[my-release]はリリースの名前で、適宜置き換えてください。

# 公式のstable Helmリポジトリを追加
helm repo add agones https://agones.dev/chart/stable

# Helmを使ってAgonesをインストール
helm install [my-release] --namespace agones-system agones/agones

上記のコマンドを使用すると、公式のstable Helmリポジトリを追加し、Helmを使ってAgonesをインストールできます。[my-release]の部分にはインストールするリリースの名前を指定します。
また、Agonesはagones-systemという名前の空間にインストールされます。

3.Openmatchのインストール

Openmatchの公式ドキュメンテーションに従ってOpenmatchをインストールします。

OpenMatchのインストールコマンドは以下のとおりです。
[my-release]はリリースの名前で、適宜置き換えてください。

# Open MatchのHelmリポジトリを追加
helm repo add open-match https://open-match.dev/chart

# Helmを使ってOpen Matchをインストール
helm install [my-release] open-match/open-match --namespace open-match --set open-match-core.enabled=true

上記のコマンドを使用すると、Open MatchのHelmリポジトリを追加し、Helmを使ってOpen Matchをインストールできます。
また、Open Matchはopen-matchという名前空間にインストールされ、open-match-coreが有効になります。

4.動作確認

環境の構築が完了したので、AgonesとOpen Matchが正しくインストールされていることを確認するために、AgonesのデモとOpen Matchのデモを使用してテストを行います。

環境の構築が完了している場合は、以下の手順を実行してテストを行ってください。

Agonesデモのデプロイと動作確認

Agones公式ドキュメントのゲームサーバ作成手順に従ってサンプルゲームサーバーをデプロイします。これにより、Agonesが正常に動作するかを確認できます。

  • サンプルゲームサーバーをデプロイする
kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.32.0/examples/simple-game-server/gameserver.yaml
  • GameServerの状態を確認する
kubectl get gs

確認ポイントとして、GameServerのステータスが Ready になっていることを確認してください。

$ kubectl get gs 
NAME                       STATE   ADDRESS                                                 PORT   NODE                                               AGE
simple-game-server-h4h2w   Ready   ec2-18-182-6-144.ap-northeast-1.compute.amazonaws.com   7393   ip-192-168-0-130.ap-northeast-1.compute.internal   18s

Open Matchデモのデプロイと動作確認

Openmatch 公式デモの作成手順に従ってOpen Matchのデモをデプロイします。これにより、Open Matchが正常に動作するかを確認できます。

  • サンプルマッチメイキングフロントエンドとバックエンドをデプロイする
kubectl create namespace open-match-demo
kubectl apply --namespace open-match-demo \
  -f https://open-match.dev/install/v1.7.0/yaml/02-open-match-demo.yaml
  • マッチメイキングフロントエンドとバックエンドの状態を確認する
kubectl get pods -n open-match-demo

上記の手順に従い、Open Matchのサンプルマッチメイキングでフロントエンドとバックエンドをデプロイし、kubectl get pods -n open-match-demo コマンドでポッドの状態を確認します。

確認ポイントとして、

  • ① すべてのポッドのステータスが Running になっていることを確認する
$ kubectl get pods -n open-match-demo
NAME                           READY   STATUS    RESTARTS   AGE
om-demo-7bf887b848-75nvn       1/1     Running   0          35s
om-function-58b954cf5f-4gqr4   1/1     Running   0          35s
om-function-58b954cf5f-ll6pz   1/1     Running   0          35s
om-function-58b954cf5f-nqrks   1/1     Running   0          35s
  • PortForwardを使用してデモページにアクセスできることを確認する
$ kubectl port-forward --namespace open-match-demo service/om-demo 51507:51507

Forwarding from 127.0.0.1:51507 -> 51507
Forwarding from [::1]:51507 -> 51507

終わりに

以上で、EKSの環境構築およびAgones/Open Matchのインストールプロセスの説明が完了しました。また、公式デモを使用してテストを行いました。

次に、マッチメイキングサービスの構築とGameClientの実装について詳しく説明します。Part2Part3では、マッチメイキングサービスのカスタマイズ方法とGameClientの開発について取り上げます。

引き続き、お楽しみにしてください!

現在ISIDはweb3領域のグループ横断組織を立ち上げ、Web3およびメタバース領域のR&Dを行っております(カテゴリー「3DCG」の記事はこちら)。
もし本領域にご興味のある方や、一緒にチャレンジしていきたい方は、ぜひお気軽にご連絡ください!
私たちと同じチームで働いてくれる仲間を、是非お待ちしております!
ISID採用ページ(Web3/メタバース/AI)

参考

執筆:@chen.sun、レビュー:@yamashita.yuki
Shodoで執筆されました