如果我要实现自己的Kubernetes CRD,似乎easy peasy可以实现自定义 finalizers :代码段非常简单,因为对对象的第一个删除请求为{{ 1}}字段,而不是删除触发自定义控制器监视该对象执行其处理的终结器的对象。
但是,让我们想象一下,我想为默认的Kubernetes资源(如命名空间,部署或其他)设置自定义终结器:这可能吗?
答案 0 :(得分:2)
好,以Namespace
为例进行了测试。
# k create ns my-namespace
namespace/my-namespace created
# k edit ns my-namespace
(... adding the .metadata.finalizers list)
# k get ns my-namespace -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2019-09-08T06:50:25Z"
finalizers:
- prometherion/do-something
name: my-namespace
resourceVersion: "1131"
selfLink: /api/v1/namespaces/my-namespace
uid: 75b5bae8-1d5b-44c6-86bc-e632341aabfd
spec:
finalizers:
- kubernetes
status:
phase: Active
# k delete ns my-namespace
namespace "my-namespace" deleted
如果打开另一个终端,则可以看到资源处于Terminating
状态。
# k get ns my-namespace
NAME STATUS AGE
my-namespace Terminating 6m8s
因此,实际上,由于我得到了deletionTimestamp
,该资源被标记为要删除:
k get ns my-namespace -o jsonpath='{.metadata.deletionTimestamp}'
2019-09-08T06:58:07
要完成删除,我只需要一个简单的Watch(使用Kubernetes Go Client)即可获取对象的更改(或Dynamic Admission Controll来获取事件,在异步模式(如pre delete钩子)并删除我完全合格的Finalizer ...只是为了简单起见,我测试了用kubectl
删除它,并且它起作用了。
仅供参考,由于有validation流程,因此 Finalizer 必须完全合格,因此必须根据模式prometherion/whatever_you_want
进行声明,请注意第一部分遵守DNS-1123
规范。