Google Cloud Platform

Agones ―― Kubernetes 上でのゲーム サーバー構築をサポートするオープンソース プロジェクトが始動

オンラインでのマルチプレーヤーに対応したゲーム専用サーバーのホスティングとスケーリングは、分散システムの世界においてもユニークな課題を抱える難しいテーマです。

ゲーム業界では、これまでさまざまなプロプライエタリのソリューションが開発されてきました。ところが、ここにきて、複数のクラウドやベアメタル サーバーにまたがる複雑なワークロードや分散システムの構築をサポートする事実上のオープンソース標準が存在感を増しています。Kubernetes がそれです。そこで、Google はこのほど、ゲーム専用サーバーのホスティングとスケーリングを Kubernetes で行う新しいオープンソース プロジェクト、Agones(競技場、集会という意味のギリシャ語)を発表しました。

Agonesは、“バッテリ同梱”(必要なものが最初からすべて揃っていることの意)を特徴とするオープンソースのソフトウェアで、現在は Google とインタラクティブ ゲーム大手の Ubisoft が共同で開発を進めています。ゲーム専用サーバーのホスティングおよびスケーリングを Kubernetes ベースで実現するよう設計されているのに加え、マルチプレーヤー ゲームのニーズに合わせて必要な調整を加えられる柔軟性を備えています。

ゲーム専用サーバーの特徴

ゲーム専用サーバーのスケーリングがプロプライエタリのソフトウェアで行われているのは意外なことではありません。ほとんどのオーケストレーションやスケーリングのシステムは、この種のワークロードに使えるようにはなっていないのです。

FPS(ファースト パーソン シューター)、MMO(大規模多人数参加型)、MOBA(マルチプレーヤー オンライン バトル アリーナ)など、多人数で動きの速いマルチプレーヤー ゲームの多くは、ゲームの世界を完全にシミュレートするために、プレーヤーが接続する専用のゲーム サーバーを必要とします。この専用サーバーは、プレーヤーの間でゲーム状態の同期を取るとともに、ゲームをプレーする個々のクライアントのための調停者としての役割を果たすほか、プレーヤーの不正行為への防御策としても役立っています。

ゲーム専用サーバーは、ゲームのシミュレーション全体をメモリ内に保持するステートフル アプリケーションですが、データベースなど他のステートフル アプリケーションとは異なり、寿命が短いという特徴があります。こうしたゲーム専用サーバーは数か月や数年ではなく、数分、数時間という単位で実行されます。

ゲーム専用サーバーは、ロード バランサに頼らずに、IP とポートをホスティングするゲーム サーバー プロセスと直接接続しなければならないという要件も抱えています。レイテンシを極端に嫌う動きの速いゲームにとって、ロード バランサはレイテンシの増加要因でしかないのです。また、1つのゲーム専用サーバーに接続するすべてのプレーヤーは、インメモリのゲーム シミュレーションを全員で同時に共有するので、同じマシンに接続させたほうが簡単です。

典型的なゲーム専用サーバーの構成は次のとおりです。

image24unv.gif
  1. プレーヤーは何らかの種類のマッチメーカー サービスに接続します。マッチメーカー サービスは、プレーヤーを対戦グループに分けます(スキル レベルに応じて分けることもよくあります)。
  2. プレーヤーをゲーム セッションに振り分けると、マッチメーカー サービスはゲーム サーバー マネージャに対して、マシンのクラスタ上にゲーム サーバー プロセスを準備するよう指示します。
  3. ゲーム サーバー マネージャは、ゲーム サーバー プロセスの新しいインスタンスを作り、それをクラスタ内の 1 台のマシンの上で実行します。
  4. ゲーム サーバー マネージャは、ゲーム サーバー プロセスが実行される IP アドレスとポートを取得し、マッチメーカー サービスに送り返します。
  5. マッチメーカー サービスは、IP アドレスとポートをプレーヤーのクライアント プログラムに送ります。
  6. プレーヤーはゲーム サーバー プロセスに直接接続し、全員でマルチプレーヤー ゲームをプレーします。


Kubernetes 上で Agones を構築することの意義

Agones は、Kubernetes のカスタム コントローラとそれに対応する GameServer CustomResourceDefinitions を持つ Kubernetes クラスタをサポートすることで、上述のようなカスタムメイドのクラスタ管理やゲーム サーバー スケーリング ソリューションを不要にしています。

image1sgt3.gif

Agones の場合、Kubernetes は標準のツールと API を使用して、ゲーム専用サーバー プロセスの作成、実行、管理、スケーリングを Kubernetes クラスタ内でネイティブに行います。このモデルのもとでは、マッチメーカーが Kubernetes API を介して Agones と直接やり取りし、ゲーム専用サーバーをプロビジョニングすることも可能です。

Kubernetes 上に Agones を構築することで、ほかにも多くの利点が得られます。たとえば、ゲーム ワークロードを最も意味のある場所で実行できます。Minikube のようなプラットフォームを介してゲーム デベロッパーのマシンで実行したり、グループ開発のために現場のクラスタで実行したりできるのです。オンプレミスのマシン、Google Kubernetes Engine を含むハイブリッドやフルクラウド環境においても同様です。

Kubernetes は運用も単純化します。通常、マルチプレーヤー対応のゲーム システムが専用サーバーだけで済むことはありません。サポート サービス、アカウント管理、インベントリ、マーケットプレイスなどが必ず付随します。そうした場合に、Kubernetes をゲーム専用サーバーとサポート サービスの両方を実行できる単一のプラットフォームとしておくと、開発チームのサポートに要する運用上の知識と複雑さが大幅に縮小、緩和されます。

