parent
ed772a2052
commit
756b72f94d
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
|
|
@ -0,0 +1,38 @@
|
|||
## 安装Kruise
|
||||
|
||||
建议采用 helm v3.5+ 来安装 Kruise
|
||||
|
||||
```shell
|
||||
# Firstly add openkruise charts repository if you haven't do this.
|
||||
$ helm repo add openkruise https://openkruise.github.io/charts/
|
||||
|
||||
# [Optional]
|
||||
$ helm repo update
|
||||
|
||||
# Install the latest version.
|
||||
$ helm install kruise openkruise/kruise --version 1.3.0 --set featureGates="PodProbeMarkerGate=true"
|
||||
```
|
||||
|
||||
## 安装Kruise-Game
|
||||
|
||||
### 编译安装
|
||||
|
||||
0) 编辑Makefile,更改其中{IMG}字段,将其改为自身的仓库地址
|
||||
|
||||
1) 编译并打包kurise-game-manager镜像
|
||||
|
||||
```bash
|
||||
make docker-build
|
||||
```
|
||||
|
||||
2) 将打包完成的镜像上传至镜像仓库
|
||||
|
||||
```bash
|
||||
make docker-push
|
||||
```
|
||||
|
||||
3) 在Kubernetes集群(~/.kube/conf)部署kruise-game-manager组件
|
||||
|
||||
```bash
|
||||
make deploy
|
||||
```
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
## OpenKruiseGame的伸缩特性
|
||||
|
||||
OKG提供游戏服状态设置的能力,您可以手动/自动(服务质量功能)地设置游戏服的运维状态或删除优先级。当缩容时,GameServerSet负载会根据游戏服的状态进行缩容选择,缩容规则如下:
|
||||
|
||||
1)根据游戏服的opsState缩容。按顺序依次缩容opsState为`WaitToBeDeleted`、`None`、`Maintaining`的游戏服
|
||||
|
||||
2)当opsState相同时,按照DeletionPriority(删除优先级)缩容,优先删除DeletionPriority大的游戏服
|
||||
|
||||
3)当opsState与DeletionPriority都相同时,优先删除名称尾部序号较大的游戏服
|
||||
|
||||
### 示例
|
||||
|
||||
部署一个副本为5的游戏服:
|
||||
|
||||
```bash
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
metadata:
|
||||
name: minecraft
|
||||
namespace: default
|
||||
spec:
|
||||
replicas: 5
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
gameServerTemplate:
|
||||
spec:
|
||||
containers:
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/acs/minecraft-demo:1.12.2
|
||||
name: minecraft
|
||||
EOF
|
||||
```
|
||||
|
||||
生成5个GameServer:
|
||||
|
||||
```bash
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-2 Ready None 0 0
|
||||
minecraft-3 Ready None 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
```
|
||||
|
||||
对minecraft-2设置删除优先级为10:
|
||||
|
||||
```bash
|
||||
kubectl edit gs minecraft-2
|
||||
|
||||
...
|
||||
spec:
|
||||
deletionPriority: 10 #初始为0,调大到10
|
||||
opsState: None
|
||||
updatePriority: 0
|
||||
...
|
||||
```
|
||||
|
||||
手动缩容到4个副本:
|
||||
|
||||
```bash
|
||||
kubectl scale gss minecraft --replicas=4
|
||||
gameserverset.game.kruise.io/minecraft scale
|
||||
```
|
||||
|
||||
游戏服的数目最终变为4,可以看到2号游戏服因为删除优先级最大所以被删除:
|
||||
|
||||
```bash
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-2 Deleting None 10 0
|
||||
minecraft-3 Ready None 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
|
||||
# After a while
|
||||
...
|
||||
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-3 Ready None 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
```
|
||||
|
||||
设置minecraft-3的opsState为WaitToBeDeleted:
|
||||
|
||||
```bash
|
||||
kubectl edit gs minecraft-3
|
||||
|
||||
...
|
||||
spec:
|
||||
deletionPriority: 0
|
||||
opsState: WaitToBeDeleted #初始为None, 将其改为WaitToBeDeleted
|
||||
updatePriority: 0
|
||||
...
|
||||
```
|
||||
|
||||
手动缩容到3个副本:
|
||||
|
||||
```bash
|
||||
kubectl scale gss minecraft --replicas=3
|
||||
gameserverset.game.kruise.io/minecraft scaled
|
||||
```
|
||||
|
||||
游戏服的数目最终变为3,可以看到3号游戏服因为处于WaitToBeDeleted状态所以被删除:
|
||||
|
||||
```bash
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-3 Deleting WaitToBeDeleted 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
|
||||
# After a while
|
||||
...
|
||||
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
```
|
||||
|
||||
手动扩容回5个副本:
|
||||
|
||||
```bash
|
||||
kubectl scale gss minecraft --replicas=5
|
||||
gameserverset.game.kruise.io/minecraft scaled
|
||||
```
|
||||
|
||||
游戏服的数目最终变为5,此时扩容出的游戏服序号为2与3:
|
||||
|
||||
```bash
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-2 Ready None 0 0
|
||||
minecraft-3 Ready None 0 0
|
||||
minecraft-4 Ready None 0 0
|
||||
```
|
||||
|
||||
## 配置游戏服的自动伸缩
|
||||
|
||||
GameServerSet支持HPA,您可以通过默认/自定义指标配置
|
||||
|
||||
### HPA示例
|
||||
|
||||
```yaml
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: minecraft-hpa
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
name: minecraft # GameServerSet对应名称
|
||||
minReplicas: 1
|
||||
maxReplicas: 10
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 50 # 示例以cpu利用率50%为计算标准
|
||||
```
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
## 功能概述
|
||||
在游戏场景下,游戏服脚本、场景资源等属于热更文件,时常以sidecar的形式部署在pod中。
|
||||
在更新这些文件时,我们往往希望不影响主程序(游戏服引擎侧)的正常运行。
|
||||
然而,在原生Kubernetes集群,更新pod中任意容器都会导致pod重建,无法满足游戏热更场景。
|
||||
|
||||
OKG 提供的原地升级能力,可以针对性定向更新pod中某一个容器,不影响整个pod的生命周期。
|
||||
如下图所示,蓝色部分为热更部分,橘色部分为非热更部分。我们将Game Script容器从版本V1更新至版本V2后,整个pod不会重建,橘色部分不受到任何影响,Game Engine正常平稳运行
|
||||
|
||||

