Golang Timer

我们trm里面有个kube-system项目,由于是k8s的内置namespace,所以创建的时间比较早,在当时的情况下没有办法在cfe创建icagent的守护进程,所以以前没有默认开启平台监控这个功能。

然后有同事反应必须要开启,不然就不能做到日志转储,导致磁盘空间占满,于是我想到了一个办法,之所以没办法开启,是因为当时的条件创不出来,但是等到环境安装到一定进度后,有条件了就可以创建出来了。可以设计一个定时器,在创建这个项目的时候就开始创这个icagent ,每隔20秒创建一次,直到创建成功。

定时器设计如下:

 func CreateProject() {
	PresetProject() //创建kube-system
	go func() {
		isSucceed := false //设置标志位
		logger.info("start try to create icagent daemonset")
		for !isSucceed {
			err := createIcagent()
			if err == nil {
				isSucceed = true
				logger.info("create icagent daemonset succeed")
			}
			time.Sleep(20 * time.Second)
		}
	}()
	return
 }

一个很简单的定时器,用isSucceed作为标志位,如果是失败的就一直循环创建,一旦成功,就退出了这个goroutine。

除此之外,还可以使用以下两种方法来实现一个定时器:

    func main() {
	timer := time.NewTimer(time.Second)
	fmt.Println(<-timer.C)   //timer.Reset重置   timer.Stop 停止
    }
   fmt.Println(<-time.After(time.Second))

两种方法都是通过对channel的释放来达到定时的效果