最後に、Agones を背後で支える人々は、ゲーム サーバー プラットフォームの開発に携わる人たちのグループだけではありません。Agones とそれを使用するデベロッパーは、数百人もの Kubernetes コントリビューターによる成果や、Kubernetes プラットフォームを中心に構築されたツールからなる多様なエコシステムを活用しています。

Agones プロジェクトの創設者である Ubisoft は、最高の AAA マルチプレーヤー ゲームを世界中のプレーヤーに提供してきた経験と、そこから得られた深い知識を Agones に注ぎ込んでいます。

私たち Ubisoft の目標は、プレーヤーの皆さんがゲームに集中できるような最高品質のシームレスなサービスを提供する新しい方法を絶えず見つけ出すことです。Agones は、ゲーム専用サーバーを任意のデータセンターで運用可能にする柔軟性をもたらし、私たちのチームが必要とするリソースを今までよりもしっかり管理できるようにしてくれました。Google とのコラボレーションにより、Kubernetes を大規模にデプロイできる Google Cloud の専門的な能力と、ゲーム開発のパイプラインや技術に関する私たちの深い知識を組み合わせることが可能になったのです。Carl Dionne 氏、Ubisoft のオンライン テクノロジー グループ開発ディレクター

Agones を試すには

Agones は Kubernetes のネイティブ エクステンションとして作られているので、kubectl や Kubernetes API を含む Kubernetes のすべての標準ツールを使って操作できます。

ゲーム サーバーの作成

Kubernetes 上にデプロイされるゲーム専用サーバーのオーサリングは、従来の Kubernetes ワークロードの開発とよく似ています。たとえば、ゲーム専用サーバーは次に示すように、単純にコンテナ イメージに組み込まれます。

Dockerfile

  FROM debian:stretch
RUN useradd -m server
COPY ./bin/game-server /home/server/game-server
RUN chown -R server /home/server && \
    chmod o+x /home/server/game-server
USER server
ENTRYPOINT ["/home/server/game-server"]

Agones を Kubernetes にインストールすると、Kubernetes Pod のすべての構成オプションが使える状態のままで、Kubernetes に GameServer リソースを追加できます。

gameserver.yaml

  apiVersion: "stable.agon.io/v1alpha1"
kind: GameServer
metadata:
  name: my-game-server
spec:
  containerPort: 7654
  # Pod template
  template:
    spec:
      containers:
      - name: my-game-server-container
        image: gcr.io/agon-images/my-game-server:0.1

次に、kubectl コマンドもしくは Kubernetes API を使ってマニフェストを適用します。

  $ kubectl apply -f gamesever.yaml
gameserver "my-game-server" created

Agones は、yaml で定義されたサーバー プロセスを起動し、そのプロセスに公開ポートを割り当て、プレーヤーが接続できるように IP とポートを取得します。また、ゲーム サーバー プロセス コードに統合された SDK を介して、GameServer のライフサイクルと健全性を監視します。

kubectl コマンドか Kubernetes API を介して Kubernetes にクエリを送れば、State や、プレーヤーのゲーム クライアントが接続する IP やポートなど、GameServer に関する詳細な情報が得られます。

  $ kubectl describe gameserver my-game-server
Name:         my-game-server
Namespace:    default
Labels:       
Annotations:  
API Version:  stable.agones.dev/v1alpha1
Kind:         GameServer
Metadata:
  Cluster Name:
  Creation Timestamp:  2018-02-09T05:02:18Z
  Finalizers:
    stable.agones.dev
  Generation:        0
  Initializers:      
  Resource Version:  13422
  Self Link:         /apis/stable.agones.dev/v1alpha1/namespaces/default/gameservers/my-game-server
  UID:               6760e87c-0d56-11e8-8f17-0800273d63f2
Spec:
  Port Policy:     dynamic
  Container:       my-game-server-container
  Container Port:  7654
  Health:
    Failure Threshold:      3
    Initial Delay Seconds:  5
    Period Seconds:         5
  Host Port:                7884
  Protocol:                 UDP
  Template:
    Metadata:
      Creation Timestamp:  
    Spec:
      Containers:
        Image:  gcr.io/agones-images/my-game-server:0.1
        Name:   my-game-server-container
        Resources:
Status:
  Address:    192.168.99.100
  Node Name:  agones
  Port:       7884
  State:      Ready
Events:
  Type    Reason    Age   From                   Message
  ----    ------    ----  ----                   -------
  Normal  PortAllocation  3s    gameserver-controller  Port allocated
  Normal  Creating        3s    gameserver-controller  Pod my-game-server-q98sz created
  Normal  Starting        3s    gameserver-controller  Synced
  Normal  Ready           1s    gameserver-controller  Address and Port populated

Agones の今後

Agones プロジェクトはまだ始まったばかりですが、私たちは Agones の未来にとても期待しています。すでに GameServer Fleets などの新機能の開発に着手し、v0.2 リリースの計画を進めるとともに、Windows のサポート、ゲーム サーバー統計情報の収集と表示、ノードのオートスケーリングなどを含むロードマップの整備に取り組んでいます。

Agones の v0.1 アルファ リリースを試したい方は、Google Kubernetes EngineMinikube などの Kubernetes クラスタに直接インストールして実行してみてください。セットアップについては、こちらに便利なインストール ガイドが用意されています。

私たちはプロジェクトへの皆さんの参加を歓迎します。さまざまな参加方法が用意されています。


Google Cloud Platform と Ubisoft にて Agones プロジェクトに関わっているすべての人々に感謝するとともに、Agones が切り開く未来を楽しみにしています。

* この投稿は米国時間 3 月 13 日、Developer Advocate の Mark Mandel によって投稿されたもの(投稿はこちら)の抄訳です。

- By Mark Mandel, Developer Advocate