如何使用 Operator SDK 正确垃圾回收对象?

问题描述

用于 Kubernetes Operators 的 Operator-SDK 有一个 ctrl.SetControllerReference() 函数,该函数声称它可以在删除管理自定义资源时自动启用垃圾收集对象。

有时它似乎没有删除任何内容。我做错了什么?

解决方法

ctrl.SetControllerReference() 仅更改本地对象的 metadata.ownerReferences

它不会自动为您调用 reconciler.Update()。 因此,更改从未保留,Owner 也从未更改。

创建对象的正确方法是在调用ctrl.SetControllerReference()之前先调用reconciler.Create(),例如

if err := ctrl.SetControllerReference(mycrd,secret,r.Scheme); err != nil {
    log.Error(err,"Failed to set controller reference")
    return err
}

log.Info("Creating a new Secret","Secret.Namespace",secret.Namespace,"Secret.Name",secret.Name)
if err = r.Create(ctx,secret); err != nil {
    log.Error(err,"Failed to create new Secret",secret.Name)
    return err
}