Agones 超入門

Yutty Kawahara
Dec 21, 2019 · 14 min read

この記事は Google Cloud Japan Customer Engineer Advent Calendar 2019 の 21日目の記事です。

TL;DR

専用ゲームサーバー (Dedicated Game Server(DGS)) を Kubernetes(k8s) 上で実行するための OSS「Agones」 の入門記事となります。
Agones は k8s 上で動作しますが、k8s に関する細かい説明はございません。

Agones の logo

はじめに

こんにちは、Customer EngineerのYuttyです。
Advent Calendar 2019 今回2回目の登場です。(1回目はこちらです)

Agones は Ubisoft とGoogle が共同で開発しているオープンソースのプロジェクトです。Agones はk8sを使用して DGS をホスティングすることが可能です。k8s はギリシャ語で「操舵者」の意味でしたが、Agones もギリシャ語に由来しており、「闘技場」という意味だそうです。

専用ゲームサーバーと k8s

FPS(First Person shooter/一人称視点シューティングゲーム) や MMO(Massively Multiplayer Online/大規模多人数参加型オンラインゲーム) など、オンラインマルチプレイを提供するものは、プレイヤーのステートを管理するため DGS を必要とします。DGS は通常、インターネット上のどこかでホストされプレーヤー間のゲームの状態の同期を行います。p2p のようにホストがユーザー側にないため、不正行為からの保護としてもメリットがありますし、同時に接続するユーザー数も、端末機よりスケールすることができます。

DGS は、ゲームの計算結果をメモリ上に保持するので、いわゆるステートフルなアプリケーションではあるのですが、データベースなどとは異なり、ライフサイクルが比較的短いという特徴があります。もちろん例外はあると思いますが、数か月〜数年という単位よりも、数分〜数時間という単位となります。このライフサイクルの短さはコンテナ、k8s とも相性がよいと言えます。

しかしながら、k8s には(ユーザーのマルチプレイを)実行中かどうかを判別する機能はありません。そのためスケールインとして Pod を減らそうとすると、ユーザーが接続中のDGSが削除されてしまう可能性があります。Agones を k8s 上で実行することにより、以下のようなメリットがあります。

  1. 実行中のゲームサーバーの保護
  2. デファクトスタンダードであるk8s上で実行できるため、オペレーションの簡素化ができる
  3. SDK がいろいろな言語で提供されている

マルチプレイのためのステップ

さて、DGS でマルチプレイするためにはどのようなステップがあるでしょうか?マッチメーカーで同じセッションに参加するユーザーをグルーピングします。

  1. マッチメーカーは、ゲームサーバーマネージャーにDGS を提供するように指示します。
  2. ゲームサーバーマネージャーは、DGS の新しいインスタンスを作成します。
  3. ゲームサーバーマネージャーは、GDS のIPアドレスとポートを決定し、それをマッチメーカーに返します。
  4. マッチメーカーは、IPとポートをプレーヤーのクライアントに返します。
  5. プレーヤーは提供されたIPとポートから DGS に直接接続し、ゲームをプレイします。
引用:https://cloud.google.com/blog/products/gcp/introducing-agones-open-source-multiplayer-dedicated-game-server-hosting-built-on-kubernetes

豊富なSDK

Agones は SDK が豊富と冒頭に記載しましたが、現在以下の言語でSDKが提供されています。

クイックスタート

それでは実際に動かしてみましょう。

インストール

ここでは、インストールの手順は詳細に説明いたしません。

こちらの手順に従って、インストールしてください。k8s 環境はこちらにセットアップ手順があります。

Agones のコンポーネント

インストールが完了したら、以下のコマンドでインストール出来ているか確認してみましょう。3種類の pod が動いていることが確認出来ます。各コンポーネントの役割は、以下のとおりです。

agones-allocator
GameServerのアロケーションを行う。また REST API のエンドポイントを提供します。

agones-controller
ゲームサーバーの状態を現状のステータスから、希望のステータスへ変更します。

agones-ping
ゲームサーバーまでのレイテンシ測定に利用します。Agones はマルチリージョンでのDGS展開を想定しており、複数のリージョンにクラスタを展開した時、ユーザーとの距離の近いDGSを提供することが可能となります。

Agones のリソース

