AgonesでEKS上にゲームサーバを構築してみた

2023.09.13

こんにちは、ゲームソリューション部のsoraです。
今回は、AgonesでEKS上にゲームサーバを構築してみたことについて書いていきます。

Agonesとは

Agonesは、Kubernetes上でゲームサーバのホスティングとスケーリングを行うOSSです。
Agonesを使用することで、KubernetesのPodとしてゲームサーバを構築することができ、要求に応じてゲームサーバのオートスケールを行うことができます。
ゲームサーバのスケーリングについて、最大数・最小数・バッファ数を設定することができます。

Agonesを導入するメリットは以下です。

  • ゲームサーバの割り当てやオートスケールを行うことができる。
  • 実行中のゲームサーバを終了しないように保護できる。
    ⇒Kubernetesのみではゲームが実行中かどうかまでは判断することができず、Podとして起動しているゲームサーバを削除してしまう場合がある。
    Agonesを使用することで、ゲームサーバが実行中かどうかを判断して、実行中であれば削除しないように保護できる。
  • Kubernetes上に構築できる。
    ⇒オーケストレーションツールとしてKubernetesを実行している環境であれば、EKSに限らず別クラウドのKubernetesサービスやオンプレミスなどの環境でも容易に実現可能

クライアント実行環境

それでは実際に構築とテストをしていきます。
クライアントとしてCloud9(インスタンスタイプ:t2.micro)を使用します。
Agonesをインストールして使用する中でeksctl・kubectl・helmが必要なため、インストールしておきます。

今回の環境におけるそれぞれのバージョンは以下です。

$ eksctl version
0.154.0

$ kubectl version --short
Client Version: v1.27.1-eks-2f008fe
Kustomize Version: v5.0.1

$ helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}

インストール

以下公式ページにて導入手順が説明されています。
YAMLの他にHelmでもインストールが可能です。
Install Agones using YAML
手順通りに進めていくだけのため、導入手順の説明は割愛します。

Agonesを導入すると、公式の導入手順にて最初に作成したnamespaceのagones-systemにいくつかのpodが作成されていることがわかります。

$ kubectl get pod -n agones-system
NAME                                 READY   STATUS              RESTARTS   AGE
agones-allocator-5cbcb877bc-6kz9h    0/1     ContainerCreating   0          8s
agones-allocator-5cbcb877bc-ptj25    0/1     ContainerCreating   0          8s
agones-allocator-5cbcb877bc-trjtx    0/1     ContainerCreating   0          8s
agones-controller-645c8dcb9-d4x7n    0/1     ContainerCreating   0          8s
agones-controller-645c8dcb9-z7z54    0/1     ContainerCreating   0          8s
agones-extensions-656fdc49fd-5cslc   0/1     ContainerCreating   0          8s
agones-extensions-656fdc49fd-qq2tm   0/1     ContainerCreating   0          8s
agones-ping-7cdff44645-9nmkq         0/1     ContainerCreating   0          8s
agones-ping-7cdff44645-dc8pk         0/1     ContainerCreating   0          8s

それぞれの役割は以下です。

  • agones-allocator:ゲームサーバをノードに割り振る役割を持ち、APIのエンドポイントも提供
  • agones-controller:ゲームサーバのステータスを変更する役割
  • agones-extensions:拡張機能を管理する役割
  • agones-ping:クライアントからゲームサーバまでのレイテンシ測定の役割を持ち、マルチリージョン構成であればレイテンシをもとにクライアントから距離が近いゲームサーバを提供することも可能

テスト

導入が完了したので、テストしていきます。
Agonesのフリートオートスケーラーによってゲームサーバがスケールする動きを見ていきます。
オートスケーラーの設定は、バッファ数を2、最大数を10、最小数を0としています。
マニュアル記載の通り、Kubectl createでゲームサーバのallocateを行います。(SDKなどを使用してゲームサーバのステータス変更を行うことも可能です。)

実行すると、ステータスがReadyだったゲームサーバが1台Allocatedに変化しており、バッファ数を維持するために追加で1台のゲームサーバがReadyの状態で追加されていることがわかります。

# allocate前
$ kubectl get gs
NAME                             STATE   ADDRESS                                                   PORT   NODE                                               AGE
simple-game-server-4mp76-fjr6t   Ready   ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com   7369   ip-192-168-8-240.ap-northeast-1.compute.internal   2m11s
simple-game-server-4mp76-k75cs   Ready   ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com   7474   ip-192-168-8-240.ap-northeast-1.compute.internal   2m11s

# ReadyのPodを割り当てる
$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.34.0/examples/simple-game-server/gameserverallocation.yaml -o yaml

# allocate後
$ kubectl get gs
NAME                             STATE       ADDRESS                                                   PORT   NODE                                               AGE
simple-game-server-4mp76-fjr6t   Allocated   ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com   7369   ip-192-168-8-240.ap-northeast-1.compute.internal   2m29s
simple-game-server-4mp76-k75cs   Ready       ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com   7474   ip-192-168-8-240.ap-northeast-1.compute.internal   2m29s
simple-game-server-4mp76-txwtd   Ready       ec2-54-250-197-188.ap-northeast-1.compute.amazonaws.com   7094   ip-192-168-8-240.ap-northeast-1.compute.internal   3s

参考

KarpenterとGraviton2を使った大規模ゲーム向けAgones on EKS を立ち上げるサンプル multi-cluster-allocation-demo-for-agones-on-eks の紹介(構成・説明ソースコード(GitHub)

最後に

今回は、AgonesでEKS上にゲームサーバを構築してみたことを記事にしました。
どなたかの参考になると幸いです。