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 不是很方便,如果有权重会比较简单。

相关文章
|
13天前
|
人工智能 运维 安全
聚焦 AI 应用基础设施,云栖大会 Serverless AI 全回顾
2025 年 9 月 26 日,为期三天的云栖大会在杭州云栖小镇圆满闭幕。随着大模型技术的飞速发展,我们正从云原生时代迈向一个全新的 AI 原生应用时代。为了解决企业在 AI 应用落地中面临的高成本、高复杂度和高风险等核心挑战,阿里云基于函数计算 FC 发布一系列重磅服务。本文将对云栖大会期间 Serverless+AI 基础设施相关内容进行全面总结。
|
10月前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。
|
弹性计算 人工智能 云栖大会
云栖大会 | 弹性计算一手资料来啦!(持续更新中)
在这一年一度汇聚了全球数万开发者的云栖大会上有什么精彩的瞬间呢?让我们一起回顾阿里云弹性计算的专家们带来的激奋人心的技术演讲。
98876 12
|
存储 Kubernetes 网络协议
在K8S中,Deployment和Statefulset有何区别?
在K8S中,Deployment和Statefulset有何区别?
|
运维 Kubernetes Cloud Native
冠赢互娱基于 OpenKrusieGame 实现游戏云原生架构升级
冠赢互娱基于 OpenKrusieGame 实现游戏云原生架构升级
|
Web App开发 网络协议 安全
一次HTTPS访问慢的案例分析
本案例主要做一次HTTPS访问慢的案例分析,讲述了排查过程和优化方案。
4342 0
一次HTTPS访问慢的案例分析
|
负载均衡 监控 Cloud Native
Service Mesh 的实现原理
【2月更文挑战第20天】
|
存储 C# 索引
C# | 比较IEnumerable、List、数组
IEnumerable`定义了一组用于枚举集合的方法,包括`GetEnumerator`方法,该方法返回一个实现了`IEnumerator`接口的对象,用于枚举集合中的每个元素。`List`和数组都可以使用`foreach`循环来遍历其中的元素,这是因为它们都实现了`IEnumerable`接口。 由于数组在内存中开辟了一段连续的空间,因此可以直接通过索引访问元素,访问速度很快。而 List 则需要通过指针或引用来访问元素,速度相对较慢。 由于数组的大小是固定的,当需要添加或删除元素时,需要重新创建一个新数组,将原数组中的元素复制到新数组中,并添加或删除元素。
449 0
C# | 比较IEnumerable、List、数组
|
SQL 数据库 HIVE
python链接hive数据库实现增删改查操作
python链接hive数据库实现增删改查操作
549 0