diff --git a/pkg/apis/provisioning/v1alpha5/provisioner_validation.go b/pkg/apis/provisioning/v1alpha5/provisioner_validation.go index 7c01b5e690f2..969daac64d36 100644 --- a/pkg/apis/provisioning/v1alpha5/provisioner_validation.go +++ b/pkg/apis/provisioning/v1alpha5/provisioner_validation.go @@ -90,6 +90,9 @@ func (c *Constraints) validateLabels() (errs *apis.FieldError) { func IsRestrictedLabelDomain(key string) bool { labelDomain := getLabelDomain(key) + if AllowedLabelDomains.Has(labelDomain) { + return false + } for restrictedLabelDomain := range RestrictedLabelDomains { if strings.HasSuffix(labelDomain, restrictedLabelDomain) { return true diff --git a/pkg/apis/provisioning/v1alpha5/register.go b/pkg/apis/provisioning/v1alpha5/register.go index fd4981a9e370..e0ec43af77ff 100644 --- a/pkg/apis/provisioning/v1alpha5/register.go +++ b/pkg/apis/provisioning/v1alpha5/register.go @@ -46,7 +46,16 @@ var ( EmptinessTimestampAnnotationKey, v1.LabelHostname, ) + + // AllowedLabelDomains are domains that may be restricted, but that is allowed because + // they are not used in a context where they may be passed as argument to kubelet. + // AllowedLabelDomains are evaluated before RestrictedLabelDomains + AllowedLabelDomains = sets.NewString( + "kops.k8s.io", + ) + // These are either prohibited by the kubelet or reserved by karpenter + // They are evaluated after AllowedLabelDomains KarpenterLabelDomain = "karpenter.sh" RestrictedLabelDomains = sets.NewString( "kubernetes.io", diff --git a/pkg/apis/provisioning/v1alpha5/suite_test.go b/pkg/apis/provisioning/v1alpha5/suite_test.go index cf4f9ec541a2..b24e4ee4526a 100644 --- a/pkg/apis/provisioning/v1alpha5/suite_test.go +++ b/pkg/apis/provisioning/v1alpha5/suite_test.go @@ -103,6 +103,13 @@ var _ = Describe("Validation", func() { Expect(provisioner.Validate(ctx)).ToNot(Succeed()) } }) + It("should allow labels kOps require", func() { + provisioner.Spec.Labels = map[string]string{ + "kops.k8s.io/instancegroup": "karpenter-nodes", + "kops.k8s.io/gpu": "1", + } + Expect(provisioner.Validate(ctx)).To(Succeed()) + }) }) Context("Taints", func() { It("should succeed for valid taints", func() {