似乎easy peasy如果我正在实现 Kubernetes CRD,则实现自定义终结器:代码片段非常简单,因为对象上的第一个删除请求为 metadata.deletionTimestamp
字段设置了一个值而不是删除触发自定义 Controller 监视该对象以执行它处理的任何终结器的对象。
但是,假设我想为默认 Kubernetes 资源(例如命名空间、部署或其他资源)设置自定义终结器:这可能吗?
最佳答案
好的,以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
如果我打开另一个终端,我可以看到资源处于正在终止
状态。
# 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 客户端)获取对象的更改(或 Dynamic Admission Controll 获取事件,以异步模式处理我的业务逻辑(如预删除钩子(Hook))并删除我的完全限定的 Finalizer...只是为了简单起见,我测试了使用 kubectl
删除它,并且它有效。
仅供引用,Finalizer 必须完全合格,因为有 validation过程,因此必须根据 prometherion/whatever_you_want
模式进行声明,注意第一部分必须遵守 DNS-1123
规范。
关于kubernetes - 为 Kubernetes 资源实现自定义 Finalizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57833831/