繁体   English   中英

如何在 Kubernetes Pod 中调试 nodeJS 应用程序?

[英]How to debug a nodeJS application inside a Kubernetes Pod?

几乎是问题的标题。

我正在使用一个 Ubuntu 系统,该系统具有带有多个节点和多个运行 Docker 容器的 pod 的 k8s 部署。 一些 pod 是 nodeJS 微服务,它们在启动时运行以下命令:

node app.js

有时我需要通过添加日志、更改内部逻辑等来调试微服务。

在 Windows 中使用相同的微服务,我只需更改源代码并重新启动node.exe进程。 我将如何通过 Kubernetes 部署在 Linux 中实现相同的功能?

我试图运行一个shell:

user@node1:~$ kubectl exec my-microservice-XXXX -it -- sh

更改源代码并保存: nano app.js

查找node进程: ps aux

PID   USER     TIME  COMMAND
    1 root      0:00 npm
   22 root      0:00 npm
   42 root      0:27 node --max-http-header-size=65000 app.js

然后将SIGTERM发送到PID 42

kill SIGTERM 42

这导致我被从 pod 中启动:

/usr/src/app # kill SIGTERM 42
sh: invalid number 'SIGTERM'
/usr/src/app # command terminated with exit code 137
test@node1:~$

一个新的 pod 会自动启动:

my-microservice-XXXX                       0/1     Completed   1          19h
my-microservice-XXXX                       1/1     Running     2          19h

这在Kubernetes是不可能的,因为我们不管理容器(创建、终止等)。 这是由Kubernetes完成的,因此这个过程是短暂的。

如果您不想在容器重新启动时丢失更改,那么您可以使用进行更改的目录的卷挂载 这完全违背了 docker 容器化的目的,也不建议在生产(任何)环境中批量存储代码)。

通过以下两个步骤,您可以调试在 kubernetes Pod 中的 Docker 容器内运行的 Node 应用程序:

  1. 登录容器并在调试模式下运行 Node 应用程序:
kubectl exec -it <pod-name> bash
node --inspect-brk index.js
  1. 将本地端口的连接转发到 Pod 上的端口
kubectl port-forward <pod-name> 9229

注意: 9229是调试器侦听的默认端口号,您不需要在 Kubernetes 配置 yaml 文件中公开此端口。

这就对了。

现在您可以使用地址chrome://inspect打开 Chrome 浏览器,单击远程目标,并开始调试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM