kubernetes-finalizer

finalizer介绍

介绍1:
Finalizers 允许 Operator 控制器实现异步的 pre-delete hook。比如你给 API 类型中的每个对象都创建了对应的外部资源,你希望在 k8s 删除对应资源时同时删除关联的外部资源,那么可以通过 Finalizers 来实现。

Finalizers 是由字符串组成的列表,当 Finalizers 字段存在时,相关资源不允许被强制删除。存在 Finalizers 字段的的资源对象接收的第一个删除请求设置 metadata.deletionTimestamp 字段的值, 但不删除具体资源,在该字段设置后, finalizer 列表中的对象只能被删除,不能做其他操作。

当 metadata.deletionTimestamp 字段非空时,controller watch 对象并执行对应 finalizers 的动作,当所有动作执行完后,需要清空 finalizers ,之后 k8s 会删除真正想要删除的资源。

介绍2:
k8s资源中ObjectMeta.DeletionTimestamp 和 DemoMicroService.ObjectMeta.Finalizers 这两个元信息。前者表示删除该资源的这一行为的具体发生时间,如果不为0则表示删除资源的指令已经下达;而后者表示在真正删除 资源之前,,还有哪些逻辑没有被执行,如果 Finalizers 不为空,那么该资源则不会真正消失。

举个栗子:
有时候我们再删除某个资源时,该资源一直处于Terminating状态,即使加上了–force --grance-period=0之后仍然删不掉,这时可以去edit该资源文件,将finalizer配置项置为空,即可删除。

operator中finalizer使用

此处引用阿里云的部分代码做一个介绍。
git地址:https://github.com/l4wei/kubebuilder-example/

dms为自定义的crd资源。
finalizer为字符串常量。
demoMicroServiceFinalizer string = “demomicroservice.finalizers.devops.my.domain”
在这里插入图片描述
61行 先判断删除指令有没有下发,如果为空则没有,需要确保该资源的finalizer值不为空,然后更新该资源。

75行 删除不为空,则代表删除指令已经下发,判断finalizer值已经清空了,则删掉在cleanDeployment方法中删除关联的资源,如果没有删除,则执行清空的finalizer的操作。