HAOJX

自定义controller如何重新拉起被删除的资源

字数统计: 309阅读时长: 1 min
2021/11/15 Share

当搞完controllerManager之后 builder.ControllerManagedBy(mgr) 就搞个监听 当删除的时候就调用删除函数

比如如下套路

1
2
3
4
5
6
7
builder.ControllerManagedBy(mgr).
For(&v1.DbConfig{}).
Watches(&source.Kind{Type: &appsv1.Deployment{}},
handler.Funcs{DeleteFunc: dbConfigController.OnDelete},).
Complete(controllers.NewDbConfigController());err!=nil{
mgr.GetLogger().Error(err,"unable to create manager")
os.Exit(1)

加个watches函数 , 然后配上handler.Funcs 里面搞个删除函数

删除函数是我们自己写的controller函数的方法 这个方法是指针方法

比如下面的OnDelete函数

1
2
3
4
5
6
7
8
9
10
11
func (d *DbConfigController) OnDelete(event event.DeleteEvent,limitingInterface workqueue.RateLimitingInterface)  {
for _, ref:= range event.Object.GetOwnerReferences(){
if ref.Kind=="DbConfig" && ref.APIVersion=="api.test.com/v1" {
limitingInterface.Add(
reconcile.Request{types.NamespacedName{
Name: ref.Name,
Namespace: event.Object.GetNamespace(),
}})
}
}
}

里面就是把event里面的 OwnerReference拿到 因为这个OwnerReferences是个切片 所以可以range它, 我们就找他是不是和我们要删除的资源一样 , 是否等于我们要删除资源的KindAPIVersion 如果是的话 就把他扔到队列里面 这个队列里面的东西都是NamespaceName这种格式的, 我们通过reconcile函数拿到相关NameNamespace

这样手动删除的资源 就会再次触发reconcile 进入调谐状态中

CATALOG