腾讯游戏 K8s 应用实践|更贴近业务场景的 K8s 工作负载:GameDeployment & GameStatefulSet

引言

蓝鲸容器服务(Blueking Container Service,以下简称BCS)是腾讯 IEG 互动娱乐事业群的容器上云平台,底层基于腾讯云容器服务(Tencent Kubernetes Engine, TKE),为 IEG 的自研游戏业务上云提供容器化和微服务化的建设工作。 区别于一般互联网业务,腾讯游戏业务具有大规模、低时延、网络敏感、超高可靠性要求等一系列众多特点,大量使用共享内存通信等技术,对云原生上云是一个巨大的挑战。BCS 在服务于各游戏业务的容器上云过程中,结合业务需求与社区方案,开发了两个增强版的 Kubernetes 工作负载 operator:GameStatefulSet 和 GameDeployment,更贴近业务场景,满足复杂多样的容器上云需求。

游戏业务特性的复杂性

游戏类业务具有多种类型,如房间类游戏、MMO 游戏。无论是哪种类型的游戏,都有诸如大规模的在线玩家、对网络时延和抖动异常敏感、多区多服等特点,游戏后台服务在设计时为了满足这些需求,天然地会追求实时高速通信、性能最大化,大量地使用了进程间共享内存通信、数据预加载进内存、跨主机 TCP 通信等技术,极少使用远程数据、RPC,这其实与微服务的要求有点背道而驰。
结合容器化上云的需求,总结来说,游戏类服务一般具有以下特性:

  • 大量地使用共享内存技术,偏有状态服务。
  • 超大规模,分区分服,需要能做到分批灰度发布,为减少运维难度,最好能实现智能式控制,控制发布规模、速度、步骤。
  • 实例扩缩容或更新时需要进行数据搬迁,不能马上退出服务。
  • 缩容一个实例前,需要先完成路由变更。如微服务名字通信网格,在缩容一个实例前先要跟名字通信网格的 controller 进行交互,确认是否已完成路由变更,再决定是否删除实例。
  • 开房间对局类游戏在缩容或更新前,需要等待实例上的所有对局结束后,再退出服务。
  • 为了保证平滑升级,有些游戏后台服务使用了进程 reload 技术,reload 过程中新版本的进程接替旧版本的进程提供服务,内存数据不丢失,升级过程中玩家无感知。

所有这些特点,对于 Kubernetes 和云原生上云都是巨大的挑战。Kubernetes 原生适合微服务架构,把所有实例当作牲畜而不是宠物。即便是推出了 StatefulSet(最开始起名为 PetSet) 来支持有状态服务,也只是给每个实例设定一个网络和存储的编号,即使实例挂了,拉起一个相同编号的实例代替即可,并不涉及到共享内存丢失、数据搬迁、路由变更等复杂的流程。这也是后来 PetSet 被改名为 StatefulSet 的原因。
要支持游戏这类复杂业务的上云,我们需要更进一步,开发更贴合业务场景的 workload,降低业务接入的门槛和成本。

BCS New Workload: GameDeployment & GameStatefulSet

BCS 在服务于腾讯 IEG 众多不同类型的包括但不限于游戏业务的容器上云过程中,与各游戏业务及平台探讨业务场景,抽象业务共性和需求,同时积极学习和借鉴云原生社区的优秀开源项目如 OpenKruise,argo-rollouts,flagger 等,在 Kubernetes 原生及其它开源项目的基础上,研发了 bcs-gamedeployment-operator 和 bcs-gamestatefulset-operator 两个 operator,分别对应 GameDeployment 和 GameStatefulSet 两个增强版的 Kubernetes 工作负载,在原生的 Deployment 和 StatefulSet 基础上实现了一系列增强的特性和性能提升,以满足复杂业务的云原生上云需求。
GameDeployment 和 GameStatefulSet 虽然是在服务于游戏业务的的场景中产生,但我们为其抽象出来的特性,其实能契合大多数类型业务特别是复杂业务的需求,更强的可控性,更贴近业务的研发和运维发布场景,能极大提升云原生上云的能力。

GameDeployment

Kubernetes 原生的 Deployment 是面向无状态服务的工作负载,其底层是基于 ReplicaSet 来实现,一个 Deployment 通过控制底层多个版本的 ReplicaSet 的版本数量来实现应用的滚动更新和回滚。
虽然是无状态服务,大多数应用仍有 pod 原地升级、pod 镜像热更新(下文单独)等其它一些需求,而原生的 Deployment 由于是基于多个版本的 ReplicaSet 迭代来实现,实现较为复杂,想要在其中添加原地升级等功能比较困难。
我们在借鉴原生的 Deployment 和 StatefulSet 的代码实现的基础上,参考了其它开源项目,研发实现了一个增强版的 Deployment: GameDeployment,以满足复杂的无状态应用的更多高阶需求。
相比 Deployment,GameDeployment 具有以下一些核心特性:

  • 支持滚动更新 RollingUpdate。
  • 支持 pod 原地升级
  • 支持 pod 容器镜像热更新
  • 支持 partition 灰度发布
  • 支持智能式分步骤灰度发布,可在灰度发布步骤中加入 hook 校验
  • 支持删除或更新 pod 前的 hook 校验,以实现优雅的 pod 退出
  • 支持原地重启前的镜像预拉取,以加快原地重启的速度
apiVersion: tkex.tencent.com/v1alpha1
kind: GameDeployment
metadata:
  name: test-gamedeployment
  labels:
    app: test-gamedeployment
spec:
  replicas: 5
  selector:
    matchLabels:
      app: test-gamedeployment
  template:
    metadata:
      labels:
        app: test-gamedeployment
    spec:
      containers:
      - name: python
        image: python:3.5
        imagePullPolicy: IfNotPresent
        command: ["python"]
        args: ["-m", "http.server", "8000" ]
        ports:
        - name: http
          containerPort: 8000
  preDeleteUpdateStrategy:
    hook:
      templateName: test
  updateStrategy:
    type: InplaceUpdate
    partition: 1
    maxUnavailable: 2
    canary:
      steps:
        - partition: 3
        - pause: {}
        - partition: 1
        - pause: {duration: 60}
        - hook:
            templateName: test
        - pause: {}
    inPlaceUpdateStrategy:
      gracePeriodSeconds: 30

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值