繁体   English   中英

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

[英]How can I restart a specific Pod of a StatefulSet using 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 方法返回运行 state 的 pod。如果我在 pod 删除后使用sleep几秒钟,那么它工作正常。 有没有更好的方法可以在不使用sleep的情况下做到这一点?

在每个对象的元数据中,在名为uid的字段中都有一个 UUID。 您可以比较并等待 Pod 就绪具有不同的 UUID。 有关更多详细信息,请参阅https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids (尽管实际上仅此而已)。

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 state
func 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
    })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM