kubernetes - 为 Kubernetes 资源实现自定义 Finalizer

标签 kubernetes

似乎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/

相关文章:

python - 在 Kubeflow 管道中共享 secret

go - 在 kubectl 插件中,提示输入?

kubernetes - 当位于不同的节点(EKS)上时,Pod不会相互通信

reactjs - React 无法访问我在 kubernetes 中的环境变量

docker - 无法建立连接,因为目标机器主动拒绝它。 "Kubernetes on Docker for Windows"

kubernetes - 创建时如何在Kubernetes节点上设置标签?

docker - 使用 kubernetes 和 jenkins 管理多 Pod 集成测试

kubernetes - 为什么 kubectl 不要求输入密码?

kubernetes - `kubectl top nodes` 在从节点上不起作用

amazon-web-services - Spring云数据流: Cannot run program "docker"