开发者学堂课程【云原生游戏最佳实践系列:OpenKruiseGame 的设计理念详解】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1195/detail/18166
OpenKruiseGame 的设计理念详解
四、OpenKruiseGame demo 演示
liuqiuyang@B-Y3H6136Y-2321kruise-game %catexamples/gameserverset.yaml
apiVersion: game.kruise.io/v1alpha1
kind:GameServerSet metadata:
name: gameserverset
namespace: default
spec:
replicas:3
updateStrategy:
rollingUpdate:
podUpdatePolicy:InPlaceIfPossible
maxUnavailable:2
type:RollingUpdate
gameServerTemplate:
template:
spec:
containers:
-image:nginx:alpine
name:minecraftx
liuqiuyang@B-Y3H6136Y-2321 kruise-game %kubectl apply -fexamples/gameserverset.yaml gameserverset.game.kruise.io/gameserverset created
liuqiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get gameserverset
NAME AGE
Gameserverset 6S
liuqiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get gameserver
NAME AGE
gameserverset-0 13s
gameserverset-1 13s
gameserverset-2 13s
liuqiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get po
NAME READY STATUS RESTARTS AGE
gameserverset-0 0/1 ContainerCreating 19s
gameserverset-1 1/1 Running 0 19s
gameserverset-2 1/1 Running 0 19s
Liuqiuyang@B-Y3H6136Y-2321 kruise-game %
Liugiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get gameserver-0-oyaml
type: Initialized
-lastTransitionTime:"2022-08-17T02:52:07Z"
message: 'containers with unready status:[minecraft] reason:ContainersNotReady
status:"False"
type: Ready
-lastTransitionTime:"2022-08-17T02:52:07Z"
message: 'containers with unready status:[minecraft] reason:ContainersNotReady
status:"False"
type:ContainersReady
-lastTransitionTime:"2022-08-17T02:52:07Z"
status: "True'
type: PodScheduled
-lastTransitionTime:"2022-08-17T02:52:07Z"
status: "True"
type:InPlaceUpdateReady
containerStatuses:
-image:nginx:alpine
imageID:
lastState: {}
name: minecraft
ready: false
restartCount: 0
started: false
state:
waiting:
reason: ContainerCreating
hostIP:192.168.1.72
phase: Pending
gosClass: BestEffort
startTime:"2022-08-17T02:52:07Z"
updatePriority: 0
uqiuyang@B-Y3H6136Y-2321 kruise-game %
currentState: Creating
deletionPriority: 0
desiredState: Ready
lastTransitionTime:"2022-08-17T02:52:07Z"
networkInfo:
networkStatus: {} podStatus:
name:gameserverset-0 podState:
conditions:
-lastTransitionTime:"2022-08-17T02:52:07Z"
status:"True”
type: KruisePodReady
lastTransitionTime:"2022-08-17T02:52:07Z"
status:"True"
type: Initialized
lastTransitionTime:"2022-08-17T02:52:07Z"
message:'containers with unready
status:[minecraft]"
reason:ContainersNotReady
status: "False" type:
Ready
-lastTransitionTime:"2022-08-17T02:52:07Z"
message: 'containers with unready
status: [minecraft]'
reason:ContainersNotReady
status:"False"
type: ContainersReady
lastTransitionTime:"2022-08-17T02:52:07Z' status:"True"
type: PodScheduled
lastTransitionTime:"2022-08-17T02:52:07Z"
status:"True"
type:InPlaceUpdateReady
containerStatuses:
image: nginx:alpine
imageID:
lastState: {}
name: minecraft
ready: false
restartCount: 0
started: false
state:
waiting:
reason: ContainerCreating
hostIP:192.168.1.72
phase:Pending
gosClass: BestEffort
startTime:"2022-08-17T02:52:07Z'
updatePriority: 0
iuqiuyang@B-Y3H6136Y-2321 kruise-game %
liuqiuyang@B-Y3H6136Y-2321 kruise-game %
liuqiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get po
NAME READY STATUS RESTARTS AGE
gameserverset-0 1/1 Running 0 57s
gameserverset-1 1/1 Running 0 57s
gameserverset-2 1/1 Running 0 57s
liuqiuyang@B-Y3H6136Y-2321 kruise-game % kubectl get gameserver gameserverset-0 -oyaml
Gameserverset 的 yaml看一下,通过 agence 页游,一个简单的 gameserver 通过模拟可以下发 pvp 的 server,生成三个pvp server ,一个 gameserverset 生成,还生成三个 gameserver,每一个 gameserver 生成 po,gameserver 和 pod 是一致的,拿 gameserver 0的 yaml,currentState: Creating 同步底下 pod 状态,上面部分会有对应的 gameserver 的一些运维动作,下面这个地方 phase:Pending 可以看到 gameserver 和 pod 之间是如何联动,所有的 pod 都 running.
会声明一个 gameserver 状态,有匹配框架。
通过匹配框架去感知 gameserver 的状态,去做一些事情,对 gameserverset 做了一个扩容的操作,从三个副本扩容到了五个副本,可以看到 gameserver 3,gameserver 4 生成,同样games erver train 也会生成两个对等的定向操作的适配和接口层。Pod 上面一些详细的信息,四个生成好的的 gameserver pod 分别有自己对应的IP,每一个 pod 相应的一些特性都是继承 gameserverset。
接下来做特别的动作看一下原地更新或者原地升级是什么样的效果,比如直接去修改 gameserverset 里边的一个镜像字段,然后直接去做热重启,可以看到在 age 字段,point 时间是没有变化的,但是真实的进入到 gameserver yaml 里面去看启动时间。
Not ready 没有更新好
Namestatas 变成 ready
所有的 pod 都已经更新完毕,age 上的逻辑和之前的时间是一致的,但是 restart 的功能每一个都重启一次,Restart 是特定的重启,但是 pod 没有重建。针对于 gameserver replicas 去做一个缩容,缩容比较特殊是通过定向缩容的方式来模拟 PVE 服的下限,比如想去下限编号是二的,DB 已经完了二下线,可以看到在 gameserverset 设了一个 ID,ID 编号是 2。
如果把 gameserver 的副本数从五个副本调整到四个副本,按照社区 gameset 的处理,默认可以做三次,场景之下实际上缩的是 gameserver2,因为在 pve 配置文件是通过特定的编号和底层的存储的路径去做适配,当去做 gameserver 2缩容的时候,如果再去做扩容希望扩出来不应该是 gameserver2,配置是 gameserver2的配置,希望扩容出来的应该是 gameserver5,把game server的状态去做一个变更,设置 gameserver 的状态为 waittodeleted,设置对特定的 pod 做一些定向删除或者等待删除。
玩家想下线的时候希望把服设置成接下俩一段时间想删除,设置成 openstate waittodeleted
接下来如果 tvp 服处在 server 状态会优先删除 waittodeletedgameserver
把 replices 从四个副本缩容到三个副本,设置为 waittodeleted 是编号为1的nameserver,可以看到从四个副本缩到三个副本的时候优先被删除的是 gameserver1,打造了一个定向延后删除的功能
把 replices 从三个副本缩容到两个副本,缩容的是4,无序缩容随机选的编号比较高的
删除权重也是控制扩缩容顺序的方式
这种场景一般适合大规模批量的扩缩容时候,默认情况下选的是gameserverset 4,但是如果有一个权重,也可以直接去根据权重来去做删除,因为有的时候删除的时候可能会批量删除的工作,如果直接去设置 waittodeleted 不是很方便,如果有权重会比较简单。