Я пытаюсь написать код, который ведет себя как
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
)?
вы пропустите случай по умолчанию в вашем коммутаторе?
@TusharMahajan Когда я добавляю флаг --watch
, использует ли kubernetes в фоновом режиме API event
?
@ mh-cbon Я так не думаю, это единственные типы событий
По-видимому, часы срабатывают при каждом изменении (сделанном в описании модуля), и я смотрел на 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, вы можете найти реализацию здесь.
kubectl get events выдаст вам все запущенные события, не так ли?