Agonesを構築してみた

今回は、ゲーム専用サーバをKubernetes上で実行する為のソフトウェアAgonesの環境を構築してみました。

こんにちは、エンジニアの泉水です。 今回はゲーム専用サーバのホスティング、スケーリングをKubernetes上で管理するAgonesのサンプルをGKEへ上で構築してみました。

1.Agonesって?

Agonesは、ゲーム専用サーバーのホスティングとスケーリングを Kubernetes上で行うオープンソースプロジェクトです。 公式サイトはこちら

今回はこちらのサンプルを利用して構築していきます。 masterブランチは開発中のコードが混在していて正しく動作しない可能性があるので、release-1.7.0ブランチを利用しました。

1-1. Agonesの構成

今回は以下のAgonesのリソースについて見ていきたいと思います。

  • GameServer: ゲームサーバ本体
  • Fleet: ゲームサーバの集合
  • FleetAutoScaler: Fleetのスケールアップ、スケールダウン

2.GKEクラスタの構築

弊社ではGCPのリソース管理にTerraformを使用することが多いので今回もTerraformで構築していきます。 また、すぐに構築できるようにTerraformの構成ファイル(以後tfファイル)が準備されています。 tfファイルサンプル

2-1. GKEクラスタを作成する

サンプルのtfファイル内にGCPプロジェクト名が設定されているのでそこを自分の環境に合わせて修正します。 その他、クラスタ名やzoneなどお好みに合わせて変更してください。

   default = {
     "zone"              = "us-west1-c"
     "name"              = "test-cluster"
     "machineType"       = "n1-standard-4"
     "initialNodeCount"  = "4"
-    "project"           = "agones"
+    "project"           = "test-project"
     "network"           = "default"
     "kubernetesVersion" = "1.15"
   }

machineTypeを変更したい場合は上記のmachineTypeの変更に加えてcluster.tf内に定義されているmachineTypeの指定を修正する必要があります。

     node_config {
-      machine_type = "n1-standard-4"
+      machine_type = "n1-standard-2"

ちなみに、私はmachineTypeをn1-standard-2で構築しましたが問題なく動作しました。

tfファイルの修正が終わったら、terraform planteffaform applyを実施しで構築完了です。

3.Agonesをデプロイする

Agonesのデプロイ方法はhelm、Kubernetesのyamlファイルが提供されていますが今回はyamlファイルを利用します。 installのサンプル

3-1. namespaceを作成する

デプロイを実施する前にnamespaceを作成します。

$ kubectl create namespace agones-system
namespace/agones-system created
$ kubectl get namespace
NAME              STATUS   AGE
agones-system     Active   7s
default           Active   91s
kube-node-lease   Active   93s
kube-public       Active   93s
kube-system       Active   93s

3-2. Agonesモジュールをデプロイする

$ kubectl create -f install.yaml
serviceaccount/agones-allocator created
serviceaccount/agones-controller created
serviceaccount/agones-sdk created
secret/agones-manual-cert created
secret/allocator-client-ca created
secret/allocator-tls created
secret/allocator-tls-ca created
...省略

デプロイを実行するユーザのIAM権限はGKE管理者である必要があります。
GKEクラスタ管理者などでは、RBACの作成に失敗してしまいます。

デプロイしたAgonesモジュールはagones-systemネームスペースに作成されます。

$ kubectl get pod -n agones-system
NAME                                 READY   STATUS    RESTARTS   AGE
agones-allocator-7cd58db9dc-764n9    1/1     Running   0          5m6s
agones-allocator-7cd58db9dc-78xjn    1/1     Running   0          5m6s
agones-allocator-7cd58db9dc-9jqmz    1/1     Running   0          5m6s
agones-controller-6f4458776f-6ldg6   1/1     Running   0          5m6s
agones-ping-59d46d7fb5-jx7nf         1/1     Running   0          5m6s
agones-ping-59d46d7fb5-mh8wl         1/1     Running   0          5m6s
$ kubectl get service -n agones-system
NAME                        TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)            AGE
agones-allocator            LoadBalancer   10.11.244.106   35.xxx.xxx.xxx    443:30882/TCP      5m38s
agones-controller-service   ClusterIP      10.11.245.126   <none>            443/TCP,8080/TCP   5m38s
agones-ping-http-service    LoadBalancer   10.11.240.127   34.xxx.xxx.xxx      80:30662/TCP       5m38s
agones-ping-udp-service     LoadBalancer   10.11.244.123   104.xxx.xxx.xxx   50000:31417/UDP    5m38s

4.GameServerのデプロイする

サンプルのゲームサーバ単体をデプロイしてみます。

※GameServer、Fleet、FleetAutoscalerのサンプルは全てこちらのマニフエストを使用します。

4-1. ゲームサーバのデプロイ

