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

mklgxw1f  于 2023-03-12  发布在  Kubernetes
关注(0)|答案(2)|浏览(140)

如果我正在实现我的Kubernetes CRD,easy peasy似乎实现了自定义 * 终结器 *:代码片段相当简单,因为对象上的第一个删除请求设置metadata.deletionTimestamp字段的值,而不是删除触发监视对象的定制控制器执行其处理的任何终结器的对象。
然而,让我们想象一下,我想为一个默认的Kubernetes资源设置一个 * 自定义终结器 *,比如名称空间、部署或其他:这可能吗?

jaql4c8m

jaql4c8m1#

好的,以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来获取事件,以异步模式处理业务逻辑(类似于删除前钩子)并删除完全限定的Finalizer...为了简单起见,我用kubectl测试了删除操作,结果成功了。
仅供参考,Finalizer 必须是完全限定的,因为有一个验证过程,所以它必须根据模式prometherion/whatever_you_want声明,注意第一部分必须遵守DNS-1123规范。

efzxgjgh

efzxgjgh2#

完全删除需要一些时间,因为存在终结器

相关问题