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





5.00/5 (1投票)
在本文中,我们将探讨如何通过容器化一个简单的 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