mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-30 15:05:27 +00:00
avoid kubelet converts and validates pods multiple times
This commit is contained in:
parent
1797255cd2
commit
811447ea0a
@ -42,7 +42,6 @@ go_library(
|
|||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/types:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/validation/field:go_default_library",
|
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
|
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
|
||||||
|
@ -118,8 +118,7 @@ func tryDecodeSinglePod(data []byte, defaultFn defaultFunc) (parsed bool, pod *v
|
|||||||
newPod, ok := obj.(*api.Pod)
|
newPod, ok := obj.(*api.Pod)
|
||||||
// Check whether the object could be converted to single pod.
|
// Check whether the object could be converted to single pod.
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("invalid pod: %#v", obj)
|
return false, pod, fmt.Errorf("invalid pod: %#v", obj)
|
||||||
return false, pod, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply default values and validate the pod.
|
// Apply default values and validate the pod.
|
||||||
@ -127,11 +126,11 @@ func tryDecodeSinglePod(data []byte, defaultFn defaultFunc) (parsed bool, pod *v
|
|||||||
return true, pod, err
|
return true, pod, err
|
||||||
}
|
}
|
||||||
if errs := validation.ValidatePod(newPod); len(errs) > 0 {
|
if errs := validation.ValidatePod(newPod); len(errs) > 0 {
|
||||||
err = fmt.Errorf("invalid pod: %v", errs)
|
return true, pod, fmt.Errorf("invalid pod: %v", errs)
|
||||||
return true, pod, err
|
|
||||||
}
|
}
|
||||||
v1Pod := &v1.Pod{}
|
v1Pod := &v1.Pod{}
|
||||||
if err := k8s_api_v1.Convert_api_Pod_To_v1_Pod(newPod, v1Pod, nil); err != nil {
|
if err := k8s_api_v1.Convert_api_Pod_To_v1_Pod(newPod, v1Pod, nil); err != nil {
|
||||||
|
glog.Errorf("Pod %q failed to convert to v1", newPod.Name)
|
||||||
return true, nil, err
|
return true, nil, err
|
||||||
}
|
}
|
||||||
return true, v1Pod, nil
|
return true, v1Pod, nil
|
||||||
|
@ -25,11 +25,7 @@ import (
|
|||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/types"
|
"k8s.io/apimachinery/pkg/types"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
|
||||||
"k8s.io/client-go/tools/record"
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
|
||||||
k8s_api_v1 "k8s.io/kubernetes/pkg/api/v1"
|
|
||||||
"k8s.io/kubernetes/pkg/api/validation"
|
|
||||||
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/events"
|
"k8s.io/kubernetes/pkg/kubelet/events"
|
||||||
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
|
||||||
@ -323,34 +319,17 @@ func (s *podStorage) seenSources(sources ...string) bool {
|
|||||||
func filterInvalidPods(pods []*v1.Pod, source string, recorder record.EventRecorder) (filtered []*v1.Pod) {
|
func filterInvalidPods(pods []*v1.Pod, source string, recorder record.EventRecorder) (filtered []*v1.Pod) {
|
||||||
names := sets.String{}
|
names := sets.String{}
|
||||||
for i, pod := range pods {
|
for i, pod := range pods {
|
||||||
var errlist field.ErrorList
|
// Pods from each source are assumed to have passed validation individually.
|
||||||
// TODO: remove the conversion when validation is performed on versioned objects.
|
// This function only checks if there is any naming conflict.
|
||||||
internalPod := &api.Pod{}
|
|
||||||
if err := k8s_api_v1.Convert_v1_Pod_To_api_Pod(pod, internalPod, nil); err != nil {
|
|
||||||
glog.Warningf("Pod[%d] (%s) from %s failed to convert to v1, ignoring: %v", i+1, format.Pod(pod), source, err)
|
|
||||||
recorder.Eventf(pod, v1.EventTypeWarning, "FailedConversion", "Error converting pod %s from %s, ignoring: %v", format.Pod(pod), source, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if errs := validation.ValidatePod(internalPod); len(errs) != 0 {
|
|
||||||
errlist = append(errlist, errs...)
|
|
||||||
// If validation fails, don't trust it any further -
|
|
||||||
// even Name could be bad.
|
|
||||||
} else {
|
|
||||||
name := kubecontainer.GetPodFullName(pod)
|
name := kubecontainer.GetPodFullName(pod)
|
||||||
if names.Has(name) {
|
if names.Has(name) {
|
||||||
// TODO: when validation becomes versioned, this gets a bit
|
glog.Warningf("Pod[%d] (%s) from %s failed validation due to duplicate pod name %q, ignoring", i+1, format.Pod(pod), source, pod.Name)
|
||||||
// more complicated.
|
recorder.Eventf(pod, v1.EventTypeWarning, events.FailedValidation, "Error validating pod %s from %s due to duplicate pod name %q, ignoring", format.Pod(pod), source, pod.Name)
|
||||||
errlist = append(errlist, field.Duplicate(field.NewPath("metadata", "name"), pod.Name))
|
continue
|
||||||
} else {
|
} else {
|
||||||
names.Insert(name)
|
names.Insert(name)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if len(errlist) > 0 {
|
|
||||||
err := errlist.ToAggregate()
|
|
||||||
glog.Warningf("Pod[%d] (%s) from %s failed validation, ignoring: %v", i+1, format.Pod(pod), source, err)
|
|
||||||
recorder.Eventf(pod, v1.EventTypeWarning, events.FailedValidation, "Error validating pod %s from %s, ignoring: %v", format.Pod(pod), source, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
filtered = append(filtered, pod)
|
filtered = append(filtered, pod)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
@ -146,8 +146,10 @@ func TestNewPodAddedInvalidNamespace(t *testing.T) {
|
|||||||
// see an update
|
// see an update
|
||||||
podUpdate := CreatePodUpdate(kubetypes.ADD, TestSource, CreateValidPod("foo", ""))
|
podUpdate := CreatePodUpdate(kubetypes.ADD, TestSource, CreateValidPod("foo", ""))
|
||||||
channel <- podUpdate
|
channel <- podUpdate
|
||||||
|
expectPodUpdate(t, ch, CreatePodUpdate(kubetypes.ADD, TestSource, CreateValidPod("foo", "")))
|
||||||
|
|
||||||
config.Sync()
|
config.Sync()
|
||||||
expectPodUpdate(t, ch, CreatePodUpdate(kubetypes.SET, kubetypes.AllSource))
|
expectPodUpdate(t, ch, CreatePodUpdate(kubetypes.SET, kubetypes.AllSource, CreateValidPod("foo", "")))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewPodAddedDefaultNamespace(t *testing.T) {
|
func TestNewPodAddedDefaultNamespace(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user