websocket kubernetes -将pod生命周期绑定到用户连接

vvppvyoh  于 12个月前  发布在  Kubernetes
关注(0)|答案(2)|浏览(133)

我的用例

我正在尝试使用kubernetes按需服务一个容器化的应用程序。
按需,我的意思是有一个外部应用程序客户端显示数据集列表。所需的功能是,经过身份验证的用户可以 * 打开 * 数据集。打开一个数据集意味着在后台启动一个新的应用程序示例,该应用程序将读取作为参数传递的数据集。然后暴露它,设置一个入口并返回一个唯一的URL供用户访问。
对于资源管理,示例应该在用户请求时运行,并在不再需要时终止。第一个用户关闭窗口或最长生存时间为x小时。

当前阶段

  • 示例使用kubernetes(python)客户端API启动。
  • 一个示例是一个部署(副本1),一个服务和一个入口(nginx-ingress-controller)。
  • 无国籍:dataset和appdata来自s3 bucket。身份验证和路由被委托给入口/代理。

服务要求得到满足。用户可以访问url、进行身份验证、使用应用程序的功能等。
挑战
现在是生命周期部分的结束。从概念上讲,我想有一种方法来触发一段时间(5-10分钟)后,用户关闭窗口的部署终止。
我浏览了很多关于kubernetes生态系统的文档,似乎没有明显的内置工具用于此用例。

销售线索:

Ingress

最初,我天真地认为我们可以通过入口监控连接的状态,入口可以直接在kubernetes清单中提供一些标志,以指定自动终止。haproxy-ingress控制器似乎有一种监视活动连接的方法。然而,即使我改变了入口控制器,我也没有找到任何可以安排部署终止的东西。

探针

探测器似乎是完成这项任务的合理工具。应用程序的前端支持JavaScript注入。我们的想法是注入一个WebSocket,在unload上有一个事件侦听器,它将充当监视端点。除此之外,对初始应用程序进行大的修改是禁止的。
但是,在探测器检查失败时,行为是启动一个新的pod。
->理论上,应该可以更改我的作业部署(意味着终止),并设置restartPolicy: Never标志。但这也会取消所有有用的重启(如pod故障)。

**?>**一般来说,我应该使用Job来运行服务吗?从文档来看,它似乎更适合计算任务。虽然,它听起来更适合与调度相关的问题。我做了一些测试,也有可能暴露一个工作。将pod放在作业中而不是部署中(或者使用无套pod)的其他缺点是什么?

Sidecar容器

最终,我可以手动完成所有工作,因为也可以使用sidecar容器,其中一个小型服务器连接到该WebSocket,该服务器将负责使用客户端API或任何其他解决方案触发部署的自删除。
那么,遵循最佳实践的方法是什么呢?这是我的第一个Kubernetes项目,我很难相信没有内置的机制来指定资源的终止策略。
谢谢你的帮助如果需要,可以参考完整代码here。非常欢迎评论和反模式通知。

lp0sw83n

lp0sw83n1#

我得说这是典型的操作员工作
用户操作触发了自定义资源的创建,操作员基于此设置所有内容。关闭会话将删除自定义资源。cronjob垃圾收集所有比x旧的自定义资源。
写一个操作符实际上很简单。您可以利用kubebuilder来实现这一点。

yb3bgrhw

yb3bgrhw2#

正确的方法是利用Kubernetes操作符模式。Operator框架旨在通过将操作知识(在您的案例中删除部署)与应用程序知识分离来模仿人类。因此被称为“运营商”
一些例子(详细信息在下面的链接)

  • 按需部署应用程序的能力;
  • 备份应用程序状态或从给定备份重新启动应用程序;
  • 管理应用程序及其所有依赖项的更新,包括新的配置设置和必要的数据库更改;
  • 将服务公开给不支持Kubernetes API的应用程序。

https://www.cncf.io/blog/2022/06/15/kubernetes-operators-what-are-they-some-examples/

相关问题