Skip to content

Commit 4cad8da

Browse files
committed
scheduler: elastic quota ignore terminating pod immediately
Signed-off-by: yangtao.yt <yangtao.yt@alibaba-inc.com>
1 parent 749b14d commit 4cad8da

File tree

4 files changed

+61
-14
lines changed

4 files changed

+61
-14
lines changed

pkg/features/features.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ const (
6060
// ElasticQuotaIgnoreTerminatingPod ignore the terminating pod.
6161
ElasticQuotaIgnoreTerminatingPod featuregate.Feature = "ElasticQuotaIgnoreTerminatingPod"
6262

63+
// ElasticQuotaImmediateIgnoreTerminatingPod ignore the terminating pod immediately.
64+
ElasticQuotaImmediateIgnoreTerminatingPod featuregate.Feature = "ElasticQuotaImmediateIgnoreTerminatingPod"
65+
6366
// ElasticQuotaGuaranteeUsage enable guarantee the quota usage
6467
// In some specific scenarios, resources that have been allocated to users are considered
6568
// to belong to the users and will not be preempted back.

pkg/features/scheduler_features.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,21 @@ const (
6666
)
6767

6868
var defaultSchedulerFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
69-
CompatibleCSIStorageCapacity: {Default: false, PreRelease: featuregate.Alpha},
70-
DisableCSIStorageCapacityInformer: {Default: false, PreRelease: featuregate.Alpha},
71-
CompatiblePodDisruptionBudget: {Default: false, PreRelease: featuregate.Alpha},
72-
DisablePodDisruptionBudgetInformer: {Default: false, PreRelease: featuregate.Alpha},
73-
ResizePod: {Default: false, PreRelease: featuregate.Alpha},
74-
MultiQuotaTree: {Default: false, PreRelease: featuregate.Alpha},
75-
ElasticQuotaIgnorePodOverhead: {Default: false, PreRelease: featuregate.Alpha},
76-
ElasticQuotaIgnoreTerminatingPod: {Default: false, PreRelease: featuregate.Alpha},
77-
ElasticQuotaGuaranteeUsage: {Default: false, PreRelease: featuregate.Alpha},
78-
DisableDefaultQuota: {Default: false, PreRelease: featuregate.Alpha},
79-
SupportParentQuotaSubmitPod: {Default: false, PreRelease: featuregate.Alpha},
80-
CSIStorageCapacity: {Default: true, PreRelease: featuregate.GA}, // remove in 1.26
81-
GenericEphemeralVolume: {Default: true, PreRelease: featuregate.GA},
82-
PodDisruptionBudget: {Default: true, PreRelease: featuregate.GA},
69+
CompatibleCSIStorageCapacity: {Default: false, PreRelease: featuregate.Alpha},
70+
DisableCSIStorageCapacityInformer: {Default: false, PreRelease: featuregate.Alpha},
71+
CompatiblePodDisruptionBudget: {Default: false, PreRelease: featuregate.Alpha},
72+
DisablePodDisruptionBudgetInformer: {Default: false, PreRelease: featuregate.Alpha},
73+
ResizePod: {Default: false, PreRelease: featuregate.Alpha},
74+
MultiQuotaTree: {Default: false, PreRelease: featuregate.Alpha},
75+
ElasticQuotaIgnorePodOverhead: {Default: false, PreRelease: featuregate.Alpha},
76+
ElasticQuotaIgnoreTerminatingPod: {Default: false, PreRelease: featuregate.Alpha},
77+
ElasticQuotaImmediateIgnoreTerminatingPod: {Default: false, PreRelease: featuregate.Alpha},
78+
ElasticQuotaGuaranteeUsage: {Default: false, PreRelease: featuregate.Alpha},
79+
DisableDefaultQuota: {Default: false, PreRelease: featuregate.Alpha},
80+
SupportParentQuotaSubmitPod: {Default: false, PreRelease: featuregate.Alpha},
81+
CSIStorageCapacity: {Default: true, PreRelease: featuregate.GA}, // remove in 1.26
82+
GenericEphemeralVolume: {Default: true, PreRelease: featuregate.GA},
83+
PodDisruptionBudget: {Default: true, PreRelease: featuregate.GA},
8384
}
8485

