123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*
- Copyright 2015 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package apis
- import (
- "strings"
- "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/util/sets"
- )
- const (
- // LabelOS is a label to indicate the operating system of the node.
- // The OS labels are promoted to GA in 1.14. kubelet applies both beta
- // and GA labels to ensure backward compatibility.
- // TODO: stop applying the beta OS labels in Kubernetes 1.18.
- LabelOS = "beta.kubernetes.io/os"
- // LabelArch is a label to indicate the architecture of the node.
- // The Arch labels are promoted to GA in 1.14. kubelet applies both beta
- // and GA labels to ensure backward compatibility.
- // TODO: stop applying the beta Arch labels in Kubernetes 1.18.
- LabelArch = "beta.kubernetes.io/arch"
- // GA versions of the legacy beta labels.
- // TODO: update kubelet and controllers to set both beta and GA labels, then export these constants
- labelZoneFailureDomainGA = "failure-domain.kubernetes.io/zone"
- labelZoneRegionGA = "failure-domain.kubernetes.io/region"
- labelInstanceTypeGA = "kubernetes.io/instance-type"
- )
- var kubeletLabels = sets.NewString(
- v1.LabelHostname,
- v1.LabelZoneFailureDomain,
- v1.LabelZoneRegion,
- v1.LabelInstanceType,
- v1.LabelOSStable,
- v1.LabelArchStable,
- LabelOS,
- LabelArch,
- labelZoneFailureDomainGA,
- labelZoneRegionGA,
- labelInstanceTypeGA,
- )
- var kubeletLabelNamespaces = sets.NewString(
- v1.LabelNamespaceSuffixKubelet,
- v1.LabelNamespaceSuffixNode,
- )
- // KubeletLabels returns the list of label keys kubelets are allowed to set on their own Node objects
- func KubeletLabels() []string {
- return kubeletLabels.List()
- }
- // KubeletLabelNamespaces returns the list of label key namespaces kubelets are allowed to set on their own Node objects
- func KubeletLabelNamespaces() []string {
- return kubeletLabelNamespaces.List()
- }
- // IsKubeletLabel returns true if the label key is one that kubelets are allowed to set on their own Node object.
- // This checks if the key is in the KubeletLabels() list, or has a namespace in the KubeletLabelNamespaces() list.
- func IsKubeletLabel(key string) bool {
- if kubeletLabels.Has(key) {
- return true
- }
- namespace := getLabelNamespace(key)
- for allowedNamespace := range kubeletLabelNamespaces {
- if namespace == allowedNamespace || strings.HasSuffix(namespace, "."+allowedNamespace) {
- return true
- }
- }
- return false
- }
- func getLabelNamespace(key string) string {
- if parts := strings.SplitN(key, "/", 2); len(parts) == 2 {
- return parts[0]
- }
- return ""
- }
|