Google Cloud Game Servers (beta) の紹介

Yutty Kawahara
google-cloud-jp
Published in
30 min readApr 13, 2020

先日、Google Cloud Game Servers (以下、GCGS) Beta がアナウンスされました。さっそく GCGS を紹介していきたいと思います。

Agones は Kubernetes 上に構築されるゲームサーバーの、ホスティングとスケーリングを行うオープンソースプロジェクトです。こちらに Agones の入門記事がありますので、参考にしてください。

GCGSの概要

GCGS を簡単ご紹介すると、「Agones がインストールされた Kubernetes クラスタを、グローバルで管理するためのもの」です。

Agones は Kubernetes のクラスタ単位でのゲームサーバーを展開しますが、ワールドワイドにゲームサーバーを展開するには、複数の Kubernetesクラスターを管理する必要が出てきます。その Kubernetes クラスター上で、複数のバージョンのゲームサーバーが管理されているとすると、複雑性が増してきます。

そこをサポートするのが GCGS となります。

用語の説明

基本的に、GCGS は Agones クラスターを管理するものですが、Agones をよりグローバルで利用するための、コンポーネントが存在しています。まずは用語を整理してみましょう。

Realm
GCGS は、GKE で実行される Kubernetes クラスターをサポートするように設計されています。 Google Cloud のリージョンとゾーンの概念に基づいて構築できるように、GCGS は Realm(レルム)と呼ばれる概念を導入しています。
Realm は、ユーザーによって定義することができる、ゲームサーバークラスターのグループです。ゲームのレイテンシ要件などに基づいて、クラスターのグルーピングを定義することができます。

Game Server Cluster
Game Server Cluster(以下、GS Cluster) は Realm のサブリソースという位置づけで、Agones がインストールされた Kubernetes クラスターを指します。

Game Server Deployment
Game Server Deployment (以下、GSD)は、ゲームサーバーとしてデプロイできるゲームサーバーを管理するリソースです。GSD には Game Server Config と Rollout リソースが紐づきます。

Game Server Config
Game Server Config (以下、GS Config)は GSD のサブリソースであり、ゲームサーバーの数やバッファ、ゲームサーバーのイメージ(バージョンなど)を指定するリソースです。

Rollout
Rollout は GSD に紐づくリソースで、GS config を対象となるRealmにマッピングします。

各リソース群は図の GSD、Realm のように紐付いています。
GSD:gcgs-deployment には、gcgs-config1 と gcgs-config2 が紐付いていて、Rollout により、gcgs-config1 は Realm: gcgs-realm-tokyo、gcgs-config2 はRealm:gcgs-realm-us に関連付けられています。
一方クラスターのリソース側を見てみると、Realm: gcgs-realm-tokyo には GS cluster:tokyo-cluster、Realm: gcgs-realm-us には GS cluster:us-cluster に紐付けられています

GCGSのリソースの関連図

GCGSを使ってみる

さて、用語だけを見てもわかりにくいと思いますので、早速触っていってみましょう。

検証環境は以下の通りです。

GKEのバージョン: 1.14.10-gke.27
Agonesのバージョン:1.4.0

GKEクラスター

gcloud container clusters listNAME           LOCATION           MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION    NUM_NODES  STATUS
agones-tokyo1 asia-northeast1-b 1.14.10-gke.27 34.85.123.86 n1-standard-1 1.14.10-gke.27 3 RUNNING
agones-us1 us-central1-c 1.14.10-gke.27 35.202.221.194 n1-standard-1 1.14.10-gke.27 3 RUNNING

Agoneのインストール

kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.4.0/install/yaml/install.yaml

Realmの作成

さてまずは日本のタイムゾーンでRealmを作成してみましょう。タイムゾーンは、Japanです。(JSTではない)

gcloud beta game servers realms create gcgs-realm-tokyo --time-zone Japan
Create request issued for: [gcgs-realm-tokyo]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1585835792726-5a24f2b18f89d-bd4b698e-d1275053] to complete...done.
Created realm [gcgs-realm-tokyo].

