From 200f8c5c3971df28dd7f85795277591e6c3af49d Mon Sep 17 00:00:00 2001 From: Dmitry Shulyak Date: Wed, 31 Aug 2016 14:41:10 +0300 Subject: [PATCH] Delete evicted pet If pet was evicted by kubelet - it will stuck in this state forever. By analogy to regular pod we need to re-create pet so that it will be re-scheduled to another node, so in order to re-create pet and preserve consitent naming we will delete it in petset controller and create after that. Change-Id: Ib98bf7f34b3f2ab1582b9de34b5f4c5f84cd5215 --- pkg/controller/petset/pet.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/pkg/controller/petset/pet.go b/pkg/controller/petset/pet.go index 65c4816bc9c..0ca7e69325b 100644 --- a/pkg/controller/petset/pet.go +++ b/pkg/controller/petset/pet.go @@ -96,7 +96,13 @@ func (p *petSyncer) Sync(pet *pcb) error { if err := p.SyncPVCs(pet); err != nil { return err } - if exists { + // if pet was evicted - we need to remove old one because of consistent naming + if exists && isEvicted(realPet.pod) { + glog.V(4).Infof("Delete evicted pod %v", realPet.pod.Name) + if err := p.petClient.Delete(realPet); err != nil { + return err + } + } else if exists { if !p.isHealthy(realPet.pod) { glog.Infof("PetSet %v waiting on unhealthy pet %v", pet.parent.Name, realPet.pod.Name) } @@ -311,3 +317,7 @@ func (d *defaultPetHealthChecker) isHealthy(pod *api.Pod) bool { func (d *defaultPetHealthChecker) isDying(pod *api.Pod) bool { return pod != nil && pod.DeletionTimestamp != nil } + +func isEvicted(pod *api.Pod) bool { + return pod != nil && pod.Status.Phase == api.PodFailed && pod.Status.Reason == "Evicted" +}