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



几乎是问题的标题。

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

node app.js

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

在Windows中使用相同的微服务,我可以更改源代码并重新启动node.exe过程。我将如何在 Linux 中使用 Kubernetes 部署实现相同的操作?

我试图运行一个外壳:

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 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浏览器,单击远程目标,然后开始调试。

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

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

最新更新