几乎是问题的标题。
我正在使用一个 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 应用:
- 登录到容器并在调试模式下运行 Node 应用:
kubectl exec -it <pod-name> bash
node --inspect-brk index.js
- 将本地端口的连接转发到 Pod 上的端口
kubectl port-forward <pod-name> 9229
注意:9229
是调试器侦听的默认端口号,您无需在 Kubernetes 配置 yaml 文件中公开此端口。
就是这样。
现在,您可以使用地址chrome://inspect
打开Chrome浏览器,单击远程目标,然后开始调试。
这在Kubernetes
中是不可能的,因为我们不管理容器(创建、终止等(。这是由Kubernetes
完成的,因此该过程是短暂的。
如果不想在容器重启时丢失更改,则可以使用要进行更改的目录的卷装载。(这完全违背了 docker 容器化的目的,也不建议在生产(任何(环境中批量存储代码(。