使用Kubernetes扩容Pod

解读

在国内游戏公司,Unity 客户端本身并不直接操作 Kubernetes,但中大型项目普遍把战斗服、逻辑服、匹配服、资源服、网关服等后端微服务容器化,并托管在阿里云 ACK、腾讯云 TKE、华为云 CCE 等托管 Kubernetes 集群上。
面试官问“如何扩容 Pod”,表面看是运维题,实则考察候选人是否具备全链路思维:当 Unity 端出现“匹配超时”“副本进不去”等业务异常时,你能否快速定位是客户端热点、网络延迟还是后端容量不足,并给出可落地的扩容方案
因此,回答要围绕**“我能推动运维/后端一起把容量打上去,而不是只会喊加机器”**这一核心立场展开。

知识点

  1. 水平扩容(HPA)
    基于 CPU、内存或自定义 QPS、房间数、消息延迟等指标自动扩缩;游戏行业常用** Prometheus + 阿里云 Prometheus 监控 + 自定义 Adapter** 把“当前房间数”暴露为外部指标。
  2. 垂直扩容(VPA)
    调整 Request/Limit,适用于单 Pod 负载高但并发量低的场景,例如战斗服单核吃满但开房间不多。
  3. 节点池扩容(Cluster-Autoscaler)
    当 Pod 因资源不足 Pending,自动弹出弹性节点(按量/竞价实例);国内云厂商支持伸缩组+实例规格模板,注意竞价实例被回收时要配合优雅下线+战斗数据落盘
  4. 灰度扩容 & 热更新
    游戏服必须按房间/按逻辑分区灰度,避免新 Pod 直接接全量流量;常用LabelSelector=zone: canary 先扩容 10% 流量观察。
  5. Unity 侧可观测性
    在客户端埋点**“匹配耗时”“副本进入失败码”,通过阿里云 SLS/腾讯 CLS** 实时回传,与 HPA 指标联动,实现**“玩家体感触发扩容”**。

答案

当监控发现“副本创建成功率低于 95%”且Pending Pod 数 > 0 时,我会按以下步骤扩容:

  1. 确认瓶颈kubectl describe pod 查看 Event,若提示 Insufficient cpu/memory,则走节点池扩容;若 Pod 已 Running 但处理不过来,则走HPA 扩容
  2. 一键水平扩容
    # 临时手动扩容,先救急
    kubectl scale deployment battle-server --replicas=$(kubectl get deployment battle-server -o jsonpath='{.status.replicas}' | awk '{print $1+50}')
    
  3. 固化 HPA 规则
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: battle-server-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: battle-server
      minReplicas: 80
      maxReplicas: 800
      metrics:
      - type: Pods
        pods:
          metric:
            name: "active_room_count"  # 自定义指标:当前活跃房间数
          target:
            type: AverageValue
            averageValue: "30"  # 每个 Pod 承载 30 房间
    
  4. 节点池兜底:在阿里云 ACK 控制台开启cluster-autoscaler,配置伸缩组(实例规格 c6/ g7+ 本地 SSD,竞价实例比例不超过 30%),保证 2 min 内弹出节点。
  5. Unity 观测闭环:客户端上报**“进入副本失败_错误码 10086”到 CLS,触发云函数调用阿里云EventBridge**,自动执行上述 scale 命令,实现**“玩家无感扩容”**。
  6. 缩容保护:战斗服 Pod 需实现优雅下线接口(PreStop Hook 通知网关不再分发新房间,等待 90 s 后退出),避免玩家掉线

通过上述流程,3 分钟内可把副本创建成功率拉回 99%,且成本仅上涨 15%(竞价实例+自动缩容)

拓展思考

  1. 单局长时间游戏(如 30 min 一局的 MOBA)如何缩容?
    可引入**“热缩”概念:给 Pod 打不可调度标签**(kubectl cordon),等待自然空房后缩容,缩容时间=最长单局时长+2 min 缓冲
  2. 跨地域同服场景,如何做到按地域就近扩容
    利用阿里云 ACK One 多集群联邦,把**“玩家地域”作为自定义指标,北京/上海/广州 三个联邦 HPA 各自扩容,Unity 客户端通过DNS 权重TGW 就近接入**。
  3. Unity 本地开发机也能一键“扩容”吗?
    使用Kind + K9s 在本地搭建轻量集群,把战斗服镜像跑起来,通过Telepresence 把本地 Pod 与云端互通,本地代码热重载即可模拟扩容效果,CI 阶段提前发现资源泄漏