mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-27 13:37:30 +00:00
Add node affinity, pod affinity and pod antiaffinity validation for alpha annotations.
This commit is contained in:
parent
321acf00e5
commit
ab5b462d17
@ -18,6 +18,7 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@ -463,6 +464,11 @@ const (
|
|||||||
// an object (e.g. secret, config map) before fetching it again from apiserver.
|
// an object (e.g. secret, config map) before fetching it again from apiserver.
|
||||||
// This annotation can be attached to node.
|
// This annotation can be attached to node.
|
||||||
ObjectTTLAnnotationKey string = "node.alpha.kubernetes.io/ttl"
|
ObjectTTLAnnotationKey string = "node.alpha.kubernetes.io/ttl"
|
||||||
|
|
||||||
|
// AffinityAnnotationKey represents the key of affinity data (json serialized)
|
||||||
|
// in the Annotations of a Pod.
|
||||||
|
// TODO: remove when alpha support for affinity is removed
|
||||||
|
AffinityAnnotationKey string = "scheduler.alpha.kubernetes.io/affinity"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddOrUpdateTolerationInPod tries to add a toleration to the pod's toleration list.
|
// AddOrUpdateTolerationInPod tries to add a toleration to the pod's toleration list.
|
||||||
@ -596,6 +602,21 @@ func PodAnnotationsFromSysctls(sysctls []Sysctl) string {
|
|||||||
return strings.Join(kvs, ",")
|
return strings.Join(kvs, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetAffinityFromPodAnnotations gets the json serialized affinity data from Pod.Annotations
|
||||||
|
// and converts it to the Affinity type in api.
|
||||||
|
// TODO: remove when alpha support for affinity is removed
|
||||||
|
func GetAffinityFromPodAnnotations(annotations map[string]string) (*Affinity, error) {
|
||||||
|
if len(annotations) > 0 && annotations[AffinityAnnotationKey] != "" {
|
||||||
|
var affinity Affinity
|
||||||
|
err := json.Unmarshal([]byte(annotations[AffinityAnnotationKey]), &affinity)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &affinity, nil
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
// GetPersistentVolumeClass returns StorageClassName.
|
// GetPersistentVolumeClass returns StorageClassName.
|
||||||
func GetPersistentVolumeClass(volume *PersistentVolume) string {
|
func GetPersistentVolumeClass(volume *PersistentVolume) string {
|
||||||
// Use beta annotation first
|
// Use beta annotation first
|
||||||
|
@ -105,6 +105,10 @@ func ValidateDNS1123Subdomain(value string, fldPath *field.Path) field.ErrorList
|
|||||||
func ValidatePodSpecificAnnotations(annotations map[string]string, spec *api.PodSpec, fldPath *field.Path) field.ErrorList {
|
func ValidatePodSpecificAnnotations(annotations map[string]string, spec *api.PodSpec, fldPath *field.Path) field.ErrorList {
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
if annotations[api.AffinityAnnotationKey] != "" {
|
||||||
|
allErrs = append(allErrs, ValidateAffinityInPodAnnotations(annotations, fldPath)...)
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: remove these after we EOL the annotations.
|
// TODO: remove these after we EOL the annotations.
|
||||||
if hostname, exists := annotations[utilpod.PodHostnameAnnotation]; exists {
|
if hostname, exists := annotations[utilpod.PodHostnameAnnotation]; exists {
|
||||||
allErrs = append(allErrs, ValidateDNS1123Label(hostname, fldPath.Key(utilpod.PodHostnameAnnotation))...)
|
allErrs = append(allErrs, ValidateDNS1123Label(hostname, fldPath.Key(utilpod.PodHostnameAnnotation))...)
|
||||||
@ -136,6 +140,23 @@ func ValidatePodSpecificAnnotations(annotations map[string]string, spec *api.Pod
|
|||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidateAffinityInPodAnnotations tests that the serialized Affinity in Pod.Annotations has valid data
|
||||||
|
func ValidateAffinityInPodAnnotations(annotations map[string]string, fldPath *field.Path) field.ErrorList {
|
||||||
|
allErrs := field.ErrorList{}
|
||||||
|
|
||||||
|
affinity, err := api.GetAffinityFromPodAnnotations(annotations)
|
||||||
|
if err != nil {
|
||||||
|
allErrs = append(allErrs, field.Invalid(fldPath, api.AffinityAnnotationKey, err.Error()))
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
if affinity == nil {
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
|
allErrs = append(allErrs, validateAffinity(affinity, fldPath.Child("affinity"))...)
|
||||||
|
return allErrs
|
||||||
|
}
|
||||||
|
|
||||||
func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *api.Pod, fldPath *field.Path) field.ErrorList {
|
func ValidatePodSpecificAnnotationUpdates(newPod, oldPod *api.Pod, fldPath *field.Path) field.ErrorList {
|
||||||
allErrs := field.ErrorList{}
|
allErrs := field.ErrorList{}
|
||||||
newAnnotations := newPod.Annotations
|
newAnnotations := newPod.Annotations
|
||||||
|
Loading…
Reference in New Issue
Block a user