【问题标题】:Is there some kind of a lifecycle hook for Knative services?Knative 服务是否有某种生命周期挂钩?
【发布时间】:2021-06-18 21:07:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: kubernetes lifecycle knative


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2017-01-18
      • 2015-12-19
      相关资源
      最近更新 更多