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

pro*_*ion 5 kubernetes

如果我正在实现我的 Kubernetes CRD,那么实现自定义终结器似乎很容易:代码片段非常简单,因为对象上的第一个删除请求为该字段设置了一个值,而不是删除触发自定义控制器监视对象的对象执行它处理的任何终结器。metadata.deletionTimestamp

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

pro*_*ion 5

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
Run Code Online (Sandbox Code Playgroud)

如果我打开另一个终端,我可以看到资源的Terminating状态。

# k get ns my-namespace
NAME           STATUS        AGE
my-namespace   Terminating   6m8s
Run Code Online (Sandbox Code Playgroud)

所以,实际上资源被标记为删除,因为我得到了deletionTimestamp

k get ns my-namespace -o jsonpath='{.metadata.deletionTimestamp}'
2019-09-08T06:58:07
Run Code Online (Sandbox Code Playgroud)

要完成删除,我只需要一个简单的Watch(使用 Kubernetes Go 客户端)来获取对象的更改(或动态准入控制来获取事件,以异步模式处理我的业务逻辑(如预删除钩子)并删除我的完全合格的终结器...只是为了简单起见,我测试了删除它并且kubectl它有效。

仅供参考,由于有验证过程, Finalizer必须完全合格,因此必须根据模式进行声明,注意第一部分必须遵守规范。prometherion/whatever_you_wantDNS-1123