目次
今回は、ゲーム専用サーバを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 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 <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のサンプルのデプロイから動作の確認を行ってみました。
次回(?)はもっと他の細かい動作を書いていければと思います。
株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。
grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。