Skip to content

Commit 57108f6

Browse files
authored
Merge pull request kubernetes#90307 from liggitt/node-labels
Restrict node labels on Node create
2 parents 13561c9 + ba4d2aa commit 57108f6

File tree

3 files changed

+7
-36
lines changed

3 files changed

+7
-36
lines changed

plugin/pkg/admission/noderestriction/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ go_library(
3232
"//staging/src/k8s.io/client-go/informers:go_default_library",
3333
"//staging/src/k8s.io/client-go/listers/core/v1:go_default_library",
3434
"//staging/src/k8s.io/component-base/featuregate:go_default_library",
35-
"//vendor/k8s.io/klog:go_default_library",
3635
],
3736
)
3837

plugin/pkg/admission/noderestriction/admission.go

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"k8s.io/client-go/informers"
3535
corev1lister "k8s.io/client-go/listers/core/v1"
3636
"k8s.io/component-base/featuregate"
37-
"k8s.io/klog"
3837
podutil "k8s.io/kubernetes/pkg/api/pod"
3938
authenticationapi "k8s.io/kubernetes/pkg/apis/authentication"
4039
coordapi "k8s.io/kubernetes/pkg/apis/coordination"
@@ -406,14 +405,9 @@ func (p *Plugin) admitNode(nodeName string, a admission.Attributes) error {
406405
// Don't allow a node to register with labels outside the allowed set.
407406
// This would allow a node to add or modify its labels in a way that would let it steer privileged workloads to itself.
408407
modifiedLabels := getModifiedLabels(node.Labels, nil)
409-
if forbiddenLabels := p.getForbiddenCreateLabels(modifiedLabels); len(forbiddenLabels) > 0 {
408+
if forbiddenLabels := p.getForbiddenLabels(modifiedLabels); len(forbiddenLabels) > 0 {
410409
return admission.NewForbidden(a, fmt.Errorf("node %q is not allowed to set the following labels: %s", nodeName, strings.Join(forbiddenLabels.List(), ", ")))
411410
}
412-
// check and warn if nodes set labels on create that would have been forbidden on update
413-
// TODO(liggitt): in 1.19, expand getForbiddenCreateLabels to match getForbiddenUpdateLabels and drop this
414-
if forbiddenUpdateLabels := p.getForbiddenUpdateLabels(modifiedLabels); len(forbiddenUpdateLabels) > 0 {
415-
klog.Warningf("node %q added disallowed labels on node creation: %s", nodeName, strings.Join(forbiddenUpdateLabels.List(), ", "))
416-
}
417411
}
418412
if requestedName != nodeName {
419413
return admission.NewForbidden(a, fmt.Errorf("node %q is not allowed to modify node %q", nodeName, requestedName))
@@ -445,7 +439,7 @@ func (p *Plugin) admitNode(nodeName string, a admission.Attributes) error {
445439
// Don't allow a node to update labels outside the allowed set.
446440
// This would allow a node to add or modify its labels in a way that would let it steer privileged workloads to itself.
447441
modifiedLabels := getModifiedLabels(node.Labels, oldNode.Labels)
448-
if forbiddenUpdateLabels := p.getForbiddenUpdateLabels(modifiedLabels); len(forbiddenUpdateLabels) > 0 {
442+
if forbiddenUpdateLabels := p.getForbiddenLabels(modifiedLabels); len(forbiddenUpdateLabels) > 0 {
449443
return admission.NewForbidden(a, fmt.Errorf("is not allowed to modify labels: %s", strings.Join(forbiddenUpdateLabels.List(), ", ")))
450444
}
451445
}
@@ -487,26 +481,8 @@ func getLabelNamespace(key string) string {
487481
return ""
488482
}
489483

490-
// getForbiddenCreateLabels returns the set of labels that may not be set by the node.
491-
// TODO(liggitt): in 1.19, expand to match getForbiddenUpdateLabels()
492-
func (p *Plugin) getForbiddenCreateLabels(modifiedLabels sets.String) sets.String {
493-
if len(modifiedLabels) == 0 {
494-
return nil
495-
}
496-
497-
forbiddenLabels := sets.NewString()
498-
for label := range modifiedLabels {
499-
namespace := getLabelNamespace(label)
500-
// forbid kubelets from setting node-restriction labels
501-
if namespace == v1.LabelNamespaceNodeRestriction || strings.HasSuffix(namespace, "."+v1.LabelNamespaceNodeRestriction) {
502-
forbiddenLabels.Insert(label)
503-
}
504-
}
505-
return forbiddenLabels
506-
}
507-
508-
// getForbiddenLabels returns the set of labels that may not be set by the node on update.
509-
func (p *Plugin) getForbiddenUpdateLabels(modifiedLabels sets.String) sets.String {
484+
// getForbiddenLabels returns the set of labels that may not be added, removed, or modified by the node on create or update.
485+
func (p *Plugin) getForbiddenLabels(modifiedLabels sets.String) sets.String {
510486
if len(modifiedLabels) == 0 {
511487
return nil
512488
}

plugin/pkg/admission/noderestriction/admission_test.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,6 @@ func setAllLabels(node *api.Node, value string) *api.Node {
146146

147147
func setAllowedCreateLabels(node *api.Node, value string) *api.Node {
148148
node = setAllowedUpdateLabels(node, value)
149-
// also allow other kubernetes labels on create until 1.17 (TODO: remove this in 1.17)
150-
node.Labels["other.kubernetes.io/foo"] = value
151-
node.Labels["other.k8s.io/foo"] = value
152149
return node
153150
}
154151

@@ -206,9 +203,8 @@ func setForbiddenCreateLabels(node *api.Node, value string) *api.Node {
206203
// node restriction labels are forbidden
207204
node.Labels["node-restriction.kubernetes.io/foo"] = value
208205
node.Labels["foo.node-restriction.kubernetes.io/foo"] = value
209-
// TODO: in 1.17, forbid arbitrary kubernetes labels on create
210-
// node.Labels["other.kubernetes.io/foo"] = value
211-
// node.Labels["other.k8s.io/foo"] = value
206+
node.Labels["other.kubernetes.io/foo"] = value
207+
node.Labels["other.k8s.io/foo"] = value
212208
return node
213209
}
214210

@@ -925,7 +921,7 @@ func Test_nodePlugin_Admit(t *testing.T) {
925921
name: "forbid create of my node with forbidden labels",
926922
podsGetter: noExistingPods,
927923
attributes: admission.NewAttributesRecord(setForbiddenCreateLabels(mynodeObj, ""), nil, nodeKind, mynodeObj.Namespace, "", nodeResource, "", admission.Create, &metav1.CreateOptions{}, false, mynode),
928-
err: `is not allowed to set the following labels: foo.node-restriction.kubernetes.io/foo, node-restriction.kubernetes.io/foo`,
924+
err: `is not allowed to set the following labels: foo.node-restriction.kubernetes.io/foo, node-restriction.kubernetes.io/foo, other.k8s.io/foo, other.kubernetes.io/foo`,
929925
},
930926
{
931927
name: "allow update of my node",

0 commit comments

Comments
 (0)