[英]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 应用程序:
kubectl exec -it <pod-name> bash
node --inspect-brk index.js
kubectl port-forward <pod-name> 9229
注意: 9229
是调试器侦听的默认端口号,您不需要在 Kubernetes 配置 yaml 文件中公开此端口。
这就对了。
现在您可以使用地址chrome://inspect
打开 Chrome 浏览器,单击远程目标,并开始调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.