Fix bug about unintentional scale out during updating deployment.

This commit fix bug in calcPlainMetricReplicas function.
Same bug in GetResourceReplicas function was fixed in #85027.
This commit is contained in:
shibataka000 2020-03-25 15:36:45 +09:00
parent 044a4ce21d
commit dbd0d566ed
2 changed files with 23 additions and 1 deletions

View File

@ -235,9 +235,15 @@ func (c *ReplicaCalculator) calcPlainMetricReplicas(metrics metricsclient.PodMet
return currentReplicas, utilization, nil
}
newReplicas := int32(math.Ceil(newUsageRatio * float64(len(metrics))))
if (newUsageRatio < 1.0 && newReplicas > currentReplicas) || (newUsageRatio > 1.0 && newReplicas < currentReplicas) {
// return the current replicas if the change of metrics length would cause a change in scale direction
return currentReplicas, utilization, nil
}
// return the result, where the number of replicas considered is
// however many replicas factored into our calculation
return int32(math.Ceil(newUsageRatio * float64(len(metrics)))), utilization, nil
return newReplicas, utilization, nil
}
// GetObjectMetricReplicas calculates the desired replica count based on a target metric utilization (as a milli-value)

View File

@ -1265,6 +1265,22 @@ func TestReplicaCalcDuringRollingUpdateWithMaxSurge(t *testing.T) {
tc.runTest(t)
}
func TestReplicaCalcDuringRollingUpdateWithMaxSurgeCM(t *testing.T) {
tc := replicaCalcTestCase{
currentReplicas: 2,
expectedReplicas: 2,
podPhase: []v1.PodPhase{v1.PodRunning, v1.PodRunning, v1.PodRunning},
metric: &metricInfo{
name: "qps",
levels: []int64{10000, 10000},
targetUtilization: 17000,
expectedUtilization: 10000,
metricType: podMetric,
},
}
tc.runTest(t)
}
// TestComputedToleranceAlgImplementation is a regression test which
// back-calculates a minimal percentage for downscaling based on a small percentage
// increase in pod utilization which is calibrated against the tolerance value.