grasys blog

はじめてのAgones:ゲームサーバーを構築してみよう

はじめに

grasys のワタナベです。今回は、オンラインゲームの案件で利用しているライブラリ、Agones のチュートリアルについてまとめました。

Agonesとは

Agones はオンラインマルチプレイに対応したゲームサーバーのホスティング、スケーリングを Kubernetes 上で行うための OSS ライブラリです。

Agones 公式サイト

今回は GitHub で公開されているサンプルコードを使って、GKEにゲームサーバーを構築してみましょう。

Agones を利用して作成できる Kubernetes リソースのうち、今回は以下について触れていきます。

  • GameServer: ゲームサーバー単体
  • Fleet: 複数のゲームサーバーの集まり。指定した台数のゲームサーバーを起動してくれる。
  • FleetAutoScaler: Fleetのスケールを自動で変更する。最低台数、最大台数、バッファなど柔軟な指定が可能。

Agones バージョン情報: 1.49.0

対象読者

  • Kubernetesに触れたことはあるが、Agonesを初めて触る人
  • ゲーム向けサーバーを構築してみたい人

Terraform で GKE Autopilot クラスタを構築する

Agonesを使用するにはKubernetesクラスタが必要です。今回は実案件でも利用している GKE Autopilot クラスタを作成します。

サンプルコードには GKE Autopilot クラスタ構築用の.tfファイルが含まれているため、こちらを使用します。

project , location, subnetwork など、variables.tf の内容は自分の環境に合わせて修正しましょう。

  default = {
    "name"                          = "test-cluster"
    "project"                       = "agones"
    "location"                      = "us-west1"
    "network"                       = "default"
    "subnetwork"                    = ""
    "releaseChannel"                = "REGULAR"
    "kubernetesVersion"             = "1.31"
    "deletionProtection"            = true
    "maintenanceExclusionStartTime" = null
    "maintenanceExclusionEndTime"   = null
  }

variables.tf を 修正後、terraform plan および terraform apply を実行し、クラスタを構築します。

クラスタ構築完了後、gcloud container clusters get-credentials コマンドを実行しクラスタへ接続します。

Agones をインストールする

Agones をインストールする方法は複数ありますが、今回はHelm チャートを利用してみましょう。

公式サイトの手順に従ってインストールします。

Install Agones using Helm(公式サイト)

GKE クラスタにインストールする際の注意点として、インストールを実行するユーザが Kubernetes Engine 管理者 のロールを付与されている必要があります

helm repo add agones https://agones.dev/chart/stable
helm repo update
helm install my-release --namespace agones-system --create-namespace agones/agones

インストール後、以下のコマンドでpodが起動していることを確認します

kubectl --namespace agones-system get pods -o wide

Game server をデプロイする

Game serverのデプロイ

サンプルの Game server をデプロイしてみましょう。

❯ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.49.0/examples/simple-game-server/gameserver.yaml

gameserver.agones.dev/simple-game-server-g455v created

デプロイしたgameserverは、kubectl get gameserver コマンドで確認できます。

❯ kubectl get gameserver simple-game-server-g455v
NAME                       STATE   ADDRESS       PORT   NODE                                                  AGE
simple-game-server-g455v   Ready   34.85.73.93   7973   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   2m22s

起動した game serverに接続します。

このサーバーは入力されたメッセージをそのまま返すごくシンプルな機能があり、EXITを送信することで終了します

nc -u {IP} {PORT}

❯ nc -u 34.85.73.93 7973
Hello World !
ACK: Hello World !
EXIT
ACK: EXIT

Fleetのデプロイ

今度は複数台のgame serverを起動してみましょう。サンプルコードを使用してFleetを起動します。

❯ kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.49.0/examples/simple-game-server/fleet.yaml

fleet.agones.dev/simple-game-server created

複数台のgame serverが起動していることが確認できます。

❯ kubectl get fleet
NAME                 SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-game-server   Packed       2         2         0           2       50s

