目次
はじめに
grasys のワタナベです。今回は、オンラインゲームの案件で利用しているライブラリ、Agones のチュートリアルについてまとめました。
Agonesとは
Agones はオンラインマルチプレイに対応したゲームサーバーのホスティング、スケーリングを Kubernetes 上で行うための OSS ライブラリです。
今回は 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 の使い方も合わせて学ぶことができます。

