Как я могу перезапустить указанный c Pod StatefulSet, используя client- go? - PullRequest
1 голос
/ 11 марта 2020

Мой подход такой:

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

Он не работает, потому что удаление модуля неблокируется, это означает, что он не ожидает удаления модуля. Таким образом, метод Get pod возвращает модуль с состоянием выполнения. Если я использую sleep в течение нескольких секунд после удаления модуля, то он работает нормально. Есть ли лучший способ сделать это без использования sleep?

1 Ответ

2 голосов
/ 11 марта 2020

В метаданных каждого объекта есть UUID в поле с именем uid. Вы можете сравнить и подождать, пока модуль не будет готов , а имеет другой UUID. См. https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids для получения более подробной информации (хотя на самом деле это все, что можно сказать).

...