观看k8s golang api手表并获取事件,但一段时间后没有任何事件

时间:2018-07-18 10:15:33

标签: go kubernetes

我正在使用AKS和K8s golang API。

我正在创建一个Kubernetes观察器来监视

watchres, error := jobsClient.Watch(metav1.ListOptions{})

那之后,我进入了

这样的事件频道
eventres := watchres.ResultChan()

之后,我使用

循环获取事件
we := <-eventres

然后基于这些事件,我正在执行某些操作(例如,当kubernetes作业成功时删除资源)

我面临的问题是,一切似乎都工作正常,但是在一段时间后,观察者没有删除资源,但是作业成功了,这可能是问题所在,该频道是否超时?但是我不是暗中关闭频道。

2 个答案:

答案 0 :(得分:1)

手表上有默认超时时间。我相信它将设置为30分钟。

您可以在ListOptions中覆盖此值。因此,例如,将超时设置为一个小时:

timeout := int64(3600)
watchres, error := jobsClient.Watch(metav1.ListOptions{
    TimeoutSeconds: &timeout,
})

答案 1 :(得分:0)

正如我在之前的评论中所说,我没有让K8沿通道向我提供更多事件,但实际上并没有像超时那样挂断。

所以我在这里使用select制定了一些建议-想法是等待事件,但是每30分钟重新启动观察程序,以防K8挂断。到目前为止,这是可行的:

func watchEvents() {
    for {
        if err := RunLoop(); err != nil {
            log.Error(err)
        }
        time.Sleep(5 * time.Second)
    }
}

func runLoop() error {
    watcher, err := clientset.EventsV1beta1().Events("").Watch(metav1.ListOptions{})
    if err != nil {
        return err
    }
    ch := watcher.ResultChan()
    for {
        select {
        case event, ok := <-ch:
            if !ok {
                // the channel got closed, so we need to restart
                log.Info("Kubernetes hung up on us, restarting event watcher")
                return nil
            }

            // handle the event

        case <-time.After(30 * time.Minute):
            // deal with the issue where we get no events
            log.Infof("Timeout, restarting event watcher")
            return nil
        }
    }
}