8586
func init() {

pkg/scheduler/plugins/elasticquota/core/group_quota_manager.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,10 @@ func shouldBeIgnored(pod *v1.Pod) bool {
11081108
return false
11091109
}
11101110

1111+
if utilfeature.DefaultFeatureGate.Enabled(features.ElasticQuotaImmediateIgnoreTerminatingPod) {
1112+
return true
1113+
}
1114+
11111115
if !utilfeature.DefaultFeatureGate.Enabled(features.ElasticQuotaIgnoreTerminatingPod) {
11121116
return false
11131117
}

pkg/scheduler/plugins/elasticquota/core/group_quota_manager_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2067,5 +2067,44 @@ func TestUpdatePod_WhenQuotaCreateAfterPodCreate(t *testing.T) {
20672067
assert.Equal(t, 1, len(quotaInfo.GetPodCache()))
20682068
assert.Equal(t, createResourceList(10, 10), quotaInfo.GetRequest())
20692069
assert.Equal(t, createResourceList(10, 10), quotaInfo.GetUsed())
2070+
}
2071+
2072+
func TestGroupQuotaManager_ImmediateIgnoreTerminatingPod(t *testing.T) {
2073+
defer utilfeature.SetFeatureGateDuringTest(t, k8sfeature.DefaultFeatureGate,
2074+
features.ElasticQuotaImmediateIgnoreTerminatingPod, true)()
2075+
gqm := NewGroupQuotaManagerForTest()
2076+
2077+
gqm.UpdateClusterTotalResource(createResourceList(50, 50))
2078+
2079+
qi1 := createQuota("1", extension.RootQuotaName, 40, 40, 10, 10)
2080+
gqm.UpdateQuota(qi1, false)
20702081

2082+
// add pod
2083+
pod1 := schetesting.MakePod().Name("1").Obj()
2084+
pod1.Spec.Containers = []v1.Container{
2085+
{
2086+
Resources: v1.ResourceRequirements{
2087+
Requests: createResourceList(10, 10),
2088+
},
2089+
},
2090+
}
2091+
pod1.Spec.NodeName = "node1"
2092+
gqm.OnPodAdd(qi1.Name, pod1)
2093+
assert.Equal(t, createResourceList(10, 10), gqm.GetQuotaInfoByName("1").GetRequest())
2094+
assert.Equal(t, createResourceList(10, 10), gqm.GetQuotaInfoByName("1").GetUsed())
2095+
2096+
// deleting the pod
2097+
pod2 := pod1.DeepCopy()
2098+
deleteTimestamp := metav1.Time{Time: time.Now()}
2099+
deleteGracePeriodsSeconds := int64(30)
2100+
pod2.DeletionTimestamp = &deleteTimestamp
2101+
pod2.DeletionGracePeriodSeconds = &deleteGracePeriodsSeconds
2102+
gqm.OnPodUpdate("1", "1", pod2, pod1)
2103+
assert.Equal(t, createResourceList(0, 0), gqm.GetQuotaInfoByName("1").GetRequest())
2104+
assert.Equal(t, createResourceList(0, 0), gqm.GetQuotaInfoByName("1").GetUsed())
2105+
2106+
// delete the pod
2107+
gqm.OnPodDelete("1", pod2)
2108+
assert.Equal(t, createResourceList(0, 0), gqm.GetQuotaInfoByName("1").GetRequest())
2109+
assert.Equal(t, createResourceList(0, 0), gqm.GetQuotaInfoByName("1").GetUsed())
20712110
}

0 commit comments

Comments
 (0)