作者:赵伟基、力铭、澄潭

OpenKruiseGame(下文简称:OKG)是一个面向多云的开源游戏服 Kubernetes 作业负载,是 CNCF 作业负载开源项目 OpenKruise 在游戏范畴的子项目,其供给了热更新、原地升级、定向办理等常用的游戏服办理功能。而游戏作为典型的流量密集型场景,在吞吐量、推迟性能、弹性与安全性等方面对进口网关提出了很高的要求。

Higress 是依据阿里内部两年多的 Envoy 网关实践沉淀,以开源 Istio 与 Envoy 为核心构建的下一代云原生网关。Higress 完成了安全防护网关、流量网关、微服务网关三层网关合一,能够显著下降网关的布置和运维成本。Higress 能够作为 K8s 集群的 Ingress 进口网关,并且兼容了很多 K8s Nginx Ingress 的注解,能够从 K8s Nginx Ingress 快速滑润迁移到 Higress。一起也支撑 K8s Gateway API 标准,支撑用户从 Ingress API 滑润迁移到 Gateway API。

本文将演示 Higress 怎么无缝对接 OKG 游戏服,并为其带来的优异特性。

Higress 无缝接入 OKG

前置过程:

  1. 装置 OpenKruiseGame [ 1]

  2. 装置 Higress [ 2]

OKG 供给许多游戏服热更新和游戏服弹性的优异特性,便于游戏运维人员办理游戏服的全生命周期。游戏不同于无状况类型的服务,玩家战斗的网络流量是不允许被负载均衡的,因而每一个游戏服需求独立的拜访地址。

运用原生作业负载(如 Deployment 或 StatefulSet)时,运维工程师需求为很多游戏服一一装备接入层网络,这无疑阻碍了开服功率,一起手动装备也无形中增加了故障的概率。OKG 供给的 GameServerSet 作业负载能够主动化地办理游戏服的接入网络,大幅度下降运维工程师的负担。

关于 TCP/UDP 网络游戏,OKG 供给了诸如 HostPort、SLB、NATGW 等网络模型;而关于 H5/WebSocket 类型的网络游戏,OKG 也相应供给了 Ingress 网络模型,如 Higress、Nginx、ALB 等。

Higress  OpenKruiseGame 游戏网关最佳实践

本文选用了一款开源游戏 Posio 来构建 demo 游戏服。下述装备中,IngressClassName=”higress” 指定了 Higress 作为游戏服的网络层,Higress 经过下面装备能够无缝接入 Posio 游戏服,并且能够依据 Annotation 完成 Higress 界说的高阶流量办理等功能。示例 Yaml 如下所示,GameServerSet 生成的游戏服对应的拜访域名与游戏服 ID 相关。

在此例中,游戏服 0 的拜访域名为 game0.postio.example.com,游戏服 1 的拜访域名为 game1.postio.example.com. 客户端以此来拜访不同的游戏服。

piVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: postio
  namespace: default
spec:
  replicas: 1
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
  network:
    networkType: Kubernetes-Ingress
    networkConf:
    - name: IngressClassName
      value: "higress"
    - name: Port
      value: "5000"
    - name: Path
      value: /
    - name: PathType
      value: Prefix
    - name: Host
      value: game<id>.postio.example.com
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-beijing.aliyuncs.com/chrisliu95/posio:8-24
          name: postio

OKG 水平弹性 [ 3] 供给主动扩容、依据游戏服的 OpsState 缩容、依据 DeletionPriority 缩容、依据游戏服序号缩容等功能来支撑游戏运维的事务需求。水平弹性的特性在给游戏开发者带来便利的一起,也对进口网关提出了更高的要求:进口网关有必要具备装备热更新的才能,完结路由装备的滑润下发。

原因在于: 在进行游戏服的扩容时,OKG 会同步创建 Ingress 等相关网络相关资源,以此来保证游戏服的主动上线。假如进口网关不具备装备热更新的才能,在扩容时就,线上玩家就会遇到衔接断开等问题,影响玩耍体会。

Nginxreload 无法高雅热更新

在游戏服出现扩容,或许界说的路由战略发生改变时,Nginx 的装备改变会触发 reload,导致上下游的衔接都断开并触发重连。

咱们以 Posio 游戏服为例,模仿 Nginx OKG 在游戏服扩容时出现的问题。Posio 服务端依赖于 Socket 衔接与客户端通讯。游戏服扩容时,触发对应的 Ingress 资源创建,此刻 Nginx-ingress-controller 监听到 Ingress 资源改变,触发本身 reload 机制,此刻本来与游戏服树立的衔接(如本例中的 Socket 衔接会被断开)。在正在游戏的玩家侧的体感便是出现了反常卡顿。

为了直观的展示 Nginx Ingress reload 带来的影响,咱们对 Nginx 默认装备参数进行一些更改:

