如何使用 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 方法 returns 具有 运行 状态的 pod。如果我在 pod 删除后使用 sleep
几秒钟,那么它就可以正常工作。有没有更好的方法可以不使用 sleep
?
在每个对象的元数据中,一个名为 uid
的字段中都有一个 UUID。您可以比较并等到 pod 就绪 和 具有不同的 UUID。有关更多详细信息,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids(尽管这就是所有要说的)。
我的做法是:
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 方法 returns 具有 运行 状态的 pod。如果我在 pod 删除后使用 sleep
几秒钟,那么它就可以正常工作。有没有更好的方法可以不使用 sleep
?
在每个对象的元数据中,一个名为 uid
的字段中都有一个 UUID。您可以比较并等到 pod 就绪 和 具有不同的 UUID。有关更多详细信息,请参阅 https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids(尽管这就是所有要说的)。