为Kubernetes资源实现自定义的终结器

时间:2019-09-07 12:47:17

标签: kubernetes

如果我要实现自己的Kubernetes CRD,似乎easy peasy可以实现自定义 finalizers :代码段非常简单,因为对对象的第一个删除请求为{{ 1}}字段,而不是删除触发自定义控制器监视该对象执行其处理的终结器的对象。

但是,让我们想象一下,我想为默认的Kubernetes资源(如命名空间,部署或其他)设置自定义终结器:这可能吗?

1 个答案:

答案 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规范。