openkruise / kruise-game

Game Servers Management on Kubernetes
https://openkruise.io/kruisegame/introduction
Apache License 2.0
407 stars 56 forks source link

[enhance] The MinAvailable value for scaling support percent type #185

Open chrisliu1995 opened 1 week ago

chrisliu1995 commented 1 week ago

当前用于扩容的MinAvailable是以具体数值的方式生效的。比如,MinAvailable为3,会保证至少存在3个可用游戏服。

但在游戏服数量变化比较明显的情况下,固定的值并不能很好地拟合玩家涌入的速率。因此,我们需要让MinAvailable支持百分比类型,在gameserver总数增多的情况下,最小可用的数量也增多;gameserver总数减少的情况下,最小可用的数量也减少。

Macroldj commented 1 week ago

MinAvailable 的取值必定是小于replicas的取值的,所以 按比例设置的时候按照 0<value<1 取值是合理的。关于具体取值如下情况进行讨论

  1. 取值范围在 0-100% 即 [0,100],对于大于100%的设置毫无意义,但是为了规避这种情况,直接使其强制变成100%,即 200% -> 100%

  2. 在计算过程中产生小数怎么取值?

    • 四舍五入, 优点最直观,在设置的时候不会有歧义。但是当 replicas: 10 MinAvailable: 1% 此时就会是0.
    • 向上取整, 优点有保底容器。当 replicas: 10 MinAvailable: 1% 此时就会是1. 有保底的1个容器,生产安全,但是当设置为91%的时候就会失去意义,都会变成100%。
    • 向下取整, 优点能让MinAvailable永远保持小于replicas,但是在设置小于10%时都会将MinAvailable设置为0.

我觉得可以用 向上取整 的方式进行取整,MinAvailable的设置一般会设置在 30%-50% 91%-100%的情况会少很多。

@chrisliu1995

chrisliu1995 commented 1 week ago

首先我们需要确定MinAvailable的语义,表示“最少可用”,最终依然要落实到具体数量上。因此,百分比生效与否,需要计算当前可用gs数量后才能得到结论。

例如,replicas 为10,MinAvailable=91%情况下:

若当前None的数量是9,则可用比例为90% < 91%,所以需要扩容。至于扩容几个,需要再次计算。扩容1个,则replicas为11,None的数量为10,可用比例为 90.09%,依然 < 91%;扩容2个,则replicas为12,None的数量为91.6% > 91%. 所以副本数量应该设置为12.

这种逻辑符合MinAvailable的语义。