@@ -15,6 +15,7 @@ import (
15
15
16
16
const (
17
17
NoneGameServerMinNumberKey = "minAvailable"
18
+ MaxReplicaCountKey = "maxReplicaCount"
18
19
)
19
20
20
21
type ExternalScaler struct {
@@ -90,16 +91,34 @@ func (e *ExternalScaler) GetMetrics(ctx context.Context, metricRequest *GetMetri
90
91
}
91
92
if err == nil && noneNum < int (minNum ) {
92
93
desireReplicas := * gss .Spec .Replicas + int32 (minNum ) - int32 (noneNum )
93
- klog .Infof ("GameServerSet %s/%s desire replicas is %d" , ns , name , desireReplicas )
94
- return & GetMetricsResponse {
95
- MetricValues : []* MetricValue {{
96
- MetricName : "gssReplicas" ,
97
- MetricValue : int64 (desireReplicas ),
98
- }},
99
- }, nil
94
+ maxReplicaCount , err := strconv .ParseInt (metricRequest .ScaledObjectRef .GetScalerMetadata ()[MaxReplicaCountKey ], 10 , 32 )
95
+ // When maxReplicaCount is nil or set failed, desireReplicas will be determined just by minAvailable.
96
+ if err != nil {
97
+ klog .Infof ("GameServerSet %s/%s desire replicas is %d" , ns , name , desireReplicas )
98
+ return & GetMetricsResponse {
99
+ MetricValues : []* MetricValue {{
100
+ MetricName : "gssReplicas" ,
101
+ MetricValue : int64 (desireReplicas ),
102
+ }},
103
+ }, nil
104
+ }
105
+
106
+ // When maxReplicaCount is set successfully, desireReplicas will be limited by maxReplicaCount.
107
+ if * gss .Spec .Replicas != int32 (maxReplicaCount ) {
108
+ if desireReplicas > int32 (maxReplicaCount ) {
109
+ desireReplicas = int32 (maxReplicaCount )
110
+ }
111
+ klog .Infof ("GameServerSet %s/%s desire replicas is %d" , ns , name , desireReplicas )
112
+ return & GetMetricsResponse {
113
+ MetricValues : []* MetricValue {{
114
+ MetricName : "gssReplicas" ,
115
+ MetricValue : int64 (desireReplicas ),
116
+ }},
117
+ }, nil
118
+ }
100
119
}
101
120
102
- // scale up those GameServers with WaitToBeDeleted opsState
121
+ // scale down those GameServers with WaitToBeDeleted opsState
103
122
isWaitToDelete , _ := labels .NewRequirement (gamekruiseiov1alpha1 .GameServerOpsStateKey , selection .Equals , []string {string (gamekruiseiov1alpha1 .WaitToDelete )})
104
123
notDeleting , _ := labels .NewRequirement (gamekruiseiov1alpha1 .GameServerStateKey , selection .NotEquals , []string {string (gamekruiseiov1alpha1 .Deleting )})
105
124
podList = & corev1.PodList {}
0 commit comments