マルチクラスタの割り当ての構成

このページでは、Game Servers のマルチクラスタの割り当てを構成する方法について説明します。マルチクラスタの割り当てを使用すると、レルム内の 1 つのクラスタから Ready 状態の GameServer をリクエストし、レルム内のどのクラスタからでも Ready 状態の GameServer を戻すことができます。マルチクラスタの割り当てを使用するには、手動の構成と設定を行って、クラスタ間で相互接続できるようにする必要があります。また、マルチクラスタの割り当てエンドポイントにも接続できるようにする必要があります。

GameServer 割り当ての詳細については、Agones の Game Server Fleet の作成のクイックスタートをご覧いただき、包括的な概要を確認してください。

始める前に

始める前に、Game Servers の概要の主なコンセプトを理解しておくことをおすすめします。次のタスクも完了していることを確認してください。

  • Game Services API が有効になっていることを確認します。
  • Game Services API を有効にする
  • Cloud SDK がインストールされたシェルを選択するか、API クライアントを使用します。
  • Cloud Shell

    Cloud Shell を起動するには、次の手順に従います。

    1. Google Cloud Console に移動します。

      Google Cloud Console

    2. コンソールの右上隅にある [Cloud Shell をアクティブにする] ボタン をクリックします。

    コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルで gcloud コマンドを実行します。

    ローカルシェル

    gcloud をインストールするには、Cloud SDK をインストールします。これには、gcloud コマンドライン ツールが含まれています。

    gcloud コマンドライン ツールに必要なデフォルトのプロジェクトが設定されていることを確認します(設定されていない場合、後でコマンドごとに --project フラグを明示的に指定する必要があります)。

    gcloud config list project
    

    デフォルト プロジェクトを設定していない場合は、次のコマンドを実行して、デフォルト プロジェクトを設定します。PROJECT_ID は、設定するプロジェクト ID に置き換えてください。

    gcloud config set project PROJECT_ID
    

    次のコマンドを実行して、Google Cloud SDK のバージョンを確認します。Game Servers では、バージョン 306.0.0 以降の SDK が必要です。

    gcloud version
    

    インストールを更新するには、次のコマンドを実行します。

    gcloud components update
    

    curl / PowerShell

    REST API を curl または Windows PowerShell で使用するには、次の操作を行います。

    1. サービス アカウントを作成する。
    2. 秘密鍵を JSON ファイルとしてダウンロードします。
    3. 環境変数 GOOGLE_APPLICATION_CREDENTIALS を、サービス アカウント キーが含まれる JSON ファイルのパスに設定します。 この変数は現在のシェル セッションにのみ適用されるため、新しいセッションを開く場合は、変数を再度設定します。

    クライアント ライブラリ

    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 --namespace agones-system --create-namespace agones/agones

RESERVED_IP は、agones-allocator サービスに使用する IP アドレスです。

RELEASE は、Helm チャートのインストールに使用する 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 v3git 用のコマンドライン ツールがインストールされていることを前提としています。

Citadel をインストールするには、次のようにします。

  1. Istio GitHub リポジトリのクローンを作成します。

    git clone -b release-1.5 https://github.com/istio/istio.git
    
  2. Istio に新しい Namespace を作成します。

    kubectl create ns istio-system
    

  3. 次の各コマンドをコピーして実行し、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
    

  4. 次に、下のコマンドを実行して、前の手順で生成した YAML ファイルを Google Kubernetes Engine クラスタに適用します。

    kubectl apply -f citadel.yaml
    
  5. 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 は空でない必要があります。

マルチクラスタの割り当ての検証

割り当てプロセスをテストするには、次の手順を行います。

  1. レルムに 2 つの Game Servers クラスタを登録して、上記のようにマルチクラスタ割り当て用に構成します。

  2. Game Servers デプロイメントを作成します

  3. レプリカが 5 に設定され、ラベル gameName: udp-server が適用されたフリート仕様を使用して、Game Servers 構成ファイルを作成します。

  4. Game Servers デプロイメントのロールアウトを更新して構成ファイルを稼働させます。

  5. 次の 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

次のステップ