これで Realm が作成できました。

クラスターの作成

次にRealmに対して、クラスターを追加します。
ここでは、gcgs-realm-tokyo という Realm に対して、tokyo-cluster というGS Cluster名で、agones-tokyo1 という GKE クラスターを登録しています。

gcloud beta game servers clusters create tokyo-cluster --realm=gcgs-realm-tokyo --location=global \
--gke-cluster=projects/gcgs-project-medium/locations/asia-northeast1-b/clusters/agones-tokyo1 \
--namespace=default --labels=app=gcgs --no-dry-run
Create request issued for: [tokyo-cluster]
Waiting for [operation-1585836561823-5a24f58f077fe-2c7d513a-a9615b63] to finish...done.
Created game server cluster: [tokyo-cluster]

コンソールでも、このように登録されていることがわかります。

Game Server Deploymentの作成

次は、GSD の作成です。以下のコマンドで作成ができます。これは GSD の箱だけ作成しているので、GS Config は現時点ではまだ含んでいません。

gcloud beta game servers deployments create gcgs-deployment
Create request issued for: [gcgs-deployment]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1585894734340-5a25ce44aa15f-fedbaee2-97e275a3] to complete...done.
Created deployment [gcgs-deployment].

Game Server Configの作成

今回は、GS Config として以下の2つを作成します。
fleet_configs.yaml は、fleet となるコンテナの情報が記載されている定義ファイルになります。Agones で利用する fleet の定義と同様です。

name: fleet-spec-1
fleetSpec:
replicas: 2
scheduling: Packed
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
metadata:
labels:
foo: bar
spec:
ports:
- name: default
portPolicy: Dynamic
containerPort: 7654
health:
initialDelaySeconds: 30
periodSeconds: 60
sdkServer:
logLevel: Info
grpcPort: 9357
httpPort: 9358
template:
spec:
containers:
- name: simple-udp
image: gcr.io/agones-images/udp-server:0.17

scaling_configs.yaml は Fleet のスケーリングポリシーです。

- name: scaling-config-1
fleetAutoscalerSpec:
policy:
type: Buffer
buffer:
bufferSize: 2
minReplicas: 2
maxReplicas: 4

この2つを先程作成した GSD に紐付けます。

 gcloud beta game servers configs create gcgs-config1 --deployment gcgs-deployment --fleet-configs-file fleet_configs.yaml --scaling-configs-file scaling_configs.yaml
Create request issued for: [gcgs-config1]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1585896253338-5a25d3ed4b4a5-49b49ba7-1fb74839] to complete...done.
Created game server config [gcgs-config1].
gcloud beta game servers configs list
NAME LOCATION DEPLOYMENT DESCRIPTION CREATE_TIME UPDATE_TIME LABELS
gcgs-config1 global gcgs-deployment 2020-04-03T06:44:13.406891499Z 2020-04-03T06:44:14.383446410Z

GS Config の情報を見ていただくとわかるように、GSD に GS Config が紐づいているのがわかります。

以下のコマンドで、GSD のデフォルトのコンフィグとして、gcgs-config1を設定し Rollout します。 —default-configを適用すると、すべてのクラスターに GS Config が適用されます。

gcloud beta game servers deployments update-rollout gcgs-deployment  --default-config gcgs-config1 --no-dry-run
Update rollout request issued for: [gcgs-deployment]
Waiting for [operation-1586149456778-5a29832ee938d-533b4b4a-1b182984] to finish...done.
Updated rollout for: [gcgs-deployment]
createTime: '2020-04-03T06:18:54.397195002Z'
defaultGameServerConfig: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config1
etag: xhMbAXHEmaVROpu8NuhySCWgoo4jrhJdwXOUu9bch74
name: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/rollout
updateTime: '2020-04-03T06:18:55.035363625Z'

