为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
汪汪一只猫 2023-08-14 17:35:31
我的做法是: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?
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

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

查看完整回答
反对 回复 2023-08-14
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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

    })

}


查看完整回答
反对 回复 2023-08-14
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信