如何为不是服务器的node.js容器创建livenessprobe?

如何为不是服务器的node.js容器创建livenessprobe?,node.js,kubernetes,Node.js,Kubernetes,我必须为kubernetes中的node.js容器(docker)创建一个Readynes和liveness探测器。我的问题是容器不是服务器,所以我无法使用http请求查看它是否处于活动状态 我的容器运行一个进程,每12小时下载一些csv文件,解析它们并将结果插入elasticsearch 我知道我可以添加express.js,但我不希望只是为了探测而这样做 我的问题是: 有没有一种方法可以使用某种?如果可能,我可以使用什么命令 在容器中,我运行了这个进程。我能以任何方式将其用于探头吗?如果可以

我必须为kubernetes中的node.js容器(docker)创建一个Readynes和liveness探测器。我的问题是容器不是服务器,所以我无法使用http请求查看它是否处于活动状态

我的容器运行一个进程,每12小时下载一些csv文件,解析它们并将结果插入elasticsearch

我知道我可以添加express.js,但我不希望只是为了探测而这样做

我的问题是:

  • 有没有一种方法可以使用某种?如果可能,我可以使用什么命令
  • 在容器中,我运行了这个进程。我能以任何方式将其用于探头吗?如果可以,如何使用

  • 首先,你应该考虑一下这个工作量。也就是说,它可能不适合您的作业,例如,如果您的作业在计划运行之间占用了大部分时间,或者您需要在作业中的错误处理和计划之间进行更复杂的交互。最后,如果要检查作业在运行时是否正在进行,甚至可能需要为CronJob生成的容器运行一个活动性探测——这使用了与普通作业相同的语法

    我对pm2不太熟悉,不过我认为你不需要在Kubernetes内部使用额外的作业管理,它应该已经提供了你所需要的大部分

    也就是说,当然可以对liveness探测器使用任意命令,正如您所注意到的,它甚至在

    您只需将
    exec
    成员添加到容器的
    livenessProbe
    节中,如下所示:

        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5
          periodSeconds: 5
    
    如果命令返回0(例如,successed),则kubelet认为容器处于活动状态且运行正常。(例如,在这个简单的示例中,只有当
    /tmp/health
    存在时,容器才被认为是健康的)

    在你的情况下,我可以想出几种使用的可能性。例如,作业可能被配置为删除一个sentinel文件,该文件指示它正在以某种方式取得进展。例如,附加上次复制的文件的名称和时间戳。然后,liveness命令将是一个小脚本,它可以读取该文件并确保有足够的进度(例如,在cron作业案例中,在最后几分钟内复制了一个文件)


    准备就绪探测在您描述的服务上下文中可能没有意义,因为它们更多的是关于不发送应用程序通信量,但它们也可以有类似的节,只用于
    readinessProbe
    ,而不是
    livenssprobe

    Liveness命令

    您可以使用您描述的。但是,我建议您为Kubernetes设计您的工作/任务

    为Kubernetes设计

    My container运行一个节点cron进程,每12小时下载一个csv文件,解析它们并将结果插入elasticsearch

    您的作业执行不太频繁,如果将其部署为服务,它将一直占用资源。当您编写要用于流程的代码时,我会推荐另一种设计。据我所知,PM2是一个流程管理器,但Kubernetes在某种程度上也是一个流程管理器

    Kubernetes原生CronJob

    不要使用pm2处理流程,而是将流程作为容器映像实施,并在
    作业模板
    中指定映像的位置安排作业/任务。使用这种设计,您没有任何livenessProbe,但如果任务失败,例如由于网络问题无法将结果插入elasticSearch,则任务将重新启动