GSD をロールアウトすると、Agones クラスターに、Fleet が生成されてるのがわかります。

kubectl get fleet -o wide
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
fleet-gcgs-deployment-gcgs-config1 Packed 2 2 0 2 31h
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fleet-gcgs-deployment-gcgs-config1-6qrmr-prkh9 2/2 Running 0 16m 10.12.0.9 gke-agones-tokyo1-default-pool-84d097ce-gc65 <none> <none>
fleet-gcgs-deployment-gcgs-config1-6qrmr-v4k6b 2/2 Running 0 16m 10.12.0.10 gke-agones-tokyo1-default-pool-84d097ce-gc65 <none> <none>

現在のGCGSの状態はこちらの図のようになっています。

gcgs-config1 の Rollout を実行

複数の GS Cluster での構成

さて、GSD を Rollout している状態で、GS Cluster を追加してみましょう。新しく、USリージョンの GS Cluster を作成し、gcgs-realm-us というRealm へ追加しました。

Realm : gcgs-realm-us
GS Cluster : us-cluster

Realm を作成し、GS Clusterとして登録するとすぐに、Fleet の追加が行われました。

kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fleet-gcgs-deployment-gcgs-config1-cn7pz-7bkpc 2/2 Running 0 19m 10.32.0.6 gke-agones-us1-default-pool-0eaeb4fc-mxtm <none> <none>
fleet-gcgs-deployment-gcgs-config1-cn7pz-8q2lp 2/2 Running 0 19m 10.32.0.7 gke-agones-us1-default-pool-0eaeb4fc-mxtm <none> <none>

GSD の default-config でRolloutしていると、GCGS に構成されたすべての Realmに対して、default-configで指定している GS Config が展開されます。Fleet の Replicas:2 に設定してあったため、us-cluster、tokyo-cluster のそれぞれで2つの pod(fleet) が存在していることとなります。

gcgs-config1 をが追加のGS Clusterにも反映される

それぞれの Realm に異なる GS Configを適用する

ゲームサーバーを運用していく中で、異なるバージョンの専用サーバーをデプロイするケースもあると思います。その場合、GCGS では、RealmSelector の定義を記述した YAML/json ファイルによって —-default-config をオーバーライドする必要があります。RealmSelector は、その名の通り、どの GS Config をどの Realm に適用するか、という定義で、Rollout リソースが保有しています。以下はサンプルです。

- realmsSelector:
realms:
- projects/test-project-1/locations/us-west1/realms/realm-1
configVersion: version2
- realmsSelector:
realms:
- projects/test-project-1/locations/us-west1/realms/realm-3
configVersion: version3

まずは、先程作成した gcgs-config1 とは別に、gcgs-config2 を作成します。実際の運用ではリージョンごとに、Replicas の数のみを変える、ということはないと思います。バージョンの異なるゲームサーバーのイメージが異なる、などが実際のユースケースかと思いますが、今回は変更が適用されたという変化がわかりやすいように Replicas の数だけを変更しています。また scaling_configs.yaml も数だけ変更しています。

異なる GS config を別の Realm に適用する

fleet_configs_v2.yaml

- name: fleet-spec-1
fleetSpec:
replicas: 4
scheduling: Packed
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
template:
metadata:
labels:
foo: bar
spec:
ports:
- name: default
portPolicy: Dynamic
containerPort: 7654
health:
initialDelaySeconds: 30
periodSeconds: 60
sdkServer:
logLevel: Info
grpcPort: 9357
httpPort: 9358
template:
spec:
containers:
- name: simple-udp
image: gcr.io/agones-images/udp-server:0.17

scaling_configs_v2.yaml

- name: scaling-config-1
fleetAutoscalerSpec:
policy:
type: Buffer
buffer:
bufferSize: 4
minReplicas: 4

maxReplicas: 6

上記のファイルを利用して、gcgs-config2 を作成してみます。

