kruise-game/docs/中文/用户手册/自定义服务质量.md

4.4 KiB
Raw Blame History

功能概述

由于游戏是有状态服务,很多时候游戏服是以一种 "富容器" 的形态存在于Pod之中多个进程在Pod中统一管理。 然而,每个进程重要性却有所不同,对于"轻量级进程"错误的情况用户并不希望将整个pod删除重建像k8s原生的liveness probe并不能很好地满足这种需求过于僵化的模式与游戏场景并不适配。 OKG 认为游戏服的服务质量水平应该交由游戏开发者定义,开发者可以根据不同游戏服状态去设置对应的处理动作。自定义服务质量功能是探测+动作的组合,通过这种方式帮助用户自动化地处理各类游戏服状态问题。

使用示例

游戏服空闲设置即将下线

部署一个带有自定义服务质量的GameServerSet

cat <<EOF | kubectl apply -f -
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: minecraft
  namespace: default
spec:
  replicas: 3
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:idle
          name: minecraft
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
      maxUnavailable: 100%
  serviceQualities: # 设置了一个idle的服务质量
    - name: idle
      containerName: minecraft
      permanent: false
      #与原生probe类似本例使用执行脚本的方式探测游戏服是否空闲不存在玩家
      exec:
        command: ["bash", "./idle.sh"]
      serviceQualityAction:
          #不存在玩家标记该游戏服运维状态为WaitToBeDeleted
        - state: true
          opsState: WaitToBeDeleted
          #存在玩家标记该游戏服运维状态为None
        - state: false
          opsState: None
EOF

部署完成后,由于还未导入玩家,故所有游戏服都为空闲状态,可以任意被删除:

kubectl get gs
NAME          STATE   OPSSTATE          DP    UP
minecraft-0   Ready   WaitToBeDeleted   0     0
minecraft-1   Ready   WaitToBeDeleted   0     0
minecraft-2   Ready   WaitToBeDeleted   0     0

当有玩家进入游戏服minecraft-1则游戏服的运维状态发生变化

kubectl get gs
NAME          STATE   OPSSTATE          DP    UP
minecraft-0   Ready   WaitToBeDeleted   0     0
minecraft-1   Ready   None              0     0
minecraft-2   Ready   WaitToBeDeleted   0     0

此时若发生缩容游戏服minecraft-1将得到保护避免优先删除。

游戏服状态异常设置维护中

部署一个带有自定义服务质量的GameServerSet

cat <<EOF | kubectl apply -f -
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
  name: demo-gs
  namespace: default
spec:
  replicas: 3
  gameServerTemplate:
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:healthy
          name: minecraft
  updateStrategy:
    rollingUpdate:
      podUpdatePolicy: InPlaceIfPossible
      maxUnavailable: 100%
  serviceQualities: # 设置了一个idle的服务质量
    - name: idle
      containerName: minecraft
      permanent: false
      #与原生probe类似本例使用执行脚本的方式探测游戏服是否健康
      exec:
        command: ["bash", "./healthy.sh"]
      serviceQualityAction:
          #探测健康标记该游戏服运维状态为None
        - state: true
          opsState: None
          #探测不健康标记该游戏服运维状态为Maintaining
        - state: false
          opsState: Maintaining
EOF

部署完成后由于一切正常故所有游戏服都为None

kubectl get gs
NAME        STATE   OPSSTATE   DP    UP
demo-gs-0   Ready   None       0     0
demo-gs-1   Ready   None       0     0
demo-gs-2   Ready   None       0     0

模拟demo-gs-0某进程宕机游戏服变为Maintaining状态

kubectl get gs
NAME        STATE   OPSSTATE     DP    UP
demo-gs-0   Ready   Maintaining  0     0
demo-gs-1   Ready   None         0     0
demo-gs-2   Ready   None         0     0

此时gameserver controller会发出 GameServer demo-gs-0 Warning 的 event配合kube-event项目可实现异常通知:

此外OKG 未来会集成游戏服自动排障/恢复工具,进一步丰富游戏服的自动化运维能力。