Knative 服务是否有某种生命周期挂钩?

问题描述

我面临这个问题:使用 Knative 服务部署的服务应在安装时向 API 网关注册(即 kn service create some-service ...),并在删除服务时取消注册(即 kn service delete some -服务)。

由于第一部分可以很容易地在服务代码的启动过程中实现,所以这不是问题。但是检测服务何时被完全删除,而不仅仅是缩减,似乎非常棘手。至少我找不到任何可行的解决方案。 Kubernetes 生命周期挂钩无法完成这项工作,因为它们会在 pod(而非服务)停止/终止时被调用

有谁知道如何拦截服务删除获取要执行的自定义命令?感谢您的帮助。

解决方法

如果您想在服务器端执行此操作,而不是使用客户端脚本,您可能需要实现一个小型 Kubernetes 控制器。还有两个半途而废的解决方案,每个都有一些权衡。

如果你实现了一个控制器,你基本上会有一个进程(Pod/StatefulSet,如果在 Kubernetes 上运行它),它对所有 Knative 服务执行 Watch。如果您愿意,它可以处理创建和删除方面,或者您可以保留当前的创建代码。

第二种选择是为每个服务添加一个 finalizer 并运行定期作业以查找具有 deletionTimestamp 和终结器集的所有服务。为了访问这些服务,作业可以使用 API 注册表取消注册服务,然后删除终结器。这类似于控制器方法,但不是持续运行的 Watch,终结器将删除延迟到清理作业运行。缺点是这意味着删除操作最多可能需要 N 分钟(作业运行的频率)。

最后一个选项是使用 validating admission webhookaudit webhook 来通知删除事件。每一个都有取舍:

  • 验证准入控制在删除发生之前运行,这意味着失败的删除仍然可以删除 API 注册。此外,验证准入控制器是控制平面的一部分,而一个失败的准入控制器可能会导致根本难以管理对象。
  • 审核 webhook 配置是 apiserver 上的全局标志设置,因此整个集群只能有一个 webhook,并且需要手动使用标志配置每个 apiserver。

想到的另外两个非控制器解决方案:

  1. 在 API 注册上添加“心跳”检查,其中包括拥有资源的 URL。如果注册有一个具有 URL 并且对象不再存在,则删除注册。这可能很容易实现。

  2. 您可以使用 apiserver source 在 Knative 服务上设置触发器。您将关注 dev.knative.apiserver.ref.deletedev.knative.apiserver.resource.delete 事件,并且可能有一个 Knative 服务(或其他 URL)处理这些 POST 并清理资源。不幸的是,我不确定网络上是否有这样的好例子。