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

Is there some kind of a lifecycle hook for Knative services?

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

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

时被调用

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

如果您想在服务器端执行此操作,而不是使用客户端脚本,您可能需要实现一个小型 Kubernetes 控制器。还有两个折中方案,各有优缺点。

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

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

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

  • 验证准入控制 运行 在删除发生之前 ,这意味着删除失败仍会删除 API 注册。此外,验证准入控制器是控制平面的一部分,一个失败的准入控制器会使管理对象变得困难。
  • Audit webhook 配置是 apiserver 上的全局标志设置,因此整个集群只能有一个 webhook,您需要手动为每个 apiserver 配置标志。

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

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

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