Skip to content

Commit bb55aa7

Browse files
authored
Merge pull request kubernetes#76310 from ravisantoshgudimetla/fix-priority-quota
Relax namespace restriction for critical pods
2 parents eedfb6b + f2cbbe2 commit bb55aa7

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

plugin/pkg/admission/priority/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ go_library(
4444
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
4545
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
4646
"//staging/src/k8s.io/apiserver/pkg/admission/initializer:go_default_library",
47-
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
4847
"//staging/src/k8s.io/client-go/informers:go_default_library",
4948
"//staging/src/k8s.io/client-go/kubernetes:go_default_library",
5049
"//staging/src/k8s.io/client-go/listers/scheduling/v1:go_default_library",
50+
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
5151
],
5252
)
5353

plugin/pkg/admission/priority/admission.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import (
2828
"k8s.io/apimachinery/pkg/labels"
2929
"k8s.io/apiserver/pkg/admission"
3030
genericadmissioninitializers "k8s.io/apiserver/pkg/admission/initializer"
31-
utilfeature "k8s.io/apiserver/pkg/util/feature"
3231
"k8s.io/client-go/informers"
3332
"k8s.io/client-go/kubernetes"
3433
schedulingv1listers "k8s.io/client-go/listers/scheduling/v1"
34+
"k8s.io/component-base/featuregate"
3535
"k8s.io/kubernetes/pkg/apis/core"
3636
api "k8s.io/kubernetes/pkg/apis/core"
3737
"k8s.io/kubernetes/pkg/apis/scheduling"
@@ -54,12 +54,15 @@ func Register(plugins *admission.Plugins) {
5454
// Plugin is an implementation of admission.Interface.
5555
type Plugin struct {
5656
*admission.Handler
57-
client kubernetes.Interface
58-
lister schedulingv1listers.PriorityClassLister
57+
client kubernetes.Interface
58+
lister schedulingv1listers.PriorityClassLister
59+
resourceQuotaFeatureGateEnabled bool
60+
nonPreemptingPriority bool
5961
}
6062

6163
var _ admission.MutationInterface = &Plugin{}
6264
var _ admission.ValidationInterface = &Plugin{}
65+
var _ genericadmissioninitializers.WantsFeatures = &Plugin{}
6366
var _ = genericadmissioninitializers.WantsExternalKubeInformerFactory(&Plugin{})
6467
var _ = genericadmissioninitializers.WantsExternalKubeClientSet(&Plugin{})
6568

@@ -81,6 +84,12 @@ func (p *Plugin) ValidateInitialization() error {
8184
return nil
8285
}
8386

87+
// InspectFeatureGates allows setting bools without taking a dep on a global variable
88+
func (p *Plugin) InspectFeatureGates(featureGates featuregate.FeatureGate) {
89+
p.nonPreemptingPriority = featureGates.Enabled(features.NonPreemptingPriority)
90+
p.resourceQuotaFeatureGateEnabled = featureGates.Enabled(features.ResourceQuotaScopeSelectors)
91+
}
92+
8493
// SetExternalKubeClientSet implements the WantsInternalKubeClientSet interface.
8594
func (p *Plugin) SetExternalKubeClientSet(client kubernetes.Interface) {
8695
p.client = client
@@ -106,7 +115,6 @@ func (p *Plugin) Admit(ctx context.Context, a admission.Attributes, o admission.
106115
if len(a.GetSubresource()) != 0 {
107116
return nil
108117
}
109-
110118
switch a.GetResource().GroupResource() {
111119
case podResource:
112120
if operation == admission.Create || operation == admission.Update {
@@ -189,8 +197,12 @@ func (p *Plugin) admitPod(a admission.Attributes) error {
189197
pod.Spec.PriorityClassName = pcName
190198
} else {
191199
pcName := pod.Spec.PriorityClassName
192-
if !priorityClassPermittedInNamespace(pcName, a.GetNamespace()) {
193-
return admission.NewForbidden(a, fmt.Errorf("pods with %v priorityClass is not permitted in %v namespace", pcName, a.GetNamespace()))
200+
// If ResourceQuotaScopeSelectors is enabled, we should let pods with critical priorityClass to be created
201+
// any namespace where administrator wants it to be created.
202+
if !p.resourceQuotaFeatureGateEnabled {
203+
if !priorityClassPermittedInNamespace(pcName, a.GetNamespace()) {
204+
return admission.NewForbidden(a, fmt.Errorf("pods with %v priorityClass is not permitted in %v namespace", pcName, a.GetNamespace()))
205+
}
194206
}
195207

196208
// Try resolving the priority class name.
@@ -212,7 +224,7 @@ func (p *Plugin) admitPod(a admission.Attributes) error {
212224
}
213225
pod.Spec.Priority = &priority
214226

215-
if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) {
227+
if p.nonPreemptingPriority {
216228
var corePolicy core.PreemptionPolicy
217229
if preemptionPolicy != nil {
218230
corePolicy = core.PreemptionPolicy(*preemptionPolicy)

plugin/pkg/admission/priority/admission_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ func TestPodAdmission(t *testing.T) {
626626
[]*scheduling.PriorityClass{systemClusterCritical},
627627
*pods[7],
628628
scheduling.SystemCriticalPriority,
629-
true,
629+
false,
630630
nil,
631631
},
632632
{
@@ -681,8 +681,9 @@ func TestPodAdmission(t *testing.T) {
681681

682682
for _, test := range tests {
683683
klog.V(4).Infof("starting test %q", test.name)
684-
685684
ctrl := NewPlugin()
685+
ctrl.resourceQuotaFeatureGateEnabled = true
686+
ctrl.nonPreemptingPriority = true
686687
// Add existing priority classes.
687688
if err := addPriorityClasses(ctrl, test.existingClasses); err != nil {
688689
t.Errorf("Test %q: unable to add object to informer: %v", test.name, err)
@@ -704,6 +705,7 @@ func TestPodAdmission(t *testing.T) {
704705
)
705706
err := admissiontesting.WithReinvocationTesting(t, ctrl).Admit(context.TODO(), attrs, nil)
706707
klog.Infof("Got %v", err)
708+
707709
if !test.expectError {
708710
if err != nil {
709711
t.Errorf("Test %q: unexpected error received: %v", test.name, err)

0 commit comments

Comments
 (0)