|
||||
|
||||
## 使用示例
|
||||
|
||||
部署带有sidecar容器的游戏服,使用GameServerSet作为游戏服负载,pod更新策略选择原地升级:
|
||||
|
||||
```bash
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
metadata:
|
||||
name: minecraft
|
||||
namespace: default
|
||||
spec:
|
||||
replicas: 3
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
gameServerTemplate:
|
||||
spec:
|
||||
containers:
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/acs/minecraft-demo:1.12.2
|
||||
name: minecraft
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/sidecar:v0.1
|
||||
name: sidecar
|
||||
EOF
|
||||
```
|
||||
|
||||
生成3个GameServer以及对应的3个Pod:
|
||||
|
||||
```bash
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-2 Ready None 0 0
|
||||
|
||||
kubectl get pod
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
minecraft-0 2/2 Running 0 13s
|
||||
minecraft-1 2/2 Running 0 13s
|
||||
minecraft-2 2/2 Running 0 13s
|
||||
```
|
||||
|
||||
当产生热更需求,我们希望只更新sidecar容器而不影响整个pod的生命周期,此时只需更新GameServerSet对应的容器镜像版本即可:
|
||||
|
||||
```bash
|
||||
kubectl edit gss minecraft
|
||||
...
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/sidecar:v0.2
|
||||
name: sidecar
|
||||
...
|
||||
```
|
||||
|
||||
一段时间过后,发现Pod已经更新完毕,restarts次数变为1,但Age并没有减少。游戏服完成了热更新:
|
||||
|
||||
```bash
|
||||
kubectl get pod
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
minecraft-0 2/2 Running 1 (33s ago) 8m55s
|
||||
minecraft-1 2/2 Running 1 (37s ago) 8m54s
|
||||
minecraft-2 2/2 Running 1 (49s ago) 8m54s
|
||||
```
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
您可以使用GameServerSet进行游戏服的部署,一个简单的部署案例如下:
|
||||
|
||||
```bash
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
metadata:
|
||||
name: minecraft
|
||||
namespace: default
|
||||
spec:
|
||||
replicas: 3
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
gameServerTemplate:
|
||||
spec:
|
||||
containers:
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/acs/minecraft-demo:1.12.2
|
||||
name: minecraft
|
||||
EOF
|
||||
```
|
||||
|
||||
当前GameServerSet创建完成后,由于指定的副本数为3,故在集群中将会出现3个GameServer,以及对应的3个Pod:
|
||||
|
||||
```bash
|
||||
kubectl get gss
|
||||
NAME AGE
|
||||
minecraft 9s
|
||||
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
minecraft-0 Ready None 0 0
|
||||
minecraft-1 Ready None 0 0
|
||||
minecraft-2 Ready None 0 0
|
||||
|
||||
kubectl get pod
|
||||
NAME READY STATUS RESTARTS AGE
|
||||
minecraft-0 1/1 Running 0 10s
|
||||
minecraft-1 1/1 Running 0 10s
|
||||
minecraft-2 1/1 Running 0 10s
|
||||
```
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
## 功能概述
|
||||
|
||||
OKG 提供了原地升级([热更新](../快速开始/游戏服热更新.md))、批量更新、按优先级更新等多种更新策略。
|
||||
|
||||
用户可设置GameServer的更新优先级,配合partition参数,实现在实际生产场景下,把控更新范围、更新顺序、更新节奏。
|
||||
如下图所示,提高序号为1的游戏服优先级,同时设置partition为2,则会优先更新1号游戏服;随后更改partition为0,则会再更新其余游戏服。详情可参考使用示例。
|
||||
|
||||

