Skip to content

Commit

Permalink
check both sts name and UID when handling pod deletion (kubeovn#4238)
Browse files Browse the repository at this point in the history
Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
  • Loading branch information
zhangzujian committed Jul 2, 2024
1 parent 35563ed commit 217ea26
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 20 deletions.
4 changes: 2 additions & 2 deletions pkg/controller/gc.go
Original file line number Diff line number Diff line change
Expand Up @@ -314,8 +314,8 @@ func (c *Controller) markAndCleanLSP() error {
}
ipMap := strset.NewWithSize(len(pods) + len(nodes))
for _, pod := range pods {
if isStsPod, sts := isStatefulSetPod(pod); isStsPod {
if isStatefulSetPodToDel(c.config.KubeClient, pod, sts) {
if isStsPod, stsName, stsUID := isStatefulSetPod(pod); isStsPod {
if isStatefulSetPodToDel(c.config.KubeClient, pod, stsName, stsUID) {
continue
}
} else if !isPodAlive(pod) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ func (c *Controller) InitIPAM() error {
}

isAlive := isPodAlive(pod)
isStsPod, _ := isStatefulSetPod(pod)
isStsPod, _, _ := isStatefulSetPod(pod)
if !isAlive && !isStsPod {
continue
}
Expand Down
34 changes: 17 additions & 17 deletions pkg/controller/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,10 @@ func (c *Controller) enqueueAddPod(obj interface{}) {
}

if !isPodAlive(p) {
isStateful, statefulSetName := isStatefulSetPod(p)
isStateful, statefulSetName, statefulSetUID := isStatefulSetPod(p)
isVMPod, vmName := isVMPod(p)
if isStateful || (isVMPod && c.config.EnableKeepVMIP) {
if isStateful && isStatefulSetPodToDel(c.config.KubeClient, p, statefulSetName) {
if isStateful && isStatefulSetPodToDel(c.config.KubeClient, p, statefulSetName, statefulSetUID) {
klog.V(3).Infof("enqueue delete pod %s", key)
c.deletingPodObjMap.Store(key, p)
c.deletePodQueue.Add(key)
Expand Down Expand Up @@ -296,7 +296,7 @@ func (c *Controller) enqueueUpdatePod(oldObj, newObj interface{}) {
return
}

isStateful, statefulSetName := isStatefulSetPod(newPod)
isStateful, statefulSetName, statefulSetUID := isStatefulSetPod(newPod)
isVMPod, vmName := isVMPod(newPod)
if !isPodStatusPhaseAlive(newPod) && !isStateful && !isVMPod {
klog.V(3).Infof("enqueue delete pod %s", key)
Expand Down Expand Up @@ -327,7 +327,7 @@ func (c *Controller) enqueueUpdatePod(oldObj, newObj interface{}) {
}

// do not delete statefulset pod unless ownerReferences is deleted
if isStateful && isStatefulSetPodToDel(c.config.KubeClient, newPod, statefulSetName) {
if isStateful && isStatefulSetPodToDel(c.config.KubeClient, newPod, statefulSetName, statefulSetUID) {
go func() {
klog.V(3).Infof("enqueue delete pod %s after %v", key, delay)
c.deletingPodObjMap.Store(key, newPod)
Expand Down Expand Up @@ -915,9 +915,9 @@ func (c *Controller) handleDeletePod(key string) error {
podKey := fmt.Sprintf("%s/%s", pod.Namespace, podName)

var keepIPCR bool
if ok, sts := isStatefulSetPod(pod); ok {
toDel := isStatefulSetPodToDel(c.config.KubeClient, pod, sts)
isDelete, err := appendCheckPodToDel(c, pod, sts, "StatefulSet")
if ok, stsName, stsUID := isStatefulSetPod(pod); ok {
toDel := isStatefulSetPodToDel(c.config.KubeClient, pod, stsName, stsUID)
isDelete, err := appendCheckPodToDel(c, pod, stsName, "StatefulSet")
if pod.DeletionTimestamp != nil {
// triggered by delete event
if !(toDel || (isDelete && err == nil)) {
Expand Down Expand Up @@ -1182,20 +1182,20 @@ func (c *Controller) syncKubeOvnNet(cachedPod, pod *v1.Pod, podNets []*kubeovnNe
return patchedPod.DeepCopy(), nil
}

func isStatefulSetPod(pod *v1.Pod) (bool, string) {
func isStatefulSetPod(pod *v1.Pod) (bool, string, types.UID) {
for _, owner := range pod.OwnerReferences {
if owner.Kind == "StatefulSet" && strings.HasPrefix(owner.APIVersion, "apps/") {
if strings.HasPrefix(pod.Name, owner.Name) {
return true, owner.Name
return true, owner.Name, owner.UID
}
}
}
return false, ""
return false, "", ""
}

func isStatefulSetPodToDel(c kubernetes.Interface, pod *v1.Pod, statefulSetName string) bool {
func isStatefulSetPodToDel(c kubernetes.Interface, pod *v1.Pod, statefulSetName string, statefulSetUID types.UID) bool {
// only delete statefulset pod lsp when statefulset deleted or down scaled
ss, err := c.AppsV1().StatefulSets(pod.Namespace).Get(context.Background(), statefulSetName, metav1.GetOptions{})
sts, err := c.AppsV1().StatefulSets(pod.Namespace).Get(context.Background(), statefulSetName, metav1.GetOptions{})
if err != nil {
// statefulset is deleted
if k8serrors.IsNotFound(err) {
Expand All @@ -1205,8 +1205,8 @@ func isStatefulSetPodToDel(c kubernetes.Interface, pod *v1.Pod, statefulSetName
return false
}

// statefulset is deleting
if ss.DeletionTimestamp != nil {
// statefulset is being deleted, or it's a newly created one
if sts.DeletionTimestamp != nil || sts.UID != statefulSetUID {
return true
}

Expand All @@ -1219,7 +1219,7 @@ func isStatefulSetPodToDel(c kubernetes.Interface, pod *v1.Pod, statefulSetName
return false
}
// down scaled
return index >= int64(*ss.Spec.Replicas)
return index >= int64(*sts.Spec.Replicas)
}

func getNodeTunlIP(node *v1.Node) ([]net.IP, error) {
Expand Down Expand Up @@ -1535,7 +1535,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
key := fmt.Sprintf("%s/%s", pod.Namespace, podName)

var checkVMPod bool
isStsPod, _ := isStatefulSetPod(pod)
isStsPod, _, _ := isStatefulSetPod(pod)
// if pod has static vip
vipName := pod.Annotations[util.VipAnnotation]
if vipName != "" {
Expand Down Expand Up @@ -1914,7 +1914,7 @@ func (c *Controller) getNsAvailableSubnets(pod *v1.Pod, podNet *kubeovnNet) ([]*
}

func getPodType(pod *v1.Pod) string {
if ok, _ := isStatefulSetPod(pod); ok {
if ok, _, _ := isStatefulSetPod(pod); ok {
return "StatefulSet"
}

Expand Down

0 comments on commit 217ea26

Please sign in to comment.