我面临的问题是:使用Knative服务部署的服务在安装时应在API网关注册(即,kn-service create some-service…(,在删除服务时取消注册(即:kn-service-delete some-service(。
由于第一部分可以很容易地在服务代码的启动过程中实现,所以这不是问题。但是,检测服务何时被完全删除,而不仅仅是缩小规模,似乎非常棘手。至少我找不到任何可行的解决方案。Kubernetes生命周期挂钩不起作用,因为它们是在pod(而不是服务(停止/终止时调用的。
有人知道如何拦截服务删除以执行自定义命令吗?谢谢你的帮助。
如果您想在服务器端执行此操作,而不是使用客户端脚本,您可能需要实现一个小型Kubernetes控制器。还有两种折中的解决方案,每种方案都有一些取舍。
如果你实现了一个控制器,你基本上只有一个进程(如果在Kubernetes上运行Pod/StatefulSet(,它对所有Knative服务执行监视。如果您愿意,它可以同时处理创建和删除方面,或者您可以保留当前的创建代码。
第二个选项是为每个服务添加一个终结器,并运行一个定期作业来查找具有deletionTimestamp
和终结器集的所有服务。为了访问这些服务,作业可以使用API注册表注销服务,然后删除终结器。这与控制器方法类似,但终结器不是持续运行Watch,而是将删除延迟到清理作业运行。缺点是,这意味着删除可能需要长达N分钟(作业运行的频率(。
最后一种选择是使用验证准入webhook或审计webhook来通知删除事件。每一种都有取舍:
- 在删除发生之前运行验证准入控制,这意味着失败的删除仍可能删除API注册。此外,验证准入控制器是控制平面的一部分,失败的准入控制器可能会使管理对象变得困难
- 审核webhook配置是apiserver上的全局标志设置,因此整个集群只能有一个webhook,并且需要手动为每个apiserver配置标志
脑海中浮现的另外两个非控制器解决方案:
-
添加一个";心跳;检查API注册,该注册包括具有资源的URL。如果注册有一个具有URL的对象,并且该对象已不存在,请删除该注册。这可能很容易实现。
-
您可以使用apiserver源在Knative Services上设置触发器。您将关注
dev.knative.apiserver.ref.delete
或dev.knative.apiserver.resource.delete
事件,并且可以让单个Knative Service(或其他URL(处理这些POST并清理资源。不幸的是,我不确定网络上是否有这样的好例子。