mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-01 07:47:56 +00:00
Merge pull request #55316 from tnozicka/statefulset-report-event-on-pod-recreate
Automatic merge from submit-queue (batch tested with PRs 55316, 57934). 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>. Make StatefulSet report an event when recreating failed pod When StatefulSet finds any of its pods in phase Failed it will delete it and create it again. While doing so it will emit delete+create event which is really confusing for the user as he has no idea what's happening. Fixes https://github.com/kubernetes/kubernetes/issues/58082
This commit is contained in:
commit
87e2db8089
@ -101,6 +101,7 @@ func NewStatefulSetController(
|
|||||||
recorder),
|
recorder),
|
||||||
NewRealStatefulSetStatusUpdater(kubeClient, setInformer.Lister()),
|
NewRealStatefulSetStatusUpdater(kubeClient, setInformer.Lister()),
|
||||||
history.NewHistory(kubeClient, revInformer.Lister()),
|
history.NewHistory(kubeClient, revInformer.Lister()),
|
||||||
|
recorder,
|
||||||
),
|
),
|
||||||
pvcListerSynced: pvcInformer.Informer().HasSynced,
|
pvcListerSynced: pvcInformer.Informer().HasSynced,
|
||||||
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "statefulset"),
|
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "statefulset"),
|
||||||
|
@ -25,6 +25,7 @@ import (
|
|||||||
apps "k8s.io/api/apps/v1beta1"
|
apps "k8s.io/api/apps/v1beta1"
|
||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/kubernetes/pkg/controller/history"
|
"k8s.io/kubernetes/pkg/controller/history"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -53,14 +54,16 @@ type StatefulSetControlInterface interface {
|
|||||||
func NewDefaultStatefulSetControl(
|
func NewDefaultStatefulSetControl(
|
||||||
podControl StatefulPodControlInterface,
|
podControl StatefulPodControlInterface,
|
||||||
statusUpdater StatefulSetStatusUpdaterInterface,
|
statusUpdater StatefulSetStatusUpdaterInterface,
|
||||||
controllerHistory history.Interface) StatefulSetControlInterface {
|
controllerHistory history.Interface,
|
||||||
return &defaultStatefulSetControl{podControl, statusUpdater, controllerHistory}
|
recorder record.EventRecorder) StatefulSetControlInterface {
|
||||||
|
return &defaultStatefulSetControl{podControl, statusUpdater, controllerHistory, recorder}
|
||||||
}
|
}
|
||||||
|
|
||||||
type defaultStatefulSetControl struct {
|
type defaultStatefulSetControl struct {
|
||||||
podControl StatefulPodControlInterface
|
podControl StatefulPodControlInterface
|
||||||
statusUpdater StatefulSetStatusUpdaterInterface
|
statusUpdater StatefulSetStatusUpdaterInterface
|
||||||
controllerHistory history.Interface
|
controllerHistory history.Interface
|
||||||
|
recorder record.EventRecorder
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateStatefulSet executes the core logic loop for a stateful set, applying the predictable and
|
// UpdateStatefulSet executes the core logic loop for a stateful set, applying the predictable and
|
||||||
@ -367,7 +370,8 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet(
|
|||||||
for i := range replicas {
|
for i := range replicas {
|
||||||
// delete and recreate failed pods
|
// delete and recreate failed pods
|
||||||
if isFailed(replicas[i]) {
|
if isFailed(replicas[i]) {
|
||||||
glog.V(4).Infof("StatefulSet %s/%s is recreating failed Pod %s",
|
ssc.recorder.Eventf(set, v1.EventTypeWarning, "RecreatingFailedPod",
|
||||||
|
"StatefulSet %s/%s is recreating failed Pod %s",
|
||||||
set.Namespace,
|
set.Namespace,
|
||||||
set.Name,
|
set.Name,
|
||||||
replicas[i].Name)
|
replicas[i].Name)
|
||||||
|
@ -41,6 +41,7 @@ import (
|
|||||||
appslisters "k8s.io/client-go/listers/apps/v1beta1"
|
appslisters "k8s.io/client-go/listers/apps/v1beta1"
|
||||||
corelisters "k8s.io/client-go/listers/core/v1"
|
corelisters "k8s.io/client-go/listers/core/v1"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
|
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/controller/history"
|
"k8s.io/kubernetes/pkg/controller/history"
|
||||||
@ -52,7 +53,8 @@ func setupController(client clientset.Interface) (*fakeStatefulPodControl, *fake
|
|||||||
informerFactory := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc())
|
||||||
spc := newFakeStatefulPodControl(informerFactory.Core().V1().Pods(), informerFactory.Apps().V1beta1().StatefulSets())
|
spc := newFakeStatefulPodControl(informerFactory.Core().V1().Pods(), informerFactory.Apps().V1beta1().StatefulSets())
|
||||||
ssu := newFakeStatefulSetStatusUpdater(informerFactory.Apps().V1beta1().StatefulSets())
|
ssu := newFakeStatefulSetStatusUpdater(informerFactory.Apps().V1beta1().StatefulSets())
|
||||||
ssc := NewDefaultStatefulSetControl(spc, ssu, history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions()))
|
recorder := record.NewFakeRecorder(10)
|
||||||
|
ssc := NewDefaultStatefulSetControl(spc, ssu, history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions()), recorder)
|
||||||
|
|
||||||
stop := make(chan struct{})
|
stop := make(chan struct{})
|
||||||
informerFactory.Start(stop)
|
informerFactory.Start(stop)
|
||||||
@ -452,7 +454,8 @@ func TestStatefulSetControl_getSetRevisions(t *testing.T) {
|
|||||||
informerFactory := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc())
|
informerFactory := informers.NewSharedInformerFactory(client, controller.NoResyncPeriodFunc())
|
||||||
spc := newFakeStatefulPodControl(informerFactory.Core().V1().Pods(), informerFactory.Apps().V1beta1().StatefulSets())
|
spc := newFakeStatefulPodControl(informerFactory.Core().V1().Pods(), informerFactory.Apps().V1beta1().StatefulSets())
|
||||||
ssu := newFakeStatefulSetStatusUpdater(informerFactory.Apps().V1beta1().StatefulSets())
|
ssu := newFakeStatefulSetStatusUpdater(informerFactory.Apps().V1beta1().StatefulSets())
|
||||||
ssc := defaultStatefulSetControl{spc, ssu, history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions())}
|
recorder := record.NewFakeRecorder(10)
|
||||||
|
ssc := defaultStatefulSetControl{spc, ssu, history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions()), recorder}
|
||||||
|
|
||||||
stop := make(chan struct{})
|
stop := make(chan struct{})
|
||||||
defer close(stop)
|
defer close(stop)
|
||||||
|
@ -28,6 +28,7 @@ import (
|
|||||||
"k8s.io/client-go/informers"
|
"k8s.io/client-go/informers"
|
||||||
"k8s.io/client-go/kubernetes/fake"
|
"k8s.io/client-go/kubernetes/fake"
|
||||||
"k8s.io/client-go/tools/cache"
|
"k8s.io/client-go/tools/cache"
|
||||||
|
"k8s.io/client-go/tools/record"
|
||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/controller/history"
|
"k8s.io/kubernetes/pkg/controller/history"
|
||||||
)
|
)
|
||||||
@ -585,7 +586,8 @@ func newFakeStatefulSetController(initialObjects ...runtime.Object) (*StatefulSe
|
|||||||
ssh := history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions())
|
ssh := history.NewFakeHistory(informerFactory.Apps().V1beta1().ControllerRevisions())
|
||||||
ssc.podListerSynced = alwaysReady
|
ssc.podListerSynced = alwaysReady
|
||||||
ssc.setListerSynced = alwaysReady
|
ssc.setListerSynced = alwaysReady
|
||||||
ssc.control = NewDefaultStatefulSetControl(fpc, ssu, ssh)
|
recorder := record.NewFakeRecorder(10)
|
||||||
|
ssc.control = NewDefaultStatefulSetControl(fpc, ssu, ssh, recorder)
|
||||||
|
|
||||||
return ssc, fpc
|
return ssc, fpc
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user