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

8

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

然而,假设我想为默认的Kubernetes资源(如Namespace、Deployment或其他)设置自定义finalizer:这是否可能?


是的,这是可能的。您尝试过什么具体的东西没有起作用吗? - Amit Kumar Gupta
1个回答

5

好的,以命名空间为例进行了一些测试。

# 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 Client)来获取对象的更改(或者使用Dynamic Admission Controll 来获取事件,在异步模式下处理我的业务逻辑(如预删除挂钩),并删除我的完全限定Finalizer...仅为简单起见,我使用kubectl测试删除它并且它起作用了。

仅供参考,由于有一验证过程,因此必须完全限定Finalizer,因此必须根据模式prometherion / whatever_you_want声明它,注意第一部分必须符合DNS-1123 规范。


这里是与Kubernetes中终止器验证相关的具体代码:https://github.com/kubernetes/kubernetes/blob/13e3904f0f5149299f183c097e9a0970f18c0fd2/staging/src/k8s.io/apimachinery/pkg/util/validation/validation.go#L42 - vadasambar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接