我正在使用AKS和K8s golang API。
我正在创建一个Kubernetes观察器来监视
watchres, error := jobsClient.Watch(metav1.ListOptions{})
那之后,我进入了
这样的事件频道eventres := watchres.ResultChan()
之后,我使用
循环获取事件we := <-eventres
然后基于这些事件,我正在执行某些操作(例如,当kubernetes作业成功时删除资源)
我面临的问题是,一切似乎都工作正常,但是在一段时间后,观察者没有删除资源,但是作业成功了,这可能是问题所在,该频道是否超时?但是我不是暗中关闭频道。
答案 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
}
}
}