我有一个正在运行的GKE集群(v1.12.8-gke.10)。我正在尝试设置一个可以按我想要的方式运行的特定应用程序,但是我似乎找不到和将其组合在一起的文档。我试图实现的目标甚至不可能。
我想使用python docker映像设置一个Deployment(1 pod),在该映像中运行循环pythons脚本执行检查。如果检查全部通过,我希望此部署/吊舱启动/扩展另一个将执行简单任务的部署,然后终止已启动的吊舱。
我不确定是否应该使用部署,或者在此过程中是否需要混合使用HPA。我也尝试过查看KEDA,但它仅指定了触发器,不适合我要尝试的操作。
我期望有两种不同的部署方式。
Deploy A = 1 pod不断运行python脚本,该脚本正在检查是否应将任何命令发送到Deploy B。
部署B =侦听部署A伸出手来告诉它启动Pod以运行任务。任务完成后,让Pod终止。
答案 0 :(得分:2)
您描述的工作流程是可能。控制器可能需要使用Kubernetes API来访问official Python client。收到请求时,您将创建一个Job,并可能传递有关作为命令行参数运行内容的信息。 Job's Pod内部的进程将完成工作,然后正常退出。然后,您将负责监视作业的状态并通知作业完成的时间,但是您不必显式缩小它的大小。删除完成的工作是有礼貌的。
我在这里通常建议的体系结构是使用像RabbitMQ这样的作业队列。您将为控制器配备一个Deployment,为您的工作人员配备一个单独的Deployment,并有一个StatefulSet来运行作业队列(或类似the stable/rabbitmq
Helm chart之类的东西。这些都不会直接与Kubernetes API交互。收到新请求后,控制器会将消息发布到RabbitMQ,当工作人员从队列中收到消息时,它将完成工作。
这具有易于在本地开发的优势(您可以仅在便携式计算机或容器中运行RabbitMQ,但更难访问Kubernetes API)。如果您突然被大量的工作提交淹没,您将不会尝试使群集中成千上万的工作超载。他们将备份在RabbitMQ中,您一次可以做一次。如果您希望集群做更多的事情,可以kubectl scale deployment
来吸引更多的工人。如果您的工作用完了,则工人吊舱将闲置,但这并不是真正的问题。