65.9K
CodeProject 正在变化。 阅读更多。
Home

Azure 游戏开发者(第一部分):使用 Azure Kubernetes Service (AKS) 和 Microsoft Game Stack 构建全球可扩展的游戏服务器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2021年10月8日

CPOL

7分钟阅读

viewsIcon

4897

在本文中,我们将探讨如何通过容器化一个简单的 Node.js 应用程序并将其以可扩展的方式部署到 Azure Kubernetes 集群,从而在 Azure Kubernetes Service 上进行设置。

Microsoft Game Stack 是一套工具和服务,包括 Microsoft Azure、PlayFab、Xbox Services 和 Visual Studio 等工具。各种规模的游戏开发者,从独立工作室到 AAA 团队,都可以利用它来构建和发布精彩的游戏。在构建具有实时多人游戏功能的游戏时,我们可以将后端部署和运行在 Azure 或 PlayFab 等服务上,以经济高效的方式扩展以满足需求。这些服务还能确保我们的游戏在发布当天不会出现缓慢或不可靠的情况,让玩家获得最佳体验,并确保游戏评论家给出最好的评价。

在本文中,我们将探讨如何通过容器化一个简单的 Node.js 应用程序并将其以可扩展的方式部署到 Azure Kubernetes 集群,从而在 Azure Kubernetes Service 上进行设置。虽然我们在示例中使用了 JavaScript,但请记住,您可以使用类似的步骤将用其他语言编写的游戏部署到 Azure Kubernetes Service。另外请注意,如果您正在寻找一个可以自动为您处理此事的后端服务集成,PlayFab Multiplayer Servers 可能是理想的解决方案。

要求

要跟随本教程,您需要一个具有订阅的 Azure 帐户,并在您的计算机上安装以下软件

创建超级简单的 Node.js 应用

让我们从创建一个非常基础的 Node.js 服务器应用程序开始,用于本示例。请记住,我们遵循的将应用程序推送到 Azure 的过程可以用于任何 Node.js 应用程序。

在终端或命令提示符窗口中创建一个新文件夹用于此项目,并初始化项目

npm init

您选择的文件夹名称无关紧要,但在遵循本系列后续文章时应保持一致。在初始化项目时,我们可以使用默认选项。

接下来,安装 webwebweb npm 包,我们将使用它来快速启动一个 Web 服务器

npm install webwebweb

在项目文件夹中创建一个名为“index.js”的文件,并编辑它以包含以下代码

const Web = require( "webwebweb" );
Web.APIs[ "/" ] = ( qs, body, opts ) => {
    return "Hello World";
};
Web.Run( 3000 );

这段代码创建一个运行在端口 3000 上的服务器,并在 / 处有一个简单的端点,返回字符串 "Hello World"。

现在我们可以编辑 "package.json" 文件中的 scripts 部分,添加一个 start 命令