gcloud beta game servers configs create gcgs-config2 --deployment gcgs-deployment --fleet-configs-file fleet_configs_v2.yaml --scaling-configs-file scaling_configs_v2.yaml
Create request issued for: [gcgs-config2]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1586264243061-5a2b2ecba4159-ae50850d-c5a034a0] to complete...done.
Created game server config [gcgs-config2].
gcloud beta game servers configs list
NAME LOCATION DEPLOYMENT DESCRIPTION CREATE_TIME UPDATE_TIME LABELS
gcgs-config1 global gcgs-deployment 2020-04-03T06:44:13.406891499Z 2020-04-03T06:44:14.383446410Z
gcgs-config2 global gcgs-deployment 2020-04-07T12:57:23.110784095Z 2020-04-07T12:57:23.775400806Z

この作成した gcgs-config2 を gcgs-realm-us に適用し、gcgs-realm-tokyo のクラスターと異なる pod 台数(4台)になることが期待値です。

まずは Realm のリソース名を取得します。

gcloud beta game servers realms describe gcgs-realm-us
createTime: '2020-04-07T11:43:59.437067732Z'
etag: 9vMfO_XuqZ_bOv0wkW8bas06oqZhBwmkZ_I5o1U01vs
name: projects/gcgs-project-medium/locations/global/realms/gcgs-realm-us
timeZone: America/Los_Angeles
updateTime: '2020-04-07T11:43:59.817120936Z'
ggs realms describe gcgs-realm-tokyo
createTime: '2020-04-02T13:56:32.771204123Z'
etag: Gni7wON7BjmXg818BEP3akJBGuZItcOwl_xerdyj3ew
name: projects/gcgs-project-medium/locations/global/realms/gcgs-realm-tokyo
timeZone: Japan
updateTime: '2020-04-02T13:56:33.173215392Z'

以下のコマンドでオーバーライドを行います。実行後、 fetch-state を行うことで、どのクラスターにどの GS Config が適用されているかがわかります。

gcloud beta game servers deployments update-rollout  gcgs-deployment --config-overrides-file=realm_selector.yaml --no-dry-run
Update rollout request issued for: [gcgs-deployment]
Waiting for [operation-1586264754442-5a2b30b3552be-b98c5ea1-ca8d20b9] to finish...done.
Updated rollout for: [gcgs-deployment]
createTime: '2020-04-03T06:18:54.397195002Z'
defaultGameServerConfig: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config1
etag: 7Lh_kwmCR4orfr7Skauu2vRMoBbMRsDDh2ZYDxSYh9s
gameServerConfigOverrides:
- configVersion: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config1
realmsSelector:
realms:
- projects/gcgs-project-medium/locations/global/realms/gcgs-realm-tokyo
- configVersion: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config2
realmsSelector:
realms:
- projects/gcgs-project-medium/locations/global/realms/gcgs-realm-us
name: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/rollout
updateTime: '2020-04-03T06:18:55.035363625Z'
gcloud beta game servers deployments describe-rollout gcgs-deployment
createTime: '2020-04-03T06:18:54.397195002Z'
etag: LARzSxu-xodjo6d_Ni7Vx-_NCN-kF4Ufq2NozA8Qveg
gameServerConfigOverrides:
- configVersion: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config1
realmsSelector:
realms:
- projects/gcgs-project-medium/locations/global/realms/gcgs-realm-tokyo
- configVersion: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/configs/gcgs-config2
realmsSelector:
realms:
- projects/gcgs-project-medium/locations/global/realms/gcgs-realm-us

また実際のクラスターで確認しても、異なる GS Config が適用されていることがわかります。

agones-tokyo1(gcgs-realm-tokyo) で実行

