配置多集群分配

本页面介绍了如何为 Game Servers 配置多集群分配。通过多集群分配,您可以从大区内的一个集群请求 Ready 状态下的 GameServer,然后从该大区内任何集群取回 Ready 状态下的 GameServer。多集群分配需要手动配置和设置,以便集群可以相互连接并同时连接到多集群分配端点。

如需详细了解 GameServer 分配,请参阅 Agones 的创建游戏服务器队列快速入门,以查看综合概览。

准备工作

开始之前,我们建议您先了解 Game Servers 概览中的关键概念。请确保您已执行以下任务:

  • 确保您已启用 Game Services API。
  • 启用 Game Services API
  • 选择安装了 Cloud SDK 的 shell,或使用 API 客户端:
  • Cloud Shell

    如需启动 Cloud Shell,请执行以下步骤:

    1. 转到 Google Cloud Console。

      Google Cloud Console

    2. 在控制台的右上角,点击激活 Cloud Shell 按钮:

    控制台下方的框架内会打开一个 Cloud Shell 会话。您可以使用此 shell 运行 gcloud 命令。

    本地 shell

    如需安装 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 文件的路径。 此变量仅适用于当前的 shell 会话,因此,如果您打开新的会话,请重新设置该变量。

    客户端库

    您可以使用客户端库以编程方式控制 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 使用 Citadel 项目作为多集群分配客户端证书的证书管理器,Agones 使用它们来促进集群之间的安全连接。您必须将其安装在注册到 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 创建新命名空间:

    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. 创建 Game Servers 配置,并为此配置采用一个将副本设置为 5 并应用 gameName: udp-server 标签的队列规范。

  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 集群:

kubectl create -f LOCAL_FILE -o yaml

此操作会在两个集群间分配 10 个准备就绪的副本中的 1 个。重复执行此命令 9 次,并在两个集群间分配全部 10 个副本。

大区内的任何集群上的端点都可用于从大区中的任何集群中分配 GameServerGameServer 分配使用轮询机制,在整个大区内的所有集群之间实现负载平衡。

问题排查

如果按照本指南中的步骤遇到问题,建议您查看以下问题排查文档:

未指定多集群分配政策

您尝试分配游戏服务器时看到以下错误:

no multi-cluster allocation policy is specified

通过确保在游戏服务器命名空间中 citadel 创建了 istio.default Secret,验证您是否已在集群上安装 citadel

kubectl get secret istio.default -n NAMESPACE

由未知授权机构签署的证书

您尝试分配游戏服务器时看到以下错误:

transport: authentication handshake failed: x509: certificate signed by unknown authority

确认您已为所有集群正确设置了 allocator-tls-ca Kubernetes Secret。Helm 安装还会更新 allocator-tls-ca Secret,但如果您手动更改 TLS 密钥,则还需要更新 allocator-tls-ca Secret。如需验证证书授权机构,请运行以下命令:

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

根本原因已修复,问题仍然存在

在所有集群中完成对单个集群的更改可能需要一个小时。您可以即时更改对帐,例如,更改您的 Game Servers 资源,例如更新领域资源上的标签:

gcloud game servers realms update REALM_NAME --update-labels=usage=testing --location=REALM_LOCATION

后续步骤