grasys blog

ゲーム専用サーバーをk8s上で実行可能にするAgonesの環境を構築してみた

文● izumi/grasys 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

本記事はgrasys が提供する「grasys blog」に掲載された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 plan、teffaform 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               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のサンプルのデプロイから動作の確認を行なってみました。

 次回(?)はもっと他の細かい動作を書いていければと思います。

■関連サイト

過去記事アーカイブ

2021年
03月
04月
05月
2020年
04月
05月
08月
09月
10月
11月
12月
2018年
09月
2017年
06月
2014年
07月