【问题标题】:Is it a good idea to enable --inspect for nodejs in production (kubernetes)?在生产环境(kubernetes)中为 nodejs 启用 --inspect 是个好主意吗?
【发布时间】:2020-05-01 18:29:48
【问题描述】:

我有一个 nodejs pod 在 kubernetes 生产环境中运行。此外,在运行相同应用程序的同一集群中还有暂存和审查环境。我最近在部署到所有环境的 dockerfile 中的 start 命令中添加了 --inspect。 我的问题是,如果我也在生产中启用调试,它会影响性能或内存使用吗?一般来说,这是一个好习惯吗?否则我需要为生产创建一个单独的 dockerfile。

【问题讨论】:

  • 当您使用 kubernetes 时,您可以只覆盖命令,而无需单独的 docker 文件 ...

标签: node.js debugging kubernetes remote-debugging production-environment


【解决方案1】:

虽然不执行上述任何操作,但您始终可以通过向进程发送信号来启用调试器,而无需重新启动应用程序:

kill -usr1 ${PID}

【讨论】:

    【解决方案2】:

    您可以使用Rookout。它是一个平台,可让您在生产环境中调试代码,而无需停止运行时 - 它还支持 Kubernetes。

    基本上,您通过安装 Rookout SDK 的 npm 包来安装它:

    npm install --save rookout
    

    或者(如果你使用纱线)

    yarn add rookout
    

    然后,只需使用您提供的令牌在您的代码中启动 sdk:

    const rookout = require('rookout');
    
    rookout.start({
        token: 'YOUR_ROOKOUT_TOKEN'
    });
    

    然后只需重新部署您的应用程序,您就无需再次重新部署以进行调试。您只需登录到 Rookout Web IDE,然后您就可以放置不间断断点以从您的代码中获取您需要的任何数据。

    另外,需要注意的是,使用 Rookout 对性能几乎没有影响。在性能方面,它与设置console.log 语句几乎相同;几乎看不出来。

    【讨论】:

    • 看起来是个有用的工具——通过搜索,我还发现了其他几个类似的工具(Lightrun、NerdVision、Thundra 等)。然而,就我而言,我最感兴趣的是获取我的 NodeJS 应用程序(在 k8s pod 中运行)的内存/堆快照,因为每当我尝试获取堆、分配、等快照。你知道这些工具是否支持跟踪内存分配等?
    • @Venryx Rookout 确实支持跟踪和监控,并且还提供了分析工具。
    • 不幸的是,我找不到有关实际使用分析工具(例如敏捷火焰图)的文档。我向 Rookout 支持发送了消息,并得到:After checking with our engineering team, we don't currently have support (or docs) for the profiling capability with Node.js at this time. I can drop you an email in the future if the team prioritizes that feature, but [...] it depends on having tracing (OpenTelemetry/OpenTracing) within your application. 他们显然有(我认为)Python 的那个工具,但即使在那里,还没有文档,并且在功能标志后面。不过这个工具看起来确实不错!
    【解决方案3】:

    想出了一个更好的解决方案。 创建一个仅对非生产环境启用调试的包装脚本。对于生产,如果绝对必要,最好手动执行到 pod 并调试。 这是脚本:start.sh

    #!/bin/sh
    if [ "$ENVIRONMENT" = "production" ] ;then
     npm start;
    else
     npm run debug;
    fi
    

    在 dockerfile 中,

    CMD [ "/app/src/start.sh" ]
    

    【讨论】:

      【解决方案4】:

      它会影响性能或内存使用吗?

      如果仅启用标志,两者可能都可以忽略不计,如果实际进行实时调试,里程可能会有所不同。

      这是个好习惯

      我会说不,它确实有security implications。虽然,这只有在设置公共 IP 时才会成为问题,但默认情况下,仅允许在 localhost 上进行调试。

      My.advice 将为产品创建一个单独的 Dockerfile。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        相关资源
        最近更新 更多