このページでは、Game Servers のマルチクラスタの割り当てを構成する方法について説明します。マルチクラスタの割り当てを使用すると、レルム内の 1 つのクラスタから Ready
状態の GameServer
をリクエストし、レルム内のどのクラスタからでも Ready
状態の GameServer
を戻すことができます。マルチクラスタの割り当てを使用するには、手動の構成と設定を行って、クラスタ間で相互接続できるようにする必要があります。また、マルチクラスタの割り当てエンドポイントにも接続できるようにする必要があります。
GameServer
割り当ての詳細については、Agones の Game Server Fleet の作成のクイックスタートをご覧いただき、包括的な概要を確認してください。
始める前に
始める前に、Game Servers の概要の主なコンセプトを理解しておくことをおすすめします。次のタスクも完了していることを確認してください。
- Game Services API が有効になっていることを確認します。 Game Services API を有効にする
- gcloud CLI がインストールされているシェルを選択するか、API クライアントを使用します。
Google Cloud Console に移動します。
コンソールの右上隅にある [Cloud Shell をアクティブにする] ボタン をクリックします。
- サービス アカウントを作成する。
- 秘密鍵を JSON ファイルとしてダウンロードします。
-
環境変数
GOOGLE_APPLICATION_CREDENTIALS
を、認証情報を含む JSON ファイルのパスに設定します。この変数は現在のシェル セッションにのみ適用されるため、新しいセッションを開く場合は、変数を再度設定する必要があります。
Cloud Shell
Cloud Shell を起動するには、次の手順に従います。
コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルで gcloud
コマンドを実行します。
ローカルシェル
gcloud CLI をインストールします。
Google Cloud CLI に必要なデフォルトのプロジェクトが設定されていることを確認します(設定されていない場合、後でコマンドごとに --project
フラグを明示的に指定する必要があります)。
gcloud config list project
デフォルト プロジェクトを設定していない場合は、次のコマンドを実行して、デフォルト プロジェクトを設定します。PROJECT_ID
は、設定するプロジェクト ID に置き換えてください。
gcloud config set project PROJECT_ID
次のコマンドを実行して、Google Cloud CLI のバージョンを確認します。Game Servers には、gcloud CLI のバージョン 306.0.0
以降が必要です。
gcloud version
インストールを更新するには、次のコマンドを実行します。
gcloud components update
curl / PowerShell
REST API を curl
または Windows PowerShell で使用するには、次の操作を行います。
クライアント ライブラリ
Google Cloud Game Servers は、クライアント ライブラリを使用して、プログラムで制御できます。ライブラリと認証の手順については、クライアント ライブラリの概要をご覧ください。
Agones アロケータ サービスの構成
Agones インストール用に Agones アロケータ サービスが設定され、単一のクラスタ割り当てが同じガイドを使用して機能するようにします。なお、デフォルトでは、agones-allocator
サービスには有効なサービス証明書がインストールされていないため、証明書を置き換える必要があります。リージョンの Google Cloud Platform IP アドレスを予約し、予約した IP アドレスを使用して agones-allocator
をインストールします。これにより、サービスに対して有効な証明書も発行されます。IP アドレスを予約するには、次のコマンドを実行します。
gcloud compute addresses create allocator-service --region REGION
予約済み IP を確認するには、次のコマンドを実行します。
gcloud compute addresses describe allocator-service --region REGION --format="value(address)"
次に、前述のコマンドから予約済みの IP を RESERVED_IP として渡し、Agones をインストールまたはアップグレードします。
helm upgrade RELEASE --install --set agones.allocator.http.loadBalancerIP=RESERVED_IP --set agones.allocator.service.loadBalancerIP=RESERVED_IP --namespace agones-system --create-namespace agones/agones
RESERVED_IP は、agones-allocator
サービスに使用する IP アドレスです。
RELEASE は、ヘルムチャートのインストール用の Agones リリースの名前です。
Citadel のインストール
Game Servers は、Agone がクラスタ間の安全な接続を簡単にするために使用するマルチクラスタ割り当ての、クライアント側の証明書マネージャーとして Citadel プロジェクトを使用します。Citadel は、Game Servers に登録されている各 Google Kubernetes Engine クラスタにインストールする必要があります。
Citadel は、クラスタ上のすべての名前空間に対して、istio.default
Kubernetes secret
を発行し、それを Game Servers がクライアント側の証明書として使用します。
Google Kubernetes Engine クラスタに Istio がインストールされている場合は、この手順を省略できます。現在、Agones とフル インストールされた Istio には、互換性に関する既知の問題があります。
Terraform ユーザーは、Terraform を使用して Citadel をインストールできます。GitHub で Terraform を使用して Citadel をインストールするための構成ファイルの例を確認できます。
このガイドは、helm v3 と git 用のコマンドライン ツールがインストールされていることを前提としています。
Citadel をインストールするには、次のようにします。
Istio GitHub リポジトリのクローンを作成します。
git clone -b release-1.5 https://github.com/istio/istio.git
Istio に新しい Namespace を作成します。
kubectl create ns istio-system
次の各コマンドをコピーして実行し、Istio Helm テンプレートから Citadel YAML インストール ファイルを生成します。
helm template istio/install/kubernetes/helm/istio --name-template istio --namespace istio-system -s charts/security/templates/serviceaccount.yaml -s charts/security/templates/clusterrole.yaml -s charts/security/templates/clusterrolebinding.yaml -s charts/security/templates/deployment.yaml > citadel.yaml
次に、下のコマンドを実行して、前の手順で生成した YAML ファイルを Google Kubernetes Engine クラスタに適用します。
kubectl apply -f citadel.yaml
Citadel が正常に動作していることを確認します。
kubectl get pods --namespace=istio-system
Citadel デプロイが単一の Pod で実行されていることを確認します。
マルチクラスタ割り当てのネットワーキング要件
マルチクラスタ割り当てがレルムで機能するためには、各クラスタでサービスが外部公開アドレスを持つアロケータ サービスが実行されていることを確認する必要があります。
これが構成されていることを確認するには、サービスに外部ロードバランサが割り当てられていることを確認します。
kubectl get service agones-allocator -n agones-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
agones-allocator LoadBalancer 10.86.3.77 RESERVED_IP 443:30219/TCP
RESERVED_IP は空でない必要があります。
マルチクラスタの割り当ての検証
割り当てプロセスをテストするには、次の手順を行います。
レルムに 2 つの Game Servers クラスタを登録して、上記のようにマルチクラスタ割り当て用に構成します。
レプリカが
5
に設定され、ラベルgameName: udp-server
が適用されたフリート仕様を使用して、Game Servers 構成ファイルを作成します。Game Servers デプロイメントのロールアウトを更新して構成ファイルを稼働させます。
次の YAML を LOCAL_FILE にコピーします。
apiVersion: "allocation.agones.dev/v1" kind: GameServerAllocation spec: multiClusterSetting: enabled: true required: matchLabels: gameName: udp-server
次のコマンドを使用して、YAML ファイルをレルム内のいずれかの Game Servers クラスタの 1 つに適用します。
kubectl create -f LOCAL_FILE -o yaml
これにより、2 つのクラスタに 10 個の準備レプリカのうち 1 個が割り当てられます。このコマンドをさらに 9 回繰り返し、両方のクラスタの 10 個のレプリカがすべて割り当てられていることを確認します。
レルム内のクラスタのエンドポイントを使用して、レルム内のクラスタから GameServer
を割り当てることができます。GameServer
の割り当ては、ラウンドロビン方式によりレルム内のすべてのクラスタ間で負荷分散されます。
トラブルシューティング
このガイドの手順で問題が発生した場合は、次のトラブルシューティング ドキュメントをご覧ください。
マルチクラスタ割り当てポリシーが指定されていない
ゲームサーバーを割り当てる際に、次のエラーが表示される場合について説明します。
no multi-cluster allocation policy is specified
ゲームサーバー名前空間に Citadel が istio.default
シークレットを作成するようにして、クラスタに正しく Citadel がインストールされていることを確認します。
kubectl get secret istio.default -n NAMESPACE
不明な認証局により署名された証明書
ゲームサーバーを割り当てる際に、次のエラーが表示される場合について説明します。
transport: authentication handshake failed: x509: certificate signed by unknown authority
すべてのクラスタの allocator-tls-ca
Kubernetes シークレットが正しく設定されているかを確認します。Helm のインストールでも allocator-tls-ca
シークレットが更新されますが、TLS シークレットを手動で変更した場合は、allocator-tls-ca
シークレットも更新する必要があります。認証局を確認するには、次のコマンドを実行します。
kubectl get secret allocator-tls-ca -n agones-system -ojsonpath="{.data.tls-ca\.crt}" | base64 -d > ca.crt kubectl get secret allocator-tls -n agones-system -ojsonpath="{.data.tls\.crt}" | base64 -d > tls.crt openssl verify -verbose -CAfile ca.crt tls.crt
正しく設定されている場合は、「tls.crt: OK
」と表示されます。
根本原因を修正したが変わらない
単一のクラスタに対する変更が全クラスタに反映されるには、最大で 1 時間かかる場合があります。たとえば、レルムリソースのラベルを更新して、Game Servers のリソースを変更することにより、直ちに反映をトリガーできます。
gcloud game servers realms update REALM_NAME --update-labels=usage=testing --location=REALM_LOCATION
次のステップ
- クラスタの登録方法を学習する。