如何使用 client-go 重启 StatefulSet 的特定 Pod?

我的做法是:


func restartPod(meta metav1.ObjectMeta, kubeClient kubernetes.Interface) error {

    err := kubeClient.CoreV1().Pods(meta.Namespace).Delete(meta.Name, deleteInForeground())

    if err != nil {

        return err

    }


    //time.Sleep(2 * time.Second)

    return wait.PollImmediate(5*time.Second, 5*time.Minute, func() (done bool, err error) {

        pod, err := kubeClient.CoreV1().Pods(meta.Namespace).Get(meta.Name, metav1.GetOptions{})

        if err != nil {

            return false, nil

        }


        return pod.Status.Phase == v1.PodRunning && pod.Status.ContainerStatuses[0].Ready, nil

    })

}

它不起作用,因为 pod 的删除是非阻塞的,意味着它不会等待 pod 被删除。因此Getpod 方法返回处于运行状态的 pod。如果我sleep在 pod 删除后使用几秒钟,那么它就可以正常工作。有没有更好的方法来做到这一点而不使用sleep?


汪汪一只猫
浏览 176回答 2
2回答

尚方宝剑之说

在每个对象的元数据中,名为 的字段中都有 UUID uid。您可以进行比较并等待,直到 Pod 就绪并具有不同的 UUID。

ABOUTYOU

import corev1 "k8s.io/api/core/v1"// RestartPod deletes a pod marked by a given label// it then waits for a given timeout for the pod to resume running statefunc RestartPod(c *client.ClientSet, label string, timeout time.Duration) error {    pod, err := GetPodByLabel(label)    if err != nil {        return err    }    podUid := pod.UID    err = c.Pods(pod.Namespace).Delete(context.Background(), pod.Name, metav1.DeleteOptions{})    if err != nil {        return err    }    return wait.PollImmediate(5*time.Second, timeout, func() (done bool, err error) {        pod, err := GetPodByLabel(label)        if pod.UID != podUid && err != nil {            return false, nil        }        return pod.Status.Phase == corev1.PodRunning && pod.Status.ContainerStatuses[0].Ready, nil    })}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go