Skip to content

Commit

Permalink
docs of kruise-game v0.5.0 (#118)
Browse files Browse the repository at this point in the history
Signed-off-by: ChrisLiu <[email protected]>
  • Loading branch information
chrisliu1995 authored Aug 11, 2023
1 parent 24e17af commit 9a6e203
Show file tree
Hide file tree
Showing 25 changed files with 2,581 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ $ helm install kruise openkruise/kruise --version 1.4.0
### 安装Kruise-Game

```shell
$ helm install kruise-game openkruise/kruise-game --version 0.4.1
$ helm install kruise-game openkruise/kruise-game --version 0.5.0
```

### 升级 Kruise-Game

```shell
$ helm upgrade kruise-game openkruise/kruise-game --version 0.4.1 [--force]
$ helm upgrade kruise-game openkruise/kruise-game --version 0.5.0 [--force]
```

### 可选项
Expand All @@ -47,7 +47,7 @@ $ helm upgrade kruise-game openkruise/kruise-game --version 0.4.1 [--force]
| `kruiseGame.webhook.targetPort` | 用于 MutatingWebhookConfigurations 中工作负载的 ObjectSelector | `9876` |
| `replicaCount` | kruise-game 的期望副本数 | `1` |
| `image.repository` | kruise-game 的镜像仓库 | `openkruise/kruise-game-manager` |
| `image.tag` | kruise-game 的镜像版本 | `v0.4.1` |
| `image.tag` | kruise-game 的镜像版本 | `v0.5.0` |
| `image.pullPolicy` | kruise-game 的镜像拉取策略 | `Always` |
| `serviceAccount.annotations` | kruise-game的serviceAccount注解 | ` ` |
| `resources.limits.cpu` | kruise-game容器的CPU资源限制 | `500m` |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ type GameServerSetSpec struct {
// 游戏服模版,新生成的游戏服将以模版定义的参数创建
GameServerTemplate GameServerTemplate `json:"gameServerTemplate,omitempty"`
// serviceName 是管理此 GameServerSet 的服务的名称。
// 该服务必须在GameServerSet之前存在,并负责该集合的网络标识。
// Pod 获取遵循以下模式的 DNS/主机名:pod-specific-string.serviceName.default.svc.cluster.local
// 其中“pod-specific-string”由 GameServerSet 控制器管理。
ServiceName string `json:"serviceName,omitempty"`
// 保留的游戏服序号,可选项。若指定了该序号,已经存在的游戏服将被删除;而未存在的游戏服,新建时将跳过、不创建该序号
ReserveGameServerIds []int `json:"reserveGameServerIds,omitempty"`
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 游戏匹配

会话类游戏通常需要`匹配服务`让玩家找到合适的队友及对手组成对局,并为该对局分配合适的游戏服。组成对局的玩家拿到游戏服地址后方可进入游戏。

OKG支持云原生游戏匹配框架[Open Match](https://github.com/googleforgames/open-match)
并基于Open Match构建了[kruise-game-open-match-director](https://github.com/CloudNativeGame/kruise-game-open-match-director)组件,
为形成对局的玩家分配游戏服地址。

## 使用说明

- Kubernetes集群中需要安装 `OpenKruiseGame``Open Match` 以及 `kruise-game-open-match-director`
- 被GameServerSet管理且待匹配的游戏服需要配置Network字段,使游戏服具备直连网络。详细可参考[网络功能文档](./network.md)
- kruise-game-open-match-director 将选择网络可用且OpsState为None的游戏服,获取对应网络连接信息,分配予Match中的Tickets。
- kruise-game-open-match-director 将已分配的GameServer对应的OpsState字段标记为Allocated,此时该GameServer不会再被分配,且水平缩容时优先级较低,避免被轻易删除。游戏服具体缩容顺序可参考[游戏服伸缩文档](./gameservers-scale.md#openkruisegame的水平伸缩特性)
- kruise-game-open-match-director 更多功能请参考[GitHub](https://github.com/CloudNativeGame/kruise-game-open-match-director)
- 关于OKG + Open Match更多示例请参考[GitHub](https://github.com/CloudNativeGame/kruise-game-open-match-example)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

OKG提供游戏服状态设置的能力,您可以手动/自动(服务质量功能)地设置游戏服的运维状态或删除优先级。当缩容时,GameServerSet负载会根据游戏服的状态进行缩容选择,缩容规则如下:

1)根据游戏服的opsState缩容。按顺序依次缩容opsState为`WaitToBeDeleted``None``Maintaining`的游戏服
1)根据游戏服的opsState缩容。按顺序依次缩容opsState为`WaitToBeDeleted``None``Allocated``Maintaining`的游戏服

2)当opsState相同时,按照DeletionPriority(删除优先级)缩容,优先删除DeletionPriority大的游戏服

Expand Down Expand Up @@ -201,6 +201,40 @@ minecraft-6 Deleting None 0 0 9m55s

**在缩容时,OKG将优先考虑被Reserve的游戏服,再按照上文提到的缩容顺序进行缩容**

### 游戏服 Kill

OKG 提供 Kill 模式指定游戏服删除。用户只需将希望删除的游戏服的OpsState标记为`Kill`即可。
`游戏服 ID Reserve`不同的是,该模式下不需要用户手动调整replicas,OKG将根据OpsState为Kill的GameServer的数量自动缩减对应的副本数;此外,被删除的游戏服ID也不会出现在`ReserveGameServerIds`字段中(默认scaleDownStrategyType为General的情况下),这意味着对应序号的游戏服在扩容时可能会被重新生成。

示例如下:
```bash
# 初始存在3个游戏服
kubectl get gs
NAME STATE OPSSTATE DP UP AGE
minecraft-0 Ready None 0 0 70s
minecraft-1 Ready None 0 0 70s
minecraft-2 Ready None 0 0 70s

# 若希望删除1号游戏服,只需将其OpsState标记为`Kill`
kubectl edit gs minecraft-1
...
spec:
opsState: Kill
...

# minecraft-1 被删除, 同时gss的副本数变为2
kubectl get gs
NAME STATE OPSSTATE DP UP AGE
minecraft-0 Ready None 0 0 78s
minecraft-1 Deleting Kill 0 0 78s
minecraft-2 Ready None 0 0 78s

kubectl get gs
NAME STATE OPSSTATE DP UP AGE
minecraft-0 Ready None 0 0 82s
minecraft-2 Ready None 0 0 82s
```

### 缩容策略

OKG 提供两种缩容策略:1)General;2)ReserveIds。您可在`GameServerSet.Spec.ScaleStrategy.ScaleDownStrategyType`设置对应策略
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ OKG 会集成不同云提供商的不同网络插件,用户可通过GameServer
- Kubernetes-Ingress
- AlibabaCloud-NATGW
- AlibabaCloud-SLB
- AlibabaCloud-EIP
- AlibabaCloud-SLB-SharedPort

---
Expand Down Expand Up @@ -436,6 +437,148 @@ max_port = 700
min_port = 500
```
---
### AlibabaCloud-EIP
#### 插件名称
`AlibabaCloud-EIP`
#### Cloud Provider
AlibabaCloud
#### 插件说明
- 为每个GameServer单独分配EIP
- 暴露的公网访问端口与容器中监听的端口一致,通过安全组管理
- 需要在ACK集群安装最新版本ack-extend-network-controller组件,详情请见[组件说明页](https://cs.console.aliyun.com/#/next/app-catalog/ack/incubator/ack-extend-network-controller)
#### 网络参数
ReleaseStrategy
- 含义:EIP回收策略。
- 填写格式:
- Follow:默认值,跟随游戏服生命周期。当游戏服被删除时,EIP也将被回收。
- Never:不删除podEIP。当不需要时需要手动删除这个podEIP。(通过kubectl delete podeip {游戏服name} -n {游戏服所在namespace})
- 可直接配置过期时间,例如:5m30s,表示Pod删除5.5分钟后删除podEIP。支持Go类型时间表达式。
- 是否支持变更:否
PoolId
- 含义:EIP地址池ID。可为空,则不使用EIP地址池。
- 是否支持变更:否
ResourceGroupId
- 含义:EIP资源组ID。可为空,则使用默认资源组。
- 是否支持变更:否
Bandwidth
- 含义:峰值带宽。单位:Mbps。可为空,默认为5
- 是否支持变更:否
BandwidthPackageId
- 含义:要绑定已有的共享带宽包ID。可为空,则EIP不绑定共享带宽包。
- 是否支持变更:否
ChargeType
- 含义:EIP的计费方式。
- 填写格式:
- PayByTraffic:按使用流量计费。
- PayByBandwidth:按带宽计费,为默认值。
- 是否支持变更:否
Description
- 含义:对EIP资源的描述。
- 是否支持变更:否
#### 插件配置
#### 示例说明
```yaml
apiVersion: game.kruise.io/v1alpha1
kind: GameServerSet
metadata:
name: eip-nginx
namespace: default
spec:
replicas: 1
updateStrategy:
rollingUpdate:
podUpdatePolicy: InPlaceIfPossible
network:
networkType: AlibabaCloud-EIP
networkConf:
- name: ReleaseStrategy
value: Never
- name: Bandwidth
value: "3"
- name: ChargeType
value: PayByTraffic
gameServerTemplate:
spec:
containers:
- image: nginx
name: nginx
```

生成的gameserver eip-nginx-0 networkStatus字段如下所示:

```yaml
networkStatus:
createTime: "2023-07-17T10:10:18Z"
currentNetworkState: Ready
desiredNetworkState: Ready
externalAddresses:
- ip: 47.98.xxx.xxx
internalAddresses:
- ip: 192.168.1.51
lastTransitionTime: "2023-07-17T10:10:18Z"
networkType: AlibabaCloud-EIP
```
生成对应的podeip eip-nginx-0 如下所示:
```yaml
apiVersion: alibabacloud.com/v1beta1
kind: PodEIP
metadata:
annotations:
k8s.aliyun.com/eip-controller: ack-extend-network-controller
creationTimestamp: "2023-07-17T09:58:12Z"
finalizers:
- podeip-controller.alibabacloud.com/finalizer
generation: 1
name: eip-nginx-1
namespace: default
resourceVersion: "41443319"
uid: 105a9575-998e-4e17-ab91-8f2597eeb55f
spec:
allocationID: eip-xxx
allocationType:
releaseStrategy: Never
type: Auto
status:
eipAddress: 47.98.xxx.xxx
internetChargeType: PayByTraffic
isp: BGP
networkInterfaceID: eni-xxx
podLastSeen: "2023-07-17T10:36:02Z"
privateIPAddress: 192.168.1.51
resourceGroupID: rg-xxx
status: InUse
```
此外,生成的EIP资源在阿里云控制台中会以{pod namespace}/{pod name}命名,与每一个游戏服一一对应。
---
#### 插件名称
### AlibabaCloud-SLB-SharedPort
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# 设计理念
## 开源OpenKruiseGame(OKG)的初衷

>我是从2015年开始做云原生产品的,从最开始的Swarm到后来的Kubernetes,在容器集群之上运行的负载类型从早期的网站、API服务到后来的转码、AI训练再到元宇宙、Web3、图形化应用。我们见证了云原生技术在改变一个又一个行业。但是,游戏是一个非常特殊的行业,一个大型的游戏,包含网关、平台服、游戏服、匹配服等不同种角色。很多游戏公司早已将平台服、网关等业务进行了云原生化改造,但是,游戏服的容器化进展都比较缓慢。通过和大量的游戏开发者/运维人员进行交流,大致可以归纳为如下三个重要的原因。
>
>1. 运行中的游戏服更换部署架构的风险收益比过高。
>2. 游戏服云原生化过程中存在缺失的核心功能,例如:游戏热更新,定向合服/停服等。
>3. 缺少游戏服云原生化的最佳实践与成功案例。
>
>为了解决上述问题,我们联合了灵犀互娱等多家游戏公司,将游戏服云原生化场景下的通用能力进行了抽象,开源了OpenKruiseGame项目。希望能够通过一个云厂商无关的开源项目,将游戏服的云原生化最佳实践交付给更多的游戏开发者。同时,我们也希望越来越多的游戏公司/工作室/开发者可以参与到社区,将遇到的难题、场景和大家一起讨论,分享游戏服云原生化的经验。
<p align="right">来自 刘中巍,阿里云容器服务,OpenKruiseGame项目发起人</p>

>灵犀互娱已全面拥抱云原生架构,在云原生化过程中我们清楚地认识到,游戏服不同于其他Web类型应用,在k8s集群之中对其的管理是非常复杂的。原生k8s workload 提供的管理功能很难满足游戏服日常运维需求,Deployment 无法固定ID不适配有状态的特性、而StatefulSet又缺乏定向管理的灵活性,为此我们自研了Paas平台,提供对游戏服的编排管理的能力,以实现高效开服/更新等游戏服运维操作。
<p align="right"> 来自 冯谋杰 阿里灵犀互娱容器云负责人</p>

>作为一个大型的游戏分发平台,B站有着海量且异构架构的内外部游戏项目需要管理维护,在当前降本增效的大环境下,游戏项目从传统虚拟机迁移至k8s势在必行。但是原生的k8s面对游戏热更、多环境管理、滚服游戏的区服抽象、业务接流等场景是比较疲软的。需要一个成本低廉、高效的跨云解决方案为上述问题提供支持,基于OpenKruise衍生的OpenKruiseGame所提供的固定id、原地升级等功能对游戏场景有着很大的吸引力,给游戏的容器化增加了一种选择。
<p align="right"> 来自 李宁 bilibili游戏运维负责人</p>


>在尝试对游戏服进行云原生化改造的过程中,网络是首要考虑的问题。由于游戏服从虚拟机迁移至容器,基于机器IP的运维方式在k8s中难以保障,衍生出固定IP的需求;对外服务的方式也不像直接在虚拟机暴露端口那么简单,增加了许多复杂性。除了网络问题之外,一个游戏服的各个进程在pod中的状态难以感知,原生k8s重建的策略太过“粗暴”,不利于游戏稳定运行,亟需一种针对性的感知策略,针对不同的探测结果执行不同的动作。
<p align="right"> 来自 盛浩 冠赢互娱游戏云平台负责人</p>

## 为什么OpenKruiseGame(OKG)是一个工作负载

<img src={require('/static/img/kruisegame/workload.png').default} width="90%" />

游戏服云原生化核心要解决两个问题,游戏服的生命周期管理与游戏服的运维管理。Kubernetes内置了一些通用的工作负载模型,例如:无状态(Deployment)、有状态(StatefulSet)、任务(Job)等。但是,游戏服的状态管理不论从粒度还是确定性上面都有更高的要求。例如:游戏服需要热更新的机制来确保更短的游戏中断;游戏服需要原地更新确保元数据信息(网络为主)不变;游戏服需要确保在自动伸缩过程中只有0玩家的游戏服可以下线;需要具备手动运维/诊断/隔离任意一个游戏服的能力等。这些都是Kubernetes内置负载不能够解决的问题。

此外,Kubernetes中的工作负载还承担了与基础设施无缝整合的重要枢纽角色。例如:通过Annotations中的字段,自动实现监控系统、日志系统与应用的对接;通过nodeSelector字段,实现应用与底层资源的调度绑定关系;通过labels中的字段,记录分组等元数据信息,替代传统的CMDB系统。这些都让自定义工作负载成为了Kubernetes中适配不同类型应用的最佳方式,OpenKruiseGame(OKG)是一个完全面向游戏场景的Kubernetes工作负载,通过OpenKruiseGame(OKG),开发者不止可以获得更好的游戏服的生命周期管理和游戏服的运维管理,还可以以OpenKruiseGame(OKG)为纽带,无需开发额外的代码,充分发挥云产品带来的强大能力。

## OpenKruiseGame(OKG)的设计理念

OpenKruiseGame(OKG)只包含两个CRD对象:GameServerSet与GameServer。OpenKruiseGame(OKG)的设计理念是基于状态控制的,将不同的职责划分在不同的工作负载维度来控制。

* GameServerSet(生命周期管理)
对一组GameServer的生命周期管理的抽象,主要用于副本数目管理、游戏服发布等生命周期控制。

* GameServer(定向管理运维动作)
对一个GameServer的运维/管理动作的抽象,主要用于更新顺序控制、游戏服状态控制、游戏服网络变更等定向运维管理动作。

当我们理解了OpenKruiseGame(OKG)的设计理念后,一些非常有趣的推论就可以快速的得出,例如:

* 当不小心删除GameServer的时候会触发游戏服的删除吗?

不会,GameServer只是游戏服的差异性运维动作的状态记录,如果删除GameServer之后,会重新创建一个使用默认配置的GameServer对象。此时,你的GameServer也会重置为默认定义在GameServerSet中的游戏服模板配置。

* 如何让匹配服务与自动伸缩更好的配合防止出现玩家被强制下线?

可以通过服务质量能力,将游戏的玩家任务转换为GameServer的状态,匹配框架感知GameServer的状态并控制伸缩的副本数目,GameServerSet也会根据GameServer的状态来判断删除的顺序,从而实现优雅下线。

## OpenKruiseGame(OKG)的部署架构

<img src={require('/static/img/kruisegame/arch.png').default} width="90%" />

OpenKruiseGame(OKG)的部署模型分为三个部分:

1. OpenKruiseGame(OKG)控制器
负责管理GameServerSet与GameServer的生命周期管理,在OpenKruiseGame控制器中,内置一个Cloud Provider模块,用来适配不同云服务厂商在网络插件等场景下的差异,让OpenKruiseGame可以真正做到一套代码无差异部署。

2. OpenKruise控制器
负责管理Pod的生命周期管理,是OpenKruiseGame(OKG)的依赖组件,对OpenKruiseGame(OKG)使用者/开发者是无感的。

3. OpenKruiseGame(OKG)运维后台【待完成】
针对希望白屏化使用OpenKruiseGame(OKG)的开发者提供的运维后台与API,主要提供游戏服的生命周期管理和编排能力。
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 项目贡献
欢迎来到 OpenKruiseGame 社区。随时提供帮助、报告问题、提高文档质量、修复错误或引入新功能。有关如何向 OpenKruiseGame 提交内容的详细信息,请参见下文。

## 提交问题并参与基于场景的讨论
OpenKruiseGame 是一个非常开放的社区,随时提交各种类型的问题,以下列表显示了问题类型:
* 错误报告
* 功能要求
* 性能问题
* 功能提案
* 特征设计
* 征求帮助
* 文档不完整
* 测试改进
* 关于项目的任何问题


当您提交问题时,请确保您已经进行了数据屏蔽,以确保您的信息的机密性,例如 AccessKey。
## 贡献代码和文档
能够为 OpenKruiseGame 提供帮助的行动值得鼓励,您可以提交您希望在拉取请求中修复的内容。
*如果您发现拼写错误,请更正它。
* 如果您发现代码错误,请修复它。
* 如果您发现缺少的单元测试,请解决问题。
* 如果您发现文档不完整或有错误,请更新它。

## 需要额外帮助
如果您在游戏服务器云原生改造过程中遇到其他类型的问题需要帮助,请发邮件给我们寻求进一步的帮助,邮箱:zhongwei.[email protected]

## 成为 OpenKruiseGame 的核心贡献者
也非常欢迎大家参与OpenKruiseGame会议,共同决定OpenKruiseGame的未来发展方向.作为OpenKruise的一个子项目,OpenKruiseGame在我们双周会上讨论OpenKruise的时候也会讨论。有关详细信息,请参阅 <a target="_blank" href="https://github.com/openkruise/kruise#community">时间表</a>.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# FAQ

## 如何调试你的代码


0) 编辑Makefile,将IMG字段的值修改为Makefile的仓库地址。

1) 编译打包kruise-game-manager镜像。

```bash
make docker-build
```

2) 将打包后的镜像上传到镜像仓库。

```bash
make docker-push
```

3) 在 Kubernetes 集群 (~/.kube/conf) 中部署 kruise-game-manager 组件。

```bash
make deploy
```

Loading

0 comments on commit 9a6e203

Please sign in to comment.