OpenKruiseGame 的设计理念详解| 学习笔记(二)

简介: 快速学习 OpenKruiseGame 的设计理念详解

开发者学堂课程【云原生游戏最佳实践系列: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.

image.png

会声明一个 gameserver 状态,有匹配框架。

image.png

image.png

通过匹配框架去感知 gameserver 的状态,去做一些事情,对 gameserverset 做了一个扩容的操作,从三个副本扩容到了五个副本,可以看到 gameserver 3,gameserver 4 生成,同样games erver train 也会生成两个对等的定向操作的适配和接口层。Pod 上面一些详细的信息,四个生成好的的 gameserver pod 分别有自己对应的IP,每一个 pod 相应的一些特性都是继承 gameserverset。

image.png

image.png

接下来做特别的动作看一下原地更新或者原地升级是什么样的效果,比如直接去修改 gameserverset 里边的一个镜像字段,然后直接去做热重启,可以看到在 age 字段,point 时间是没有变化的,但是真实的进入到 gameserver yaml 里面去看启动时间。

image.png

Not ready 没有更新好

image.png

Namestatas 变成 ready

image.png

所有的 pod 都已经更新完毕,age 上的逻辑和之前的时间是一致的,但是 restart 的功能每一个都重启一次,Restart 是特定的重启,但是 pod 没有重建。针对于 gameserver replicas 去做一个缩容,缩容比较特殊是通过定向缩容的方式来模拟 PVE 服的下限,比如想去下限编号是二的,DB 已经完了二下线,可以看到在 gameserverset 设了一个 ID,ID 编号是 2。

image.png

image.png

如果把 gameserver 的副本数从五个副本调整到四个副本,按照社区 gameset 的处理,默认可以做三次,场景之下实际上缩的是 gameserver2,因为在 pve 配置文件是通过特定的编号和底层的存储的路径去做适配,当去做 gameserver 2缩容的时候,如果再去做扩容希望扩出来不应该是 gameserver2,配置是 gameserver2的配置,希望扩容出来的应该是 gameserver5,把game server的状态去做一个变更,设置 gameserver 的状态为 waittodeleted,设置对特定的 pod 做一些定向删除或者等待删除。

image.png

玩家想下线的时候希望把服设置成接下俩一段时间想删除,设置成 openstate waittodeleted

image.png

接下来如果 tvp 服处在 server 状态会优先删除  waittodeletedgameserver

image.png

把 replices 从四个副本缩容到三个副本,设置为 waittodeleted 是编号为1的nameserver,可以看到从四个副本缩到三个副本的时候优先被删除的是 gameserver1,打造了一个定向延后删除的功能

image.png

image.png

把 replices 从三个副本缩容到两个副本,缩容的是4,无序缩容随机选的编号比较高的

image.png

删除权重也是控制扩缩容顺序的方式

image.png

这种场景一般适合大规模批量的扩缩容时候,默认情况下选的是gameserverset 4,但是如果有一个权重,也可以直接去根据权重来去做删除,因为有的时候删除的时候可能会批量删除的工作,如果直接去设置 waittodeleted 不是很方便,如果有权重会比较简单。

相关文章
|
7月前
|
设计模式 前端开发 iOS开发
设计模之项目实战
设计模之项目实战
30 2
|
1天前
|
缓存 前端开发 JavaScript
第三章(概念篇) 微前端架构模式
第三章(概念篇) 微前端架构模式
|
12月前
架构:第九章:架构设计(为什么要这么设计,解决了什么问题)
架构:第九章:架构设计(为什么要这么设计,解决了什么问题)
109 0
【系统架构】架构设计扫盲
【系统架构】架构设计扫盲
57 0
|
存储 缓存 NoSQL
分布式服务基础知识
分布式服务基础知识
81 0
|
Java 应用服务中间件
架构:第六章:系统架构
架构:第六章:系统架构
120 0
架构:第六章:系统架构
|
设计模式 弹性计算 运维
|
弹性计算 运维 Kubernetes
OpenKruiseGame 的设计理念详解| 学习笔记
快速学习 OpenKruiseGame 的设计理念详解
644 0
OpenKruiseGame 的设计理念详解| 学习笔记
|
存储 NoSQL Java
设计的改进|学习笔记
快速学习设计的改进
72 0
|
存储 Kubernetes API
K8S 架构 | 学习笔记
快速学习 K8S 架构
141 0
K8S 架构 | 学习笔记