mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Merge pull request #53194 from dixudx/cleanup_kubelet_multiple_convert_validation
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. avoid kubelet converts and validates pods multiple times **What this PR does / why we need it**: **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes #53171 **Special notes for your reviewer**: /assign @yujuhong @caesarxuchao **Release note**: ```release-note None ```
This commit is contained in:
commit
4892b54c26
@ -47,7 +47,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",
|
||||||
|
@ -119,8 +119,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.
|
||||||
@ -128,11 +127,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{}
|
name := kubecontainer.GetPodFullName(pod)
|
||||||
if err := k8s_api_v1.Convert_v1_Pod_To_api_Pod(pod, internalPod, nil); err != nil {
|
if names.Has(name) {
|
||||||
glog.Warningf("Pod[%d] (%s) from %s failed to convert to v1, ignoring: %v", i+1, format.Pod(pod), source, err)
|
glog.Warningf("Pod[%d] (%s) from %s failed validation due to duplicate pod name %q, ignoring", i+1, format.Pod(pod), source, pod.Name)
|
||||||
recorder.Eventf(pod, v1.EventTypeWarning, "FailedConversion", "Error converting pod %s from %s, ignoring: %v", format.Pod(pod), source, err)
|
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)
|
||||||
continue
|
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 {
|
} else {
|
||||||
name := kubecontainer.GetPodFullName(pod)
|
names.Insert(name)
|
||||||
if names.Has(name) {
|
|
||||||
// TODO: when validation becomes versioned, this gets a bit
|
|
||||||
// more complicated.
|
|
||||||
errlist = append(errlist, field.Duplicate(field.NewPath("metadata", "name"), pod.Name))
|
|
||||||
} else {
|
|
||||||
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