Следите за всеми изменениями в статусе модуля

Я пытаюсь написать код, который ведет себя как kubectl get pods --watch. Таким образом, я срабатываю каждый раз, когда изменяется статус модуля.

Я создал проект go (который работает в кластере) и добавил следующий код:

podsWatcher, err := restAPIClient.CoreV1().Pods("").Watch(globalHTTPContext, metav1.ListOptions{Watch: true})
if err != nil {
    // do something
}
podsChan := podsWatcher.ResultChan()
for event := range podsChan {
    switch event.Type {
    case watch.Added:
        // do something
    case watch.Modified:
        // do something
    case watch.Deleted:
        // do something
    case watch.Bookmark:
        // do something
    case watch.Error:
        // do something
    }
}

Я получаю событие каждый раз, когда вношу серьезные изменения в модуль, но не для всех событий. (события).

Как я могу получить триггер каждого изменения, произошедшего в статусе модулей (например, флаг --watch)?

kubectl get events выдаст вам все запущенные события, не так ли?

Tushar Mahajan 10.12.2020 09:13

вы пропустите случай по умолчанию в вашем коммутаторе?

user4466350 10.12.2020 09:20

@TusharMahajan Когда я добавляю флаг --watch, использует ли kubernetes в фоновом режиме API event?

David Wer 10.12.2020 09:45

@ mh-cbon Я так не думаю, это единственные типы событий

David Wer 10.12.2020 09:46
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
4
4 804
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По-видимому, часы срабатывают при каждом изменении (сделанном в описании модуля), и я смотрел на pod.status.phase вместо того, чтобы смотреть на pod.Status.ContainerStatuses, поэтому я думал, что не получаю каждое событие.

Я добавил функцию, которая будет обрабатывать события следующим образом:

// get ContainerStatuses. If there is no containerStatus, return the pod phase
func getPodStatus(pod *core.Pod) string {
    containerStatuses := pod.Status.ContainerStatuses
    status := ""
    if len(containerStatuses) > 0 {
        for i := range containerStatuses {
            if containerStatuses[i].State.Terminated != nil {
                status = containerStatuses[i].State.Terminated.Reason
            }
            if containerStatuses[i].State.Waiting != nil {
                status = containerStatuses[i].State.Waiting.Reason
            }
            if containerStatuses[i].State.Running != nil {
                if status == "" { // if none of the containers report an error
                    status = "Running"
                }
            }
        }
    }
    if status == "" {
        status = string(pod.Status.Phase)
    }
    return status
}

// PodWatch watch pod changes in all namespaces
func PodWatch() error {
    podsWatcher, err := restAPIClient.CoreV1().Pods("").Watch(globalHTTPContext, metav1.ListOptions{Watch: true})
    if err != nil {
        return err
    }
    podsChan := podsWatcher.ResultChan()
    for event := range podsChan {
        pod, err := event.Object.(*core.Pod)
        if err != nil {
            return err
        }
        switch event.Type {
        case watch.Added:
            fmt.Println(getPodStatus(pod))
        case watch.Modified:
            fmt.Println(getPodStatus(pod))
        case watch.Deleted:
            fmt.Println(getPodStatus(pod))
        case watch.Bookmark:
            fmt.Println(getPodStatus(pod))
        case watch.Error:
            fmt.Println(getPodStatus(pod))
        }
    }
}

Это решение соответствует моим потребностям, если вы хотите реализовать --watch как kubectl, вы можете найти реализацию здесь.

Другие вопросы по теме