|
8 | 8 | "github.com/aws/aws-sdk-go/aws/arn"
|
9 | 9 | "github.com/pkg/errors"
|
10 | 10 |
|
| 11 | + v1 "k8s.io/api/core/v1" |
11 | 12 | "k8s.io/apimachinery/pkg/util/validation"
|
12 |
| - kubeletapis "k8s.io/kubernetes/pkg/kubelet/apis" |
| 13 | + "k8s.io/apimachinery/pkg/util/sets" |
13 | 14 | )
|
14 | 15 |
|
15 | 16 | var (
|
@@ -239,6 +240,51 @@ func ValidateNodeGroup(i int, ng *NodeGroup) error {
|
239 | 240 | return nil
|
240 | 241 | }
|
241 | 242 |
|
| 243 | +// isKubeletLabel returns true if the label key is one that kubelets are allowed to set on their own Node object. |
| 244 | +// This checks if the key is in the KubeletLabels() list, or has a namespace in the KubeletLabelNamespaces() list. |
| 245 | +func isKubeletLabel(key string) bool { |
| 246 | + var LabelOS = "beta.kubernetes.io/os" |
| 247 | + var LabelArch = "beta.kubernetes.io/arch" |
| 248 | + |
| 249 | + var labelZoneFailureDomainGA = "failure-domain.kubernetes.io/zone" |
| 250 | + var labelZoneRegionGA = "failure-domain.kubernetes.io/region" |
| 251 | + var labelInstanceTypeGA = "kubernetes.io/instance-type" |
| 252 | + var kubeletLabels = sets.NewString( |
| 253 | + v1.LabelHostname, |
| 254 | + v1.LabelZoneFailureDomain, |
| 255 | + v1.LabelZoneRegion, |
| 256 | + v1.LabelInstanceType, |
| 257 | + v1.LabelOSStable, |
| 258 | + v1.LabelArchStable, |
| 259 | + |
| 260 | + LabelOS, |
| 261 | + LabelArch, |
| 262 | + |
| 263 | + labelZoneFailureDomainGA, |
| 264 | + labelZoneRegionGA, |
| 265 | + labelInstanceTypeGA, |
| 266 | + ) |
| 267 | + if kubeletLabels.Has(key) { |
| 268 | + return true |
| 269 | + } |
| 270 | + |
| 271 | + var namespace string |
| 272 | + if parts := strings.SplitN(key, "/", 2); len(parts) == 2 { |
| 273 | + namespace = parts[0] |
| 274 | + } |
| 275 | + var kubeletLabelNamespaces = sets.NewString( |
| 276 | + v1.LabelNamespaceSuffixKubelet, |
| 277 | + v1.LabelNamespaceSuffixNode, |
| 278 | + ) |
| 279 | + for allowedNamespace := range kubeletLabelNamespaces { |
| 280 | + if namespace == allowedNamespace || strings.HasSuffix(namespace, "."+allowedNamespace) { |
| 281 | + return true |
| 282 | + } |
| 283 | + } |
| 284 | + |
| 285 | + return false |
| 286 | +} |
| 287 | + |
242 | 288 | // ValidateNodeGroupLabels uses proper Kubernetes label validation,
|
243 | 289 | // it's designed to make sure users don't pass weird labels to the
|
244 | 290 | // nodes, which would prevent kubelets to startup properly
|
@@ -266,7 +312,7 @@ func ValidateNodeGroupLabels(labels map[string]string) error {
|
266 | 312 |
|
267 | 313 | if len(labelParts) == 2 {
|
268 | 314 | namespace := labelParts[0]
|
269 |
| - if isKubernetesLabel(namespace) && !kubeletapis.IsKubeletLabel(label) { |
| 315 | + if isKubernetesLabel(namespace) && !isKubeletLabel(label) { |
270 | 316 | unknownKubernetesLabels = append(unknownKubernetesLabels, label)
|
271 | 317 | }
|
272 | 318 | }
|
|
0 commit comments