来源 | 火山引擎云原生团队
幻兽帕鲁是 Pocketpair 开发的一款开放世界生存制作游戏。游戏中,玩家可以在广阔的世界中收集神奇的生物“帕鲁”,派他们进行战斗、建造、做农活,工业生产等。同时 Pocketpair 提供了私服搭建的方案,供玩家在私服环境和朋友联机。
在云原生技术栈中,通常通过如下技术组合来满足游戏服的快速部署和低成本运维管理的诉求:
- 容器编排引擎 Kubernetes(下述简称 K8s) 对 IaaS 资源和工作负载 (如游戏服) 提供了标准化的管理方案,通过声明式的 API 进行管理,同时提供弹性功能,保障服务质量的同时降低资源成本
- OpenKruiseGame(下述简称 OKG) 开源项目针对游戏服提供了相适应的工作负载抽象,解决原地升级、定向运维、网络配置等游戏运维需求
- 弹性容器实例是一种 Serverless 和容器化的计算服务。可无缝集成到 K8s 中,作为 K8s 的 Pod 载体。使用弹性容器实例,开发者可以专注于构建应用本身,而无需购买和管理底层云服务器等基础设施,并仅为容器实际运行消耗的资源付费
本文将介绍如何在火山引擎容器服务 VKE 中,基于 OKG 编排幻兽帕鲁私服,并通过火山引擎弹性容器实例 VCI 运行私服实例,实现和朋友一起联机畅玩幻兽帕鲁。
火山引擎云产品
- 容器服务 VKE:www.volcengine.com/product/vke
- 弹性容器实例 VCI:www.volcengine.com/docs/6460/76908
- 镜像仓库 CR:www.volcengine.com/product/cr
- 负载均衡 CLB:www.volcengine.com/product/clb
- 弹性块存储 EBS:www.volcengine.com/product/ebs
开源项目
- OpenKruiseGame:https://github.com/openkruise/kruise-game
其他
除了以上产品及服务外,您还需要在 Steam 购买游戏幻兽帕鲁 (Palworld)。
准备容器服务 VKE 集群环境
火山引擎容器服务 VKE 通过深度融合新一代云原生技术,提供以容器为核心的高性能 Kubernetes 容器集群管理服务,可以被用户用于快速构建容器化的应用。
步骤一:登录【火山引擎】-【容器服务】控制台,创建 VKE 集群
集群版本选择 1.24,容器网络模型选择 VPC-CNI,并且需要开启公网访问以及 API Server 公网访问;其他的保持默认配置即可
步骤二:选择暂不创建节点,负载都基于 VCI 部署
步骤三:在【组件配置】处,需要安装 csi-ebs 组件
步骤四:在集群【基本信息】-【连接信息】中生成公网访问 KubeConfig,在本地利用公网访问 kubeconfig 连接集群
安装 OpenKruiseGame 和 OpenKruise
步骤一:通过 Helm 安装 OpenKruiseGame 和 OpenKruise
# 添加 openkruise helm仓库。
helm repo add openkruise https://openkruise.github.io/charts/ --kubeconfig=<PATH/TO/kubeconfig>
# 更新 helm repo
helm repo update
# 安装 OpenKruise
helm install kruise openkruise/kruise --version 1.5.0 --set manager.image.repository=cr-helm2-cn-beijing.cr.volces.com/kruise/kruise-manager --kubeconfig=<PATH/TO/kubeconfig>
# 安装OpenKruiseGame
helm install kruise-game openkruise/kruise-game --version 0.6.0 --set image.repository=cr-helm2-cn-beijing.cr.volces.com/kruise/kruise-game-manager-volc --kubeconfig=<PATH/TO/kubeconfig>
步骤二:更改 OpenKruiseGame 和 OpenKruise 的 controller yaml,使其可以运行在火山引擎弹性容器实例 VCI 上
OpenKruise 的 controller 在 kruise-system 命名空间下,包含一个名为 kruise-controller-system 的 deployment。
OpenKruiseGame 的 controller 在 kruise-game-system 的命名空间下,包含一个名为 kruise-game-controller-manager 的 deployment;
更新上述 deployment 的 yaml,在 spec.template.metadata.annotations 中新增注解 vke.volcengine.com/burst-to-vci: enforce。
安装幻兽帕鲁私服
步骤一:在 OKG 中开启火山引擎 CLB 的 provider
修改 OKG 配置文件:该配置文件为一个 configmap,位于 kruise-game-system 命名空间下,名称为 kruise-game-manager-config。在 data.config.toml 中增加如下 **[volcengine]**部分:
apiVersion: v1
data:
config.toml: |
···
[volcengine]
enable = true
[volcengine.clb]
max_port = 700
min_port = 500
controller_manager_config.yaml: |
apiVersion: controller-runtime.sigs.k8s.io/v1alpha1
kind: ControllerManagerConfig
health:
healthProbeBindAddress: :8081
metrics:
bindAddress: 127.0.0.1:8080
webhook:
port: 9443
leaderElection:
leaderElect: true
resourceName: c637bb1e.my.domain
kind: ConfigMap
步骤二:为了使得修改的配置生效,修改完后需要手动重启 OpenKruiseGame 的 Controller Pod
该 Pod 位于 kruise-game-system 命名空间下,名称前缀为 kruise-game-controller-manager,直接删除该 Pod 即可,会被立刻重建。
步骤三:基于 OKG 安装幻兽帕鲁私服,该私服通过火山引擎的 CLB 暴露服务
需要在火山引擎中创建好一个 CLB。创建 CLB 时需要注意地域与可用区都要与集群保持一致,默认的带宽为 1Mbps,推荐修改为 10Mbps。
步骤四:使用如下 yaml 文件,创建幻兽帕鲁私服
注意,这里需要在 gameserverset 中的 spec.network.networkConf.ClbIds 中填写刚刚创建好的 CLB ID。
##服务器配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: palworld-cm
data:
PORT: "8211" #服务器将开放的 UDP 端口
PLAYERS: "16" # 可同加入服务器的最大玩家数
SERVER_PASSWORD: "palworldOnVke" # 服务器密码
QUERY_PORT: "27015" # 用于与 Steam 服务器通信的查询端口
PUID: "1000" # 服务器运行时的用户的 UID
PGID: "1000" # 服务器运行时的组的 GID
MULTITHREADING: "true" # 提高多线程 CPU 环境下的性能。它最多对 4 个线程有效,分配超过这个数量的线程没有太大意义
RCON_ENABLED: "true" # 为服务器启用 RCON
RCON_PORT: "25575" # RCON 连接端口
TZ: UTC # 备份服务器时所使用的时间戳
COMMUNITY: "false" # 服务器是否显示在社区服务器页中(建议设置SERVER_PASSWORD)
SERVER_NAME: "World of Pals" #服务器名称
SERVER_DESCRIPTION: "" # 服务器描述
---
###okg的gameserverset资源
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
labels:
app: palworld-server
name: palworld-server-mul
namespace: default
spec:
# 默认为1个副本,可以随时修改副本数
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkConf:
- name: ClbIds
value: "clb-xxxxxxxxxxxxxxxxx" # 修改成已经创建好的CLB ID
- name: PortProtocols
value: "8211/UDP"
- name: Fixed
value: "true"
networkType: Volcengine-CLB
gameServerTemplate:
metadata:
labels:
app: palworld-server
annotations:
vke.volcengine.com/burst-to-vci: enforce
spec:
containers:
- name: palworld-server
image: cr-helm2-cn-beijing.cr.volces.com/kruise/palworld-server-docker:v1.0
imagePullPolicy: IfNotPresent
envFrom:
- configMapRef:
name: palworld-cm
volumeMounts:
- mountPath: /palworld
name: datadir
resources:
limits:
cpu: "4"
memory: 8Gi
requests:
cpu: "4"
memory: 8Gi
volumeClaimTemplates:
- metadata:
annotations:
fsType: ""
type: ESSD_PL0
labels:
app: palworld-server
name: datadir
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 12Gi
storageClassName: ebs-essd
步骤五:创建好后,会生成一个名为 palworld-server-0 的 Pod,代表一个幻兽帕鲁私服
首次部署会多花一点时间下载资源,通过该 Pod 日志可以查看部署详情,出现如下内容代表部署成功:
步骤六:部署完后,会为每个私服 Pod 生成一个 LB 类型的 Service,默认位于 default 命名空间下,名称为 palworld-server-0
通过 Steam 访问私服
游戏服通过上述 LB 类型 Service 暴露服务,其外部端点即为该私服的 ip:port。
通过上述 ip:port 登录到 Steam 中的幻兽帕鲁客户端,选择专用服务器登录,填写私服地址和密码即可:
- 密码配置在 palworld 服务 configmap 的 SERVER_PASSWORD 中,默认为 palworldOnVke
玩家即可和朋友联机畅游在幻兽帕鲁的世界!
私服的更新与扩容
由于幻兽帕鲁游戏本身会持续更新,因此私服也需要同步更新。在本文所介绍的方案中,用户只需重启私服对应 Pod,即可更新私服。
如果希望能够扩容出一个完全独立的新私服,则可以修改一下幻兽帕鲁 GameServerSet 的副本数,VKE 会创建一个全新的私服 Pod,并且提供一个独立的 LB 入口地址。
通过上述操作,我们快速在火山引擎容器服务 VKE 上部署了幻兽帕鲁的私服,并且通过兼容开源生态,让游戏服的云原生化变得更加简单、快速、稳定;通过使用弹性实例 VCI,实现资源按量使用,进一步降低了运维管理成本。
未来,为了更好地帮助企业用户在保障游戏服服务质量的同时,降低游戏服的运维和资源成本,我们计划基于火山引擎自研的云原生产品矩阵,结合云原生开源生态,推出更多 游戏服生命周期内的运维管理操作。我们也将把 OKG 纳入 VKE 应用中心,提供一键部署的能力,进一步降低用户的使用成本。
目前容器服务仅对企业用户开放体验,欢迎感兴趣的用户扫码咨询、使用!
相关链接
[1] 火山引擎: www.volcengine.com
[2] 火山引擎 VKE: www.volcengine.com/product/vke
火山引擎云原生团队
火山引擎云原生团队主要负责火山引擎公有云及私有化场景中 PaaS 类产品体系的构建,结合字节跳动多年的云原生技术栈经验和最佳实践沉淀,帮助企业加速数字化转型和创新。产品包括容器服务、镜像仓库、分布式云原生平台、函数服务、服务网格、持续交付、可观测服务等。