Make StatefulSet report an event when recreating failed pod

This commit is contained in:
Tomas Nozicka 2017-11-09 12:23:37 +01:00
parent 33f873dbbe
commit f6af1904cd
4 changed files with 16 additions and 6 deletions

View File

@ -99,6 +99,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"),

View File

@ -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)

View File

@ -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)

View File

@ -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
} }