❯ kubectl get gameserver
NAME                             STATE   ADDRESS       PORT   NODE                                                  AGE
simple-game-server-9cwdr-8bjdc   Ready   34.85.73.93   7407   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   40s
simple-game-server-9cwdr-9x8qc   Ready   34.85.73.93   7265   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   40s

Agones はプレイヤーがゲームセッションに利用するサーバを STATE=Ready なサーバから割り当てします。ゲームセッションに割り当てられた game server は STATE=allocated に変化します。

サンプルコードを実行して、 game server の STATE が変化することを確認してみましょう。

❯ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.49.0/examples/simple-game-server/gameserverallocation.yaml -o yaml

❯ kubectl get fleet
NAME                 SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-game-server   Packed       2         2         1           1       4m27s

❯ kubectl get gs
NAME                             STATE       ADDRESS       PORT   NODE                                                  AGE
simple-game-server-9cwdr-8bjdc   Allocated   34.85.73.93   7407   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   4m23s
simple-game-server-9cwdr-9x8qc   Ready       34.85.73.93   7265   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   4m23s

game serverのうち1台がセッションに割り当てられ、STATE=Allocated に変化しました。

Fleet で起動する game server の台数は増減させることができますが、台数を0台に指定するとどうなるでしょうか。

❯ kubectl scale fleet simple-game-server --replicas=0
fleet.agones.dev/simple-game-server scaled

❯ kubectl get fleet
NAME                 SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-game-server   Packed       0         1         1           0       33m

❯ kubectl get gs
NAME                             STATE       ADDRESS       PORT   NODE                                                  AGE
simple-game-server-9cwdr-8bjdc   Allocated   34.85.73.93   7407   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   33m

STATE=Allocated となったgame server は Fleet のサイズを変更してもシャットダウンされません。割り当てられたゲームセッションが終了するまで game server は起動しつづけることになります。

Fleet autoscalerのデプロイ

Fleet autoscaler をデプロイすることで、Fleetの最小・最大台数や、バッファ台数を柔軟に設定することができます。

サンプルコードをつかって Fleet Autoscalerをデプロイしてみましょう。

❯ kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.49.0/examples/simple-game-server/fleetautoscaler.yaml
fleetautoscaler.autoscaling.agones.dev/simple-game-server-autoscaler created

❯ kubectl get fleetautoscaler simple-game-server-autoscaler -o yaml
(省略)
spec:
  fleetName: simple-game-server
  policy:
    buffer:
      bufferSize: 2
      maxReplicas: 10
      minReplicas: 0
    type: Buffer
(省略)

❯ kubectl get fleet
NAME                 SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-game-server   Packed       3         3         1           1       49m

❯ kubectl get gs
NAME                             STATE       ADDRESS        PORT   NODE                                                  AGE
simple-game-server-9cwdr-8bjdc   Allocated   34.85.73.93    7407   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   51m
simple-game-server-9cwdr-c2cgl   Ready       34.85.73.93    7787   gk3-watanabe-test-cluste-nap-tl81v4a7-1bc490a7-v8tf   3m46s
simple-game-server-9cwdr-lzc5n   Ready       34.84.140.96   7678   gk3-watanabe-test-cluste-nap-lp78zrgb-79389980-g9gw   3m46s

サンプルのFleetautoscalerはmax10台、min0台、バッファ2台を指定しています。Allocated のgame server が1台あるので、バッファの台数分がReady状態になるように自動でgame serverが起動されました。

注意点として、Fleet autoscaler はminを0台にしても、バッファ台数だけReadyのサーバを起動するように動作します。また、バッファは0より大きい数を指定する必要があるため、Fleet autoscaler をデプロイ済みの場合対象 Fleet を完全停止することが現状はできないようです。

終わりに

今回は、Agonesの公式サイトに従ってチュートリアルを実施する流れを解説しました。

具体的なゲームプログラムを使った Agones の使い方をもっと試してみたいと思った方は、googleforgamesのGitHubで公開されているspace-agon を触ってみるのがオススメです。

Agones だけでなく、プレイヤーのマッチング機能を実装するためのフレームワーク Open Match の使い方も合わせて学ぶことができます。


採用情報
お問い合わせ