目前这个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 }
00
相似问题