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

时间:2020-03-11 06:29:07

标签: go kubernetes client-go

我的方法是:

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被删除。因此Get pod方法返回具有运行状态的pod。如果我在删除Pod后使用sleep了几秒钟,那么它可以正常工作。没有使用sleep的方法还有什么更好的方法吗?

1 个答案:

答案 0 :(得分:2)

每个对象的元数据中都有一个称为a = e = r = 0 s = [[a, 1, 2, 3], [2], [e, 4], [r]] results = [sub_list for sub_list in s if len(sub_list) > 1] print(results) 的字段中的UUID。您可以比较并等待,直到Pod就绪 并具有不同的UUID。有关更多详细信息,请参见https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids(尽管实际上这就是所有要说的)。