$ kubectl create -f gameserver.yaml
gameserver.agones.dev/simple-udp-lrq2k created
$ kubectl get gs
NAME               STATE   ADDRESS           PORT   NODE                                     AGE
simple-udp-lrq2k   Ready   104.xxx.xxx.xxx   7380   gke-test-cluster-default-23a9c43b-q099   7s

4-2. ゲームサーバへの接続

ncコマンドで接続してみます。
このサンプルサーバは接続後入力した文字列を返すだけの単純なものです。
また、「EXIT」を入力するとサーバとの接続が終了します。

$ nc -u 104.xxx.xxx.xxx 7380
TEST
ACK: TEST

5. Fleetのデプロイ

サンプルのゲームサーバに対するFleetをデプロイしていきます。 デプロイする前に4で作成したゲームサーバは削除してください。

5-1.fleetをデプロイする

Fleetをデプロイしてみます。

$ kubectl create -f fleet.yaml
fleet.agones.dev/simple-udp created

$ kubectl get fleet
NAME         SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-udp   Packed       2         2         0           2       26s

fleet.yamlのreplicasで指定した数のゲームサーバが起動したことが確認できます。

$ kubectl get gameserver
NAME                     STATE   ADDRESS         PORT   NODE                                     AGE
simple-udp-bnsbw-cx247   Ready   35.xxx.xxx.xxx   7972   gke-test-cluster-default-23a9c43b-qsgr   70s
simple-udp-bnsbw-l8888   Ready   35.xxx.xxx.xxx   7854   gke-test-cluster-default-23a9c43b-qsgr   70s

5-2. allocateする

起動したゲームサーバをallocateします。

$ kubectl create -f gameserverallocation.yaml
gameserverallocation.allocation.agones.dev/simple-udp-bnsbw-l8888 created

ゲームサーバ1台がallocateの状態になっていることが確認できます。

$ kubectl get gameserver
NAME                     STATE       ADDRESS         PORT   NODE                                     AGE
simple-udp-bnsbw-c8tjh   Ready       35.xxx.xxx.xxx   7060   gke-test-cluster-default-23a9c43b-qsgr   12m
simple-udp-bnsbw-l8888   Allocated   35.xxx.xxx.xxx   7854   gke-test-cluster-default-23a9c43b-qsgr   23m

5-3. ゲームサーバの台数を0へ変更する

allocateがどのような状態か確認する為にFleetの設定を変更してゲームサーバの台数を0台に変更します。

kubectl scale fleet simple-udp --replicas=0

$ kubectl get fleet
NAME         SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
simple-udp   Packed       0         1         1           0       3h16m

ゲームサーバの台数を0へ変更してもAllocatedの状態となっているゲームサーバpodは削除されないことが確認できました。
Allocated状態のゲームサーバが鎖状されないのもAgonesの特徴です。

$ kubectl get gameserver
NAME                     STATE       ADDRESS         PORT   NODE                                     AGE
simple-udp-bnsbw-l8888   Allocated   35.xxx.xxx.xxx   7854   gke-test-cluster-default-23a9c43b-qsgr   23m

6. FleetAutoscalerのデプロイ

FleetAutoscalerではゲームサーバの最小・最大台数や、バッファ台数を設定することができます。

6-1. FleetAutoscalerをデプロイする

今回は最大10、最小2、バッファ2で設定します。

$ kubectl create -f fleetautoscaler.yaml
fleetautoscaler.autoscaling.agones.dev/simple-udp-autoscaler created

$ kubectl get gameserver
NAME                     STATE       ADDRESS         PORT   NODE                                     AGE
simple-udp-bnsbw-c8tjh   Ready       35.xxx.xxx.xxx   7060   gke-test-cluster-default-23a9c43b-qsgr   12m
simple-udp-bnsbw-l8888   Ready       35.xxx.xxx.xxx   7854   gke-test-cluster-default-23a9c43b-qsgr   23m

6-2. allocateしてみます

allocate後、ゲームサーバ数を確認すると1台ゲームサーバが追加されていてバッファが2台になっていることがわかります。

$ kubectl create -f gameserverallocation.yaml
gameserverallocation.allocation.agones.dev/simple-udp-bnsbw-l8888 created

$ kubectl get gameserver
NAME                     STATE       ADDRESS         PORT   NODE                                     AGE
simple-udp-jlq7t-4kq6c   Ready       35.xxx.xxx.xxx   7060   gke-test-cluster-default-23a9c43b-qsgr    2m
simple-udp-bnsbw-c8tjh   Ready       35.xxx.xxx.xxx   7060   gke-test-cluster-default-23a9c43b-qsgr   12m
simple-udp-bnsbw-l8888   Allocated   35.xxx.xxx.xxx   7854   gke-test-cluster-default-23a9c43b-qsgr   23m

終わり

今回はAgonesのサンプルのデプロイから動作の確認を行ってみました。
次回(?)はもっと他の細かい動作を書いていければと思います。