赞
踩
作者:韩运韬(青炽)
《幻兽帕鲁》是一款最近大热的开放世界生存游戏。据报道。上市不到一周,《幻兽帕鲁》销量已突破 700 万份,成为名副其实的现象级游戏。根据游戏数据库网站 SteamDB 的数据显示,《幻兽帕鲁》Steam 同时在线人数最高达到 201 万,成为史上同时在线玩家数量最高的付费游戏之一。
在游戏中,玩家可以和队友一起,收集神奇又可爱的生物“帕鲁”,并与他们一道探索、建造和战斗。开发商 Pocketpair 提供了官方的私服方案,可以突破官方服务器的 4 人组局限制,并推荐广大玩家采用。本文将介绍如何使用容器计算服务 ACS,以私服服务商视角,打造低成本的企业级幻兽帕鲁私服 SaaS 服务。
阿里云容器计算服务 ACS (Alibaba Cloud Container Compute Service) 是以 K8s 为使用界面提供容器算力资源的云计算服务,提供符合容器规范的算力资源。算力交付模式为 Serverless 形态,您无需关注底层节点及集群的运维管理。
使用 ACS,您可以以熟悉的 K8s 界面实现 SaaS 层业务逻辑,而不必过多学习云产品 OpenAPI。
进入容器计算服务控制台,进入【集群】菜单,点击【创建集群】。
按照要求配置合适的资源,注意勾选【使用 EIP 暴露 API Server】。
待集群创建完毕后,您可以进入集群详情页,在【集群信息】-【连接信息】中找到 KubeConfig 用于本地连接集群,或直接点击右上角【通过 CloudShell 管理集群】打开 Web Terminal。
先通过 kubectl 创建一个 namespace:palworld。
kubectl create ns palworld
通过 kubectl 在集群中 apply 以下 yaml 内容:
apiVersion: v1 kind: ConfigMap metadata: name: palworld-cm namespace: palworld data: PUID: "1000" # 服务器运行时的用户的 UID PGID: "1000" # 服务器运行时的组的 GID PORT: "8211" # 游戏本地客户端连接的端口 PLAYERS: "16" # 可同加入服务器的最大玩家数 SERVER_PASSWORD: "worldofpals" # 服务器密码 MULTITHREADING: "true" RCON_ENABLED: "true" RCON_PORT: "25575" # RCON 连接端口 TZ: UTC # 备份服务器时所使用的时间戳 COMMUNITY: "false" # 服务器是否显示在社区服务器页中 SERVER_DESCRIPTION: "" --- apiVersion: v1 kind: Secret metadata: name: palworld-secrets namespace: palworld type: Opaque stringData: rconPassword: yourRconPassword --- apiVersion: v1 kind: Service metadata: labels: app: palworld-server name: palworld-server namespace: palworld spec: ports: - name: server port: 8211 protocol: UDP targetPort: server - name: query port: 27015 protocol: UDP targetPort: query selector: app: palworld-server type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: palworld-server name: palworld-server namespace: palworld spec: replicas: 1 selector: matchLabels: app: palworld-server template: metadata: labels: app: palworld-server alibabacloud.com/instance-type: standard # ACS通用型实例 spec: containers: - name: palworld-server image: thijsvanloef/palworld-server-docker imagePullPolicy: IfNotPresent resources: limits: cpu: 4 memory: 16Gi requests: cpu: 4 memory: 16Gi ports: - containerPort: 8211 name: server protocol: UDP - containerPort: 27015 name: query protocol: UDP env: - name: ADMIN_PASSWORD valueFrom: secretKeyRef: name: palworld-secrets key: rconPassword envFrom: - configMapRef: name: palworld-cm volumeMounts: - mountPath: /palworld name: datadir volumes: - name: datadir persistentVolumeClaim: claimName: palworld-nas --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: palworld-nas namespace: palworld spec: accessModes: - ReadWriteMany resources: requests: storage: 10Pi storageClassName: alicloud-nas
在上例中,我们创建了:
当 Pod palworld-server 的状态为 Running,玩家就可以通过《幻兽帕鲁》游戏客户端与小伙伴愉快的联机啦:
当然,以上只是单个私服实例的部署示例,在商业化场景中,您可能需要将上述 YAMl 封装为 Helm Chart 以简化部署步骤(这里有个社区的参考案例 [ 1] ),或尝试阿里云开源的 OpenKruiseGame [ 2] 来实现更高级的运维能力。
作为 SaaS 化私服服务商,我们需要尽可能的压低资源成本。在私服 SaaS 的商业模式中,云资源占据成本的主要部分,如何尽可能降低云资源成本,成为了业务成功的关键。
作为 SaaS 服务商,我们不可避免地会根据不同用户的需求提供不同等级的服务。也就是说,我们将同时运行着大小不一的各种规格实例。
如下图右侧所示,在标准的 Kubernetes 方案中,对于大规格实例(如支持 20 人以上),可能将直接占满一台 4c32g 的机器;而对于小规格实例和中规格实例,在一个 4c32g 的 Node 上运行必然会产生一些资源碎片,无形中消耗着成本。
而在 ACS 中,我们无需关心节点概念和背后的调度细节。如下图左侧所示,ACS 会为每个不同规格的实例分配对应的资源,用户只需按量付费,不用担心资源碎片产生的浪费。
除了计算资源本身,我们在上例中使用的网络和存储资源默认也是 Serverless 化的。
上例中,我们创建了 type: LoadBalancer 的 Service 资源,该资源将默认创建对应的按量付费的阿里云 CLB 实例。当没有玩家使用私服时,CLB 实例将不产生费用。
上例中,我们还使用 alicloud-nas 存储类创建了 PVC 资源,当 PV 产生时,该资源将默认创建按量付费的阿里云 NAS 实例。按量付费的 NAS 实例将按照实际的存储量进行扣费,对于游戏私服这种存储量低的场景将极具成本优势。
游戏业务具有明显的峰谷特征,SaaS 厂商完全可以基于业务属性对私服实例进行开服、停服以节省成本。
例如,在业务上巡检私服实例,当发现玩家数保持为 0 的五分钟后,将私服实例副本数缩 0。此时对应的 ACS Pod 将不进行计费,CLB 由于服务停止也几乎不产生流量费用,只有 NAS 实例将为该私服的持久化数据收记少量费用。
同时,可以在业务上要求用户需主动触发开服操作(可以在用户“获取服务器信息”的时候触发),此时将对应实例副本数置为 1。
通过这种业务设计,结合容器计算服务 ACS 的全栈 Serverless 特性,将为 SaaS 服务商大幅降低成本。而 ACS 本身所支持的 K8s 操作界面也为业务缩放提供了便利。
私服 SaaS 服务商可能对不同的用户提供不同的差异化方案。如果服务商希望通过提供较低 SLA 保障的方案挖掘下沉市场,或是需要通过免费版拉新,则可以充分利用容器计算服务 ACS 的任务型工作负载进一步大幅降低成本。
在上例中,我们使用了 ACS 的默认实例类型:通用型实例去创建 palworld-server 工作负载。即为 spec.template.labels 加上了如下标签:
alibabacloud.com/instance-type: standard
通用型实例也是 ACS 默认的 Pod 实例类型,适合大部分延迟敏感型工作负载。在大多数场景中,通用型工作负载能够取得性能与经济性的平衡。
而对于延迟不敏感、性能不敏感的场景,我们可以使用 ACS 任务型实例大幅降本:
alibabacloud.com/instance-type: best-effort
与通用型、独享型实例相比,使用任务型实例可以节省相当可观的资源成本。任务型实例使用的 vCPU 与宿主机节点的物理 CPU 并不是严格绑定的,实例进程在运行过程中会被随机调度到任何空闲的 vCPU 超线程上,不同类型实例的 vCPU 会分时共享物理 CPU 资源,在宿主机节点低负载时,任务型实例可以获得较好的算力性能,在高负载时可能会出现 CPU 算力受限的情况。
通常来说,在相同规格的情况下,受操作系统调度算法影响,任务型实例整体生命周期内的 CPU 算力基准低于通用型实例。下图展示了一个视频转码应用,在通用型和任务型实例类型下的运行时间情况对比。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。