...
  "scripts": {
    "start": "node index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
...

我们可以通过运行 npm start 来测试我们的应用程序,并在 Web 浏览器中打开 https://:3000,以确保我们在页面上看到 "Hello World" 这几个字。

从应用创建 Docker 容器

现在我们有了 Node.js 应用,就可以将其容器化并部署到 Azure 了。

首先,在文件夹中创建一个新的 Dockerfile,它会将项目文件复制到一个 /src 文件夹。安装依赖项,公开端口 3000,然后启动项目。它应该看起来像这样

FROM node:14-alpine

WORKDIR /src
COPY package*.json ./
RUN npm install --production

COPY . /src
EXPOSE 3000
CMD [ "npm", "start" ]

接下来,在终端窗口中构建 Docker 镜像,传入您想要使用的项目标签。例如,我们可以构建一个名为 "test-app" 的镜像,如下所示

docker build -t test-app .

为了确保镜像已成功构建,请列出机器上的镜像

docker images

接下来,让我们通过在本地端口 3000 上运行该镜像并为其指定一个实例名称来确保镜像已成功构建

docker run --name test_app1 -d -p 3000:3000 test-app

要查看正在运行的镜像列表,我们可以运行以下命令

docker ps

如果运行正常,我们应该能够再次在 Web 浏览器中打开 https://:3000 并看到 "Hello World",就像之前一样。

最后,停止使用您启动时设置的名称运行的应用程序

docker stop test_app1

设置 Azure 容器注册表

在部署到 AKS 之前,我们的容器需要被推送到 Azure 中的 Azure 容器注册表 (ACR)。让我们准备我们的 Azure 帐户并创建一个 ACR,然后将我们新的 Docker 镜像推送到它。

在终端窗口中,使用登录命令登录到您的 Azure 帐户

az login

我们将为该项目在 Azure 帐户中创建一个新的资源组,并为其指定一个唯一的名称,例如 ms-gs-deploy,以及一个指定的区域,例如美国西部。如果您愿意,可以使用现有的资源组,但为该项目使用单独的资源组将使其在之后更容易删除,如果您想清理资源的话。

az group create -n ms-gs-deploy -l westus

通过提供资源组名称和 ACR 名称来创建一个 Basic Azure 容器注册表。请注意,名称必须全部小写,不能包含任何特殊字符。

az acr create --resource-group ms-gs-deploy --name msgsdeployregistry --sku Basic

创建完成后,使用以下命令登录到 ACR 实例

az acr login --name msgsdeployregistry

在我们将 Docker 镜像推送到 ACR 之前,需要用登录服务器地址对其进行标记。我们可以这样获取地址

az acr list --resource-group ms-gs-deploy --query "[].{acrLoginServer:loginServer}" --output table

现在,我们可以使用该地址为我们的应用程序镜像打标签。在此示例中,地址是 "msgsdeployregistry.azurecr.io"

docker tag test-app:latest msgsdeployregistry.azurecr.io/test-app:latest

像这样将镜像推送到 ACR 实例

docker push msgsdeployregistry.azurecr.io/test-app:latest

要验证镜像是否成功推送,我们可以列出 ACR 中的镜像

az acr repository list --name msgsdeployregistry --output table

设置 Azure Kubernetes Service

我们几乎准备好了——我们只需要设置我们的服务器集群来托管容器实例。此时,我们可以通过增加节点或允许 AKS 从负载均衡器自动扩展来扩展我们的后端,以应对玩家的需求。

我们应该注意到,游戏多人会话的设计对于这种方法的扩展很重要。水平扩展以启动新的游戏服务器适用于游戏的多人模式通过增加更多匹配会话来处理需求的设计。这可能与尝试扩展一个拥有数千名玩家的巨大多人世界不同。

要创建集群,我们指定资源组,附加 Azure 容器注册表,并为其命名。我们可以根据我们需要的容量来设置集群中准备的节点数量,并且通常至少要有两个节点以确保可靠性。然而,在本教程中,一个节点就足够了。请注意,此命令可能需要几分钟才能执行,所以这是一个拿咖啡或茶的好时机。

az aks create --resource-group ms-gs-deploy --name ms-gs-deploy-app --node-count 1 --generate-ssh-keys --attach-acr msgsdeployregistry

集群创建完成后,我们需要配置 kubectl 以连接到它。kubectl 工具应该会随 Azure CLI 自动安装——但如果未安装,您可以运行命令 az aks install-cli 来获取它。

az aks get-credentials --resource-group ms-gs-deploy --name ms-gs-deploy-app

通过列出集群中的节点,确保它已正确配置

kubectl get nodes

部署到 AKS 集群

剩下的就是部署我们的应用程序了。

Kubernetes 部署是通过一个包含设置和指令的 YAML manifest 文件来编排的。

以下是一个基本的 manifest 文件示例,您可以将其用作模板

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-app
  template:
    metadata:
      labels:
        app: test-app
    spec:
      containers:
        - name: test-app
          image: msgsdeployregistry.azurecr.io/test-app:latest
          ports:
          - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: test-app
spec:
  type: LoadBalancer
  ports:
  - port: 3000
  selector:
    app: test-app

将此文件保存到您的项目文件夹中,文件名为“test-app.yaml”(或类似的名称),并确保替换应用程序名称和镜像标签以匹配您的。

最后,要部署应用程序,您可以运行 apply 命令

kubectl apply -f test-app.yaml

我们的应用程序已部署并正在运行,现在我们可以将其连接到云端。让我们获取负载均衡器的外部 IP 地址,然后将其在 Web 浏览器中打开

kubectl get service test-app --watch

下一步

恭喜!您已成功将一个 Node.js 应用程序容器化并部署到 Azure,并且该应用程序已准备好扩展到您所需的任意数量的节点。既然我们已经学会了如何全局扩展托管在 Azure 上的游戏服务器后端代码,那么用一个真正的游戏服务器示例自动化这些步骤岂不更好?

加入我们下一部分的文章,学习如何使用 GitHub Actions,通过一个真实、功能齐全的多人游戏服务器来自动化您的开发和部署过程

可选:清理

如果您在本演示后完成了,并且希望在此处停止,请使用以下命令删除 Azure 上的资源,以避免任何意外的服务器成本

az group delete --name ms-gs-deploy --yes --no-wait
© . All rights reserved.