kubectl get fleet
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
fleet-gcgs-deployment-gcgs-config2 Packed 4 4 0 4 45s
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fleet-gcgs-deployment-gcgs-config2-5gqjs-njq8w 2/2 Running 0 37s 10.32.2.27 gke-agones-us1-default-pool-0eaeb4fc-r0xt <none> <none>
fleet-gcgs-deployment-gcgs-config2-5gqjs-p8bj2 2/2 Running 0 37s 10.32.2.26 gke-agones-us1-default-pool-0eaeb4fc-r0xt <none> <none>
fleet-gcgs-deployment-gcgs-config2-5gqjs-qs4p2 2/2 Running 0 37s 10.32.0.18 gke-agones-us1-default-pool-0eaeb4fc-mxtm <none> <none>
fleet-gcgs-deployment-gcgs-config2-5gqjs-zpd7f 2/2 Running 0 37s 10.32.2.25 gke-agones-us1-default-pool-0eaeb4fc-r0xt <none> <none>

agones-us(gcgs-realm-us) で実行

kubectl get fleet
NAME SCHEDULING DESIRED CURRENT ALLOCATED READY AGE
fleet-gcgs-deployment-gcgs-config1 Packed 2 2 0 2 2m56s
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fleet-gcgs-deployment-gcgs-config1-gnsxt-54crf 2/2 Running 0 2m29s 10.12.2.34 gke-agones-tokyo1-default-pool-84d097ce-tjbr <none> <none>
fleet-gcgs-deployment-gcgs-config1-gnsxt-bvxzv 2/2 Running 0 2m28s 10.12.2.35 gke-agones-tokyo1-default-pool-84d097ce-tjbr <none> <none>

環境のクリーンアップ

GCGS ですが、リソースの依存関係があるため、順番に削除していく必要があります。

  1. Rollout(default-config, config-overrides の両方)
  2. GS Config
  3. GSD

です。

gcloud beta game servers deployments update-rollout gcgs-deployment --no-dry-run --clear-config-overrides --clear-default-config
Update rollout request issued for: [gcgs-deployment]
Waiting for [operation-1586311718699-5a2bdfa7f0354-e74d9909-9827f5dd] to finish...done.
Updated rollout for: [gcgs-deployment]
createTime: '2020-04-03T06:18:54.397195002Z'
etag: jzLA1dyY1ZyWMEEDgA6LP9k4w03YcOwGS8yGiMEBPNE
name: projects/gcgs-project-medium/locations/global/gameServerDeployments/gcgs-deployment/rollout
updateTime: '2020-04-03T06:18:55.035363625Z'
gcloud beta game servers configs delete gcgs-config1 --deployment gcgs-deployment && \
gcloud beta game servers configs delete gcgs-config2 --deployment gcgs-deployment

You are about to delete game server config [gcgs-config1]
Do you want to continue (Y/n)? Y
Delete request issued for: [gcgs-config1]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1586311794982-5a2bdff0aff72-e3f37e94-ac98b0f0] to complete...done.
Deleted game server config [gcgs-config1].
You are about to delete game server config [gcgs-config2]
Do you want to continue (Y/n)? Y
Delete request issued for: [gcgs-config2]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1586311800453-5a2bdff5e793e-8bfd5f25-d9bbf239] to complete...done.
Deleted game server config [gcgs-config2].
gcloud beta game servers deployments delete gcgs-deployment
You are about to delete deployment [gcgs-deployment]
Do you want to continue (Y/n)? Y
Delete request issued for: [gcgs-deployment]
Waiting for operation [projects/gcgs-project-medium/locations/global/operations/operation-1586311868925-5a2be0373447e-6db27929-217a8d65] to complete...done.
Deleted deployment [gcgs-deployment].

Relam, GKE クラスタは、適宜コンソールから削除してください。

まとめ

GCGS を使うことでグローバルなゲームサーバークラスターの管理が、とてもシンプルになるように感じました。GS Config と Rollout の部分が少し混乱しやすい気もしたので、この記事で理解の助けになれば幸いです。

あとgcloud beta game serversはちょっと長いので、

alias ggs=’gcloud beta game servers’

としてエイリアス追加しておくことをおすすめします!

--

--

Yutty Kawahara
google-cloud-jp

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