基本上问题已经提出。
我正在使用具有多个节点和运行Docker容器的多个Pod的k8s部署的Ubuntu系统。 其中一些Pod是运行以下命令的nodeJS微服务:
node app.js
有时,我需要通过添加日志,更改内部逻辑等来调试微服务。
在Windows中使用相同的微服务,我只需更改源代码并重新启动node.exe进程。 如何在具有Kubernetes部署的Linux中实现相同的效果?
我尝试运行shell:
kubectl exec my-microservice-XXXX -it -- sh
更改源代码并保存:nano app.js
查找node进程:ps aux
我正在使用具有多个节点和运行Docker容器的多个Pod的k8s部署的Ubuntu系统。 其中一些Pod是运行以下命令的nodeJS微服务:
node app.js
有时,我需要通过添加日志,更改内部逻辑等来调试微服务。
在Windows中使用相同的微服务,我只需更改源代码并重新启动node.exe进程。 如何在具有Kubernetes部署的Linux中实现相同的效果?
我尝试运行shell:
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
然后向 PID 42
发送 SIGTERM
信号:
kill SIGTERM 42
这会导致我被从容器中强制退出:
/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
SIGTERM
是默认信号,因此您无需指定其类型,实际上您可以只使用kill 42
。如果您想指定信号的类型,则应使用以下语法:kill -<signal> <pid>
、-s <signal>
或--signal <signal>
,例如kill -SIGTERM 42
。 - marioKubernetes
中不应该这样做。它不应该用于调试,而应该用于运行工作镜像。镜像应该是不可变的,即如果您更改了应用程序的代码,则应该使用包含新代码的新镜像替换旧镜像。这不是您应该使用 Kubernetes 的方式。请参见 @Sagar Chilukuri 提供的答案。正如他所提到的,应用程序代码应该是镜像的组成部分,不应存储在卷中。 - mario