在调试自制的operator时,发现了一个SetupWithManager这里会出现报错:
controller-runtime.eventhandler.enqueueRequestForOwner: Could not retrieve rest mapping ***
查阅多方debug日志一半让我检查新建的crd有没有被启用,一半的一半让我检查拼写有没有错误,其他的在怀疑我有没有老老实实跟着tutor走一遍或者模仿其他项目写过一遍。求问无果只好自己寻找panic,在苦苦寻找panic异常的位置后,终于让我发现了bug问题所在:
大家都知道,在SetupWithManager方法中,需要依次返回For(&v1.yourcontroller).Own(&v1.ownsresource).comlete(mgr)对象,此时kubebuilder会新建一个依赖关系,以达到创建operator时同时创建其所控制的资源,并给其metadata.ownerference字段初始化值,但在一开始创建operator时,我并没有在setupWithManager中添加Own字段,这意味着kubebuilder不会为controller创建的资源自动初始化ownerference字段,同时我使用的 newControllerRef方法自己指定的ownerference值,(注意这里要把blockOwnerDeletion值初始化为true,否则不会被finizer回收,这种方法在我仍然觉得其实是可以使用的,只不过没有继续完善,逻辑并不存在问题),在调试时就会出现调试生成的Ownference字段和自定义的ownerference字段出现冲突的问题,并不是报错信息所说无法找到crd资源,修改bug的方法也很简单,只需要去掉创建资源时自定义的ownerference字段然后保留SetupWithManager方法中Own方法即可完成operator的逻辑。
总结:读者在遇到以上报错时,不妨试试删除掉新建资源中的Ownerfence字段,在setupWithManager方法中添加需要被拥有的资源值,相信会对你有所帮助
以上均为笔者改bug期间经验总结,实际可能会因为开发环境、版本,代码逻辑,设计思路等问题出现不同,如有疑问,欢迎指正