|
||||
|
||||
## 使用示例
|
||||
|
||||
本示例中将一组游戏服分成两批次更新,模拟灰度更新,逐步验证的场景。
|
||||
|
||||
此时GameServerSet下有3个游戏服副本:
|
||||
```shell
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
gs-demo-0 Ready None 0 0
|
||||
gs-demo-1 Ready None 0 0
|
||||
gs-demo-2 Ready None 0 0
|
||||
```
|
||||
|
||||
设置更新优先级,将3号游戏服优先级调大:
|
||||
```shell
|
||||
kubectl edit gs gs-demo-1
|
||||
|
||||
...
|
||||
spec:
|
||||
deletionPriority: 0
|
||||
opsState: None
|
||||
updatePriority: 10 #初始为0,调大成10
|
||||
...
|
||||
```
|
||||
|
||||
接下来设置 GameServerSet partition、以及即将更新的新镜像:
|
||||
```shell
|
||||
kubectl edit gss gs-demo
|
||||
|
||||
...
|
||||
image: gameserver:latest # 更新镜像
|
||||
name: gameserver
|
||||
...
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
maxUnavailable: 5
|
||||
partition: 2 # 设置保留的游戏服数目,这里只更新一个,所以要保留余下2个
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
...
|
||||
|
||||
```
|
||||
|
||||
此时只有gs-demo-3将会更新:
|
||||
```shell
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
gs-demo-0 Ready None 0 0
|
||||
gs-demo-1 Updating None 0 10
|
||||
gs-demo-2 Ready None 0 0
|
||||
|
||||
|
||||
# 一段时间过后
|
||||
...
|
||||
|
||||
kubectl get gs
|
||||
NAME STATE OPSSTATE DP UP
|
||||
gs-demo-0 Ready None 0 0
|
||||
gs-demo-1 Ready None 0 10
|
||||
gs-demo-2 Ready None 0 0
|
||||
```
|
||||
|
||||
待gs-demo-3验证通过后,更新其余游戏服:
|
||||
```shell
|
||||
kubectl edit gss gs-demo
|
||||
...
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
maxUnavailable: 5
|
||||
partition: 0 # 设置保留的游戏服数目,将其设置为0,更新余下全部
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
...
|
||||
|
||||
```
|
||||
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
## 功能概述
|
||||
|
||||
如[OKG设计理念](../核心概念/OpenKruiseGame的设计理念.md)中提到的,游戏服接入层网络是游戏开发者非常关注的问题。
|
||||
非网关架构下,游戏开发者需要考虑如何暴露游戏服的外部IP端口,供玩家连接访问。
|
||||
在不同场景下,往往需要不同的网络产品,而有时网络产品由云厂商提供。OKG 的 Cloud Provider & Network Plugin 源于此而诞生。
|
||||
OKG 会集成不同云提供商的不同网络插件,用户可通过GameServerSet设置游戏服的网络参数,并在生成的GameServer中查看网络状态信息,极大降低了游戏服接入网络的复杂度。
|
||||
|
||||
## 使用示例
|
||||
|
||||
### HostPort
|
||||
|
||||
OKG支持在原生Kubernetes集群使用HostPort游戏服网络,使用游戏服所在宿主机暴露外部IP及端口,转发至游戏服内部端口中。使用方式如下。
|
||||
|
||||
部署一个带有network的GameServerSet:
|
||||
|
||||
```
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
metadata:
|
||||
name: gs-hostport
|
||||
namespace: default
|
||||
spec:
|
||||
replicas: 1
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
network:
|
||||
networkType: HostPortNetwork
|
||||
networkConf:
|
||||
#网络配置以k-v键值对的形式传入,由网络插件指定。不同网络插件有着不同的网络配置
|
||||
- name: ContainerPorts
|
||||
#ContainerPorts对应的值格式如下{containerName}:{port1}/{protocol1},{port2}/{protocol2},...
|
||||
value: "gameserver:80"
|
||||
gameServerTemplate:
|
||||
spec:
|
||||
containers:
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
|
||||
name: gameserver
|
||||
EOF
|
||||
```
|
||||
|
||||
生成的GameServer中通过networkStatus字段查看游戏服网络信息:
|
||||
|
||||
```shell
|
||||
networkStatus:
|
||||
createTime: "2022-11-23T10:57:01Z"
|
||||
currentNetworkState: Ready
|
||||
desiredNetworkState: Ready
|
||||
externalAddresses:
|
||||
- ip: 48.98.98.8
|
||||
ports:
|
||||
- name: gameserver-80
|
||||
port: 8211
|
||||
protocol: TCP
|
||||
internalAddresses:
|
||||
- ip: 172.16.0.8
|
||||
ports:
|
||||
- name: gameserver-80
|
||||
port: 80
|
||||
protocol: TCP
|
||||
lastTransitionTime: "2022-11-23T10:57:01Z"
|
||||
networkType: HostPortNetwork
|
||||
```
|
||||
|
||||
访问 48.98.98.8:8211 即可
|
||||
|
||||
### Ali-NatGw
|
||||
|
||||
OKG支持阿里云下NAT网关模型,使用NATGW的外部IP与端口暴露服务,流量最终将转发至Pod之中。使用方式如下:
|
||||
|
||||
```shell
|
||||
cat <<EOF | kubectl apply -f -
|
||||
apiVersion: game.kruise.io/v1alpha1
|
||||
kind: GameServerSet
|
||||
metadata:
|
||||
name: gs-natgw
|
||||
namespace: default
|
||||
spec:
|
||||
replicas: 1
|
||||
updateStrategy:
|
||||
rollingUpdate:
|
||||
podUpdatePolicy: InPlaceIfPossible
|
||||
network:
|
||||
networkType: Ali-NatGw
|
||||
networkConf:
|
||||
- name: Ports
|
||||
#暴露的端口,格式如下 {port1},{port2}...
|
||||
value: "80"
|
||||
- name: Protocol
|
||||
#使用的协议,默认为TCP
|
||||
value: "TCP"
|
||||
# - name: Fixed
|
||||
# 是否固定映射关系,默认不固定,pod删除后会生成新的外部IP及端口
|
||||
# value: true
|
||||
gameServerTemplate:
|
||||
spec:
|
||||
containers:
|
||||
- image: registry.cn-hangzhou.aliyuncs.com/gs-demo/gameserver:network
|
||||
name: gameserver
|
||||
EOF
|
||||
```
|
||||
|
||||
生成的GameServer中通过networkStatus字段查看游戏服网络信息:
|
||||
|
||||
```shell
|
||||
networkStatus:
|
||||
createTime: "2022-11-23T11:21:34Z"
|
||||
currentNetworkState: Ready
|
||||
desiredNetworkState: Ready
|
||||
externalAddresses:
|
||||
- ip: 47.97.227.137
|
||||
ports:
|
||||
- name: "80"
|
||||
port: "512"
|
||||
protocol: TCP
|
||||
internalAddresses:
|
||||
- ip: 172.16.0.189
|
||||
ports:
|
||||
- name: "80"
|
||||
port: "80"
|
||||
protocol: TCP
|
||||
lastTransitionTime: "2022-11-23T11:21:34Z"
|
||||
networkType: Ali-NatGw
|
||||
```
|
||||
|
||||
访问 47.97.227.137:512 即可
|
||||
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
## 功能概述
|
||||
|
||||
由于游戏是有状态服务,很多时候游戏服是以一种 "富容器" 的形态存在于Pod之中,多个进程在Pod中统一管理。
|
||||
然而,每个进程重要性却有所不同,对于"轻量级进程"错误的情况,用户并不希望将整个pod删除重建,像k8s原生的liveness probe并不能很好地满足这种需求,过于僵化的模式与游戏场景并不适配。
|
||||
OKG 认为游戏服的服务质量水平应该交由游戏开发者定义,开发者可以根据不同游戏服状态去设置对应的处理动作。自定义服务质量功能是探测+动作的组合,通过这种方式帮助用户自动化地处理各类游戏服状态问题。
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 游戏服空闲设置即将下线
|
||||
|
||||
部署一个带有自定义服务质量的GameServerSet:
|
||||
```shell
|
||||
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
|
||||
```
|
||||
|
||||
部署完成后,由于还未导入玩家,故所有游戏服都为空闲状态,可以任意被删除:
|
||||
```shell
|
||||
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,则游戏服的运维状态发生变化:
|
||||
```shell
|
||||
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:
|
||||
```shell
|
||||
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:
|
||||
```shell
|
||||
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状态:
|
||||
```shell
|
||||
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项目](https://github.com/AliyunContainerService/kube-eventer)可实现异常通知:
|
||||
|
||||

|
||||
|
||||
此外,OKG 未来会集成游戏服自动排障/恢复工具,进一步丰富游戏服的自动化运维能力。
|
||||
|
|
@ -56,9 +56,9 @@ OpenKruiseGame(OKG)具有如下核心能力:
|
|||
|
||||
### 进行下一步
|
||||
|
||||
* 查看快速开始,安装并体验OpenKruiseGame。
|
||||
* 查看开发指南,为OpenKruiseGame(OKG)提交代码。
|
||||
* 提交<a href="docs/中文/开发者手册/如何贡献代码.md">Issue</a>,给OpenKruiseGame提建议或者讨论游戏云原生化的最佳实践。
|
||||
* 查看[快速开始](./快速开始),安装并体验OpenKruiseGame。
|
||||
* 查看[开发指南](./开发者手册/如何贡献代码.md),为OpenKruiseGame(OKG)提交代码。
|
||||
* 提交[Issue](https://github.com/openkruise/kruise-game/issues),给OpenKruiseGame提建议或者讨论游戏云原生化的最佳实践。
|
||||
* 加入钉钉群(44862615),在线和OpenKruiseGame(OKG)的核心贡献者讨论。
|
||||
* 发送E-mail,联系我们。邮箱地址:zhongwei.lzw@alibaba-inc.com。
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue