kubernetes - 将 pod 生命周期与用户连接联系起来

问题描述 投票:0回答:2

我的用例

我正在尝试使用 kubernetes 按需服务容器化应用程序。

按需,我的意思是有一个外部应用程序客户端显示数据集列表。 所需的功能是,经过身份验证的用户可以“打开”数据集。打开数据集意味着在后台启动应用程序的新实例,该实例读取数据集并作为参数传递。然后公开它,设置入口并返回唯一的 URL 供用户访问。 对于资源管理,实例应在用户请求时运行,并在不再需要时终止。

用户第一次关闭窗口或最大生命周期为 x 小时。 现阶段

使用 kubernetes (python) 客户端 API 启动实例。
  • 一个实例是一个部署(副本 1)、一个服务和一个入口(nginx-ingress-controller)。
    • 实例是无状态的:数据集和应用程序数据来自 s3 存储桶。身份验证和路由委托给入口/代理。
  • 因此满足服务要求。用户可以访问该url、进行身份验证、使用应用程序的功能等等。

挑战

现在生命周期部分结束了。从概念上讲,我想要一种在用户关闭窗口一段时间(5-10 分钟)后触发部署终止的方法。

我浏览了相当多有关 kubernetes 生态系统的文档,似乎没有针对此用例的明显内置工具。

线索:

入口

最初我

天真地

认为我们可以监控与入口的连接状态,该入口可以直接在 kubernetes 清单中提供一些标志,以便指定自动终止。似乎 haproxy-ingress 控制器有一种监视活动连接的方法。但是,即使我更改了入口控制器,我也没有找到任何可以安排终止部署的内容。 探针

探针似乎是完成这项任务的合理工具。应用程序的前端支持 JavaScript 注入。这个想法是注入一个 WebSocket,并在

onload

上有一个事件监听器作为监视端点。 除此之外,对初始应用程序进行大量修改是禁止的。

但是,在探测检查失败时,行为是启动一个新的 pod。

-> 理论上,应该可以更改我的作业部署(即终止)并设置

restartPolicy: Never

标志。但这也会取消所有有用的重新启动(例如 pod 故障)。

?>

一般来说,我应该使用作业来运行服务吗?从文档来看,它似乎更适合计算任务。尽管如此,它听起来更适合与调度相关的问题。我做了一些测试,暴露一个job也是可以的。将 Pod 放在作业中而不是部署中(或使用无鞍 Pod)还有什么其他缺点? 边车容器

最终我可以手动完成所有操作,因为还应该有一个 sidecar 容器,其中一个小型服务器连接到该 WebSocket,负责使用客户端 API 或任何其他解决方案触发部署的自删除。

那么遵循最佳实践的方法是什么?这是我的第一个 kubernetes 项目,我很难相信没有内置机制来指定资源的终止策略。

感谢您的帮助。如果需要,您可以在

here

查阅完整代码。非常欢迎评论和反模式通知。

python kubernetes websocket kubernetes-ingress
2个回答
0
投票

在用户交互之间保持一个计时器运行,在新交互时重置,并留出一些安全余量。

这需要对容器化应用程序进行一些更改,但它基本上只是记录结果


0
投票

用户操作触发自定义资源的创建,操作员根据该资源设置一切。关闭会话会删除自定义资源。此外,cronjob 垃圾收集所有早于 x 的自定义资源。

编写一个运算符实际上非常简单。您可以利用

kubebuilder

来实现这一点。

© www.soinside.com 2019 - 2024. All rights reserved.