diff --git a/cmd/kubelet/app/options/options.go b/cmd/kubelet/app/options/options.go index a1c147367c9..aecfd5fbd8c 100644 --- a/cmd/kubelet/app/options/options.go +++ b/cmd/kubelet/app/options/options.go @@ -26,6 +26,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/validation" utilfeature "k8s.io/apiserver/pkg/util/feature" cliflag "k8s.io/component-base/cli/flag" logsapi "k8s.io/component-base/logs/api/v1" @@ -160,14 +161,29 @@ func NewKubeletFlags() *KubeletFlags { // ValidateKubeletFlags validates Kubelet's configuration flags and returns an error if they are invalid. func ValidateKubeletFlags(f *KubeletFlags) error { unknownLabels := sets.NewString() - for k := range f.NodeLabels { + invalidLabelErrs := make(map[string][]string) + for k, v := range f.NodeLabels { if isKubernetesLabel(k) && !kubeletapis.IsKubeletLabel(k) { unknownLabels.Insert(k) } + + if errs := validation.IsQualifiedName(k); len(errs) > 0 { + invalidLabelErrs[k] = append(invalidLabelErrs[k], errs...) + } + if errs := validation.IsValidLabelValue(v); len(errs) > 0 { + invalidLabelErrs[v] = append(invalidLabelErrs[v], errs...) + } } if len(unknownLabels) > 0 { return fmt.Errorf("unknown 'kubernetes.io' or 'k8s.io' labels specified with --node-labels: %v\n--node-labels in the 'kubernetes.io' namespace must begin with an allowed prefix (%s) or be in the specifically allowed set (%s)", unknownLabels.List(), strings.Join(kubeletapis.KubeletLabelNamespaces(), ", "), strings.Join(kubeletapis.KubeletLabels(), ", ")) } + if len(invalidLabelErrs) > 0 { + labelErrs := []string{} + for k, v := range invalidLabelErrs { + labelErrs = append(labelErrs, fmt.Sprintf("'%s' - %s", k, strings.Join(v, ", "))) + } + return fmt.Errorf("invalid node labels: %s", strings.Join(labelErrs, "; ")) + } if f.SeccompDefault && !utilfeature.DefaultFeatureGate.Enabled(features.SeccompDefault) { return fmt.Errorf("the SeccompDefault feature gate must be enabled in order to use the --seccomp-default flag") diff --git a/cmd/kubelet/app/options/options_test.go b/cmd/kubelet/app/options/options_test.go index b7cabcdf17a..e306d7ea914 100644 --- a/cmd/kubelet/app/options/options_test.go +++ b/cmd/kubelet/app/options/options_test.go @@ -168,6 +168,13 @@ func TestValidateKubeletFlags(t *testing.T) { error: false, labels: map[string]string{}, }, + { + name: "Invalid label", + error: true, + labels: map[string]string{ + "cloud.google.com/repository": "kubernetes/kubernetes", + }, + }, } for _, tt := range tests {