目前这个CRD在部署上去后是不是不能停止?

来源:18-11 Databack Operator Makefile方式发布

404_

2024-11-14

在部署了crd之后。执行 kubectl apply -f _v1beta1_databack.yaml 程序就每隔一段时间 就执行一次。
但是 当执行了 kubectl delete -f _v1beta1_databack.yaml 之后,日志会报错。

提交之后,正常的每分钟执行一次的日志
2024-11-14T10:07:14.816Z	info	controllers/databack_controller.go:171	开始执行备份任务
2024-11-14T10:07:15.822Z	info	controllers/databack_controller.go:180	databack-sample 将在 1分钟后再次执行
2024-11-14T10:08:14.816Z	info	controllers/databack_controller.go:171	开始执行备份任务
2024-11-14T10:08:15.824Z	info	controllers/databack_controller.go:180	databack-sample 将在 1分钟后再次执行
2024-11-14T10:09:14.818Z	info	controllers/databack_controller.go:171	开始执行备份任务
2024-11-14T10:09:15.825Z	info	controllers/databack_controller.go:180	databack-sample 将在 1分钟后再次执行


这是在 kubectl delete -f _v1beta1_databack.yaml 之后 发现日志还在刷新
2024-11-14T10:10:02.264Z	info	controllers/databack_controller.go:93	databack-sample 停止
2024-11-14T10:10:02.264Z	info	controllers/databack_controller.go:155	databack-sample 将在 10000000000 秒后执行
2024-11-14T10:10:02.264Z	error	controllers/databack_controller.go:239	Databack.operator.kubeimooc.com "databack-sample" not found
kubeimooc.com/databack-operator/controllers.(*DatabackReconciler).UpdateStatus
	/workspace/controllers/databack_controller.go:239
kubeimooc.com/databack-operator/controllers.(*DatabackReconciler).RunLoop
	/workspace/controllers/databack_controller.go:160
2024-11-14T10:10:12.265Z	info	controllers/databack_controller.go:171	开始执行备份任务
2024-11-14T10:10:13.266Z	error	controllers/databack_controller.go:239	Databack.operator.kubeimooc.com "databack-sample" not found
kubeimooc.com/databack-operator/controllers.(*DatabackReconciler).UpdateStatus
	/workspace/controllers/databack_controller.go:239
kubeimooc.com/databack-operator/controllers.(*DatabackReconciler).RunLoop.func1
	/workspace/controllers/databack_controller.go:179
2024-11-14T10:10:13.266Z	info	controllers/databack_controller.go:180	databack-sample 将在 1分钟后再次执行
写回答

1回答

404_

提问者

2024-11-14

以解决,原因是 r.DeleteQueue(databackK8s),我传入了一个我们自定义的对象。但是在kubectl delete 之后,这个对象就没了。所以在DeleteQueue的时候,并不能删除map中对应的k-v对。

但是RunLoop()中的逻辑呢,又要遍历这个字典,所以便利到这个已经删除的对象的时候,就报错了

func (r *DatabackReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
	_ = log.FromContext(ctx)
	//第一步:检查我们自定义的资源Databack,是否存在?
	var databackK8s operatorkubeimooccomv1beta1.Databack
	err := r.Client.Get(ctx, req.NamespacedName, &databackK8s)
	if err != nil {
		// 如果 不存在 这个资源 ,则直接返回
		if errors.IsNotFound(err) {
			logger.Sugar().Infof("%s 停止", req.Name)
			//r.DeleteQueue(databackK8s)  
			r.DeleteQueue(req.Name)
			return ctrl.Result{}, nil
		}
		// 如果是这个资源,但是获取资源时报错了,则返回错误(打印日志)
		logger.Sugar().Infof("%s 异常 %v", req.Name, err)
		return ctrl.Result{}, err
	}

	// 第二步:拿到我们要的资源,并执行逻辑

	// 进一步检查,从k8s拿到的资源,和我们放到map中的资源是否相等。(防止重复提交)如果相等,则直接返回
	if lastDataback, ok := r.BackupQueue[req.Name]; ok {
		isEqual := reflect.DeepEqual(lastDataback.Spec, databackK8s.Spec)
		if isEqual {
			return ctrl.Result{}, err
		}
	}
	// 队列里面并没有我们新建的对象,则添加到队列中
	r.AddQueue(databackK8s)
	return ctrl.Result{}, nil
}


0
0

Kubernetes系统精讲 Go语言实战K8S集群可视化

核心知识+高阶应用+原理剖析+二次开发 全方位打通K8S生产实践

399 学习 · 265 问题

查看课程