kubectl edit configmap nginx-configuration -n kube-system
data:
  ...
  worker-shutdown-timeout: 30s # 一个很难做权衡的装备

Nginx 装备参数中 worker-shutdown-timeout 是 Nginx 的 worker 进程高雅下线的超时装备,worker 进程会先停止接纳新的衔接,并等候老的衔接逐渐封闭,到达超时时刻后,才会去强制封闭当时的所有衔接,完结进程退出。

此参数装备过小,会导致很多活泼衔接瞬间断开;而此参数装备过大时,又会导致 websocket 长衔接一直维持住 Nginx 进程,当发生频频 reload 时会发生很多 shutting down 状况的 worker 进程,老 worker 占有的内存迟迟得不到释放,可能会导致 OOM 引发线上故障:

Higress  OpenKruiseGame 游戏网关最佳实践

实际玩耍的测验过程如下:客户端拜访游戏服,进行正常玩耍。在此过程中经过 OKG 才能触发游戏服扩容,检查此刻客户端的呼应。经过网页开发者工具能够看到,出现了两条 Socket 衔接,一条是原先浏览器拜访游戏服树立,另一条是因为 Nginx 断连后重连发生的 Socket 衔接。

Higress  OpenKruiseGame 游戏网关最佳实践

原有衔接纳到的最后一个包时刻戳是 15:10:26。

Higress  OpenKruiseGame 游戏网关最佳实践

而新建衔接到获取第一个正常游戏包的时刻是 15:10:37,网页与游戏服的断连大约持续 5s 左右。

Higress  OpenKruiseGame 游戏网关最佳实践

除了玩家的玩耍体会受影响,这个机制也会给事务全体安稳性埋雷。在高并发场景下,因为衔接瞬断,导致大批量客户端的并发重连,会导致 Nginx 的 CPU 瞬间飙升;而后端游戏服务器需求处理更多事务逻辑,一般比网关的资源需求更高,因而 Nginx 透传过来的很多并发重连,也更简单打垮后端,造成事务雪崩。

Higress 怎么完成高雅热更新

Higress 支撑选用 K8s Ingress 露出游戏服外部 IP 端口,供玩家衔接拜访。当游戏服弹性或许界说的路由装备发生变化时,Higress 支撑路由装备的热更新,以此保证玩家衔接的安稳性。

Higress  OpenKruiseGame 游戏网关最佳实践

Higress 依据 Envoy 的准确装备改变办理,做到了真正的装备动态热更新。在 Envoy 中 downstream 对应 listener 装备,交由 LDS 完成装备发现;upstream 对应 cluster 装备,交由 CDS 完成装备发现。listener 装备更新重建,只会导致 downstream 衔接断开,不会影响 upstream 的衔接;downstream 和 upstream 的装备能够独立改变,互不影响。再进一步,listener 下的证书(cert),过滤器插件(filter),路由(router)均能够完成装备独立改变,这样不论是证书/插件/路由装备改变都不再见引起 downstream 衔接断开。

准确的装备改变机制,除了让 Envoy 能够完成真正的热更新,也让 Envoy 的架构变的更牢靠,Envoy 装备办理从规划之初便是为数据面(DP)和控制面(CP)分离而规划的,因而运用 gRPC 完成远程装备动态拉取,并凭借 proto 来标准装备字段,并坚持版别兼容。这个规划完成了数据面和控制面的安全域阻隔,增强了架构的安全性。

运用 OKG 接入 Higress 后,下面仍然模仿客户端拜访游戏服,进行正常玩耍。在此过程中经过 OKG 才能触发游戏服扩容,检查此刻客户端的呼应。经过网页开发者工具能够看到,在此过程中客户端与游戏服树立的衔接安稳不受影响。

Higress  OpenKruiseGame 游戏网关最佳实践

此外,在大规划游戏服场景下,每个游戏服对应一个独立的 Ingress,会发生很多的 Ingress 资源,咱们测验在到达 1k 级别规划时,Nginx Ingress 要新扩一个游戏服需求分钟级收效,而 Higress 能够在秒级收效。Nginx Ingress 的这一问题也被 Sealos 踩坑,并终究经过切换到 Higress 处理,有爱好能够阅读这篇文章了解:《云原生网关哪家强:Sealos 网关血泪史》


加入 OKG 和 Higress 开源社区沟通

欢迎我们经过搜索群号进入钉钉群沟通,云原生游戏沟通群的钉钉群号为:44862615,Higress 社区沟通 2 群的钉钉群号为:30735012403

相关链接:

[1]OpenKruiseGame

openkruise.io/zh/kruisega…

[2]Higress

higress.io/zh-cn/docs/…

[3]OKG 水平弹性

openkruise.io/zh/kruisega…