また Agones には以下のリソースがあります。他の k8s のリソースと同様に、yaml、json で定義が可能です。

GameServer
ゲームサーバーそのもの。

Fleet
ウォームアップが完了していて、ゲームサーバーとして、アロケーション可能なゲームサーバの集まりです。例えば起動時にアセットのDLが必要な場合など、事前にDLしておきアロケーションできる状態にしておくことで、起動時間を短縮出来ます。

GameServerAllocation
Fleet から GameServer の割当の際に、使用します。

FleetAutoscaler
需要に応じて、Fleet のスケールアップやスケールダウンを行います。

上記のそれぞれの関係性を図にするとこのようなイメージです。

Fleet と GameServer

simple-udp の実行

さて、それでは早速サンプルに従って、実際にゲームサーバーを動かしていきます。今回はsimple-udpというサンプルを使用します。このsimple-udp アプリケーションは、udpで送り込んだコマンドに対して、エコーしたり、SDK をゲームサーバーの内側から叩いたり、サーバー名を返したりするシンプルなアプリケーションです。詳しくはこちらをどうぞ。

まずは Fleet をデプロイしてみましょう。

デプロイすると上記の replicas で2と指定しているように、simple-udpという Fleet に、2つの GameServer が存在していることがわかります。

このとき、GameServer を確認してみると、ステータスが Ready となっているものが2つ存在していることがわかります。

では、Fleetから1つ、GameServerをアロケートしてみましょう。はい、上述したGameServerAllocation を行います。simple-udpというFleetから1つGameServerをアロケーションしてくださいね、というものです。

これを適用してみます。

Fleet から1つがアロケートされ、GameServer のステータスが Allocated になりました。

Allocated になったので、接続してコマンドを送り込んでみましょう。無事に応答が帰ってきましたね。ちなみにEXITと送ると、その名の通り、GameServerを終了します。

GameServer が終了すると、GameServerが再起動してステータスはREADYの状態に、新たなポートが割り振られています。

実行中のゲームサーバーの保護

Agonesの特徴の一つである、「実行中のゲームサーバーの保護」とはどうゆうものかご紹介します。

1つのGameServerがアロケートされている状態で、Fleetの数を0にしてみます。そうすると Ready の状態のものはシャットダウンされますが、Allocated となっている GameServer は残り続けます。意図的に、Allocatedとなっている GameServer のステータスを Ready に変更すると、その後シャットダウンが始まるのがわかります。この機能によりプレイ中の DGS は保護され、プレイ中のユーザー体験を損ねることなく、k8s上でゲームサーバーを提供できます。

まとめ

実は、Agones はすでに本番環境の導入事例があります。Supersolidの Snake Rivals というゲームですが、Podcastでもinterviewがアップされてますので、ぜひ視聴してみてください。
https://www.gcppodcast.com/post/episode-202-supersolid-with-kami-may/

Playの評価も高いですね。
https://play.google.com/store/apps/details?id=com.supersolid.snake&hl=en

Agones 入門として、ご紹介させていただきましたが皆様いかがでしたでしょうか?Agones は日本語のドキュメントや紹介資料はまだまだ少ないですが、今後ユーザーが増えることによって記事も増えてくることを期待しています!Let's Agones!!

明日はJinさんによる「Open Match 超入門」です。Open Match とは、 Agones と非常に相性のよいマッチメイキングの OSS です。お楽しみに!

google-cloud-jp

Google Cloud Platform…

Thanks to Jin Naraoka and Mourad El Azhari

Yutty Kawahara

Written by

Customer Engineer in Google Cloud. All views and opinions are my own.

google-cloud-jp

Google Cloud Platform 製品などに関連するコミュニティが記載したテクニカル記事集。掲載された意見は著者のものであり、必ずしも Google のものを反映するものではありません。

More From Medium

More on Google Cloud Platform from google-cloud-jp

More on Google Cloud Platform from google-cloud-jp

Cloud CDN カスタムオリジン

1

More on Google Cloud Platform from google-cloud-jp

More on Google Cloud Platform from google-cloud-jp

Cloud Bigtable で位置情報を扱ってみる

More on Google Cloud Platform from google-cloud-jp

More on Google Cloud Platform from google-cloud-jp

NEG とは何か

19

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade