You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

容器化NestJS应用在AKS中无法处理SIGTERM信号问题排查

NestJS容器在AKS无法优雅停机的问题分析与解决

核心原因分析

  • PID 1进程的信号处理特性:Linux系统中,PID 1进程默认会忽略SIGTERM等信号(普通PID进程收到SIGTERM会默认终止)。你的NestJS应用在AKS中以PID 1运行,而Node.js作为PID 1时,不会自动响应SIGTERM,必须显式监听并处理该信号。本地Docker环境可能隐式使用了init进程(如Docker的--init参数),此时init进程作为PID 1会转发信号给Node.js进程,所以本地能正常处理。
  • 容器运行时差异:AKS默认使用containerd作为容器运行时,与本地Docker Engine在信号传递的细节上存在差异。当直接以Node.js进程作为PID 1时,containerd发送的SIGTERM无法触发Node.js的默认终止逻辑,导致进程无响应,最终kubelet等待30秒后发送SIGKILL强制删除Pod。

验证与解决方法

1. 显式在NestJS中监听SIGTERM信号

在应用启动代码中添加信号监听逻辑,确保收到SIGTERM时执行优雅停机:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

  // 监听SIGTERM信号,执行优雅停机
  process.on('SIGTERM', async () => {
    console.log('Received SIGTERM signal, starting graceful shutdown...');
    await app.close();
    process.exit(0);
  });
}
bootstrap();

2. 使用init进程转发信号

在容器启动命令中引入init进程(如tini),让init作为PID 1负责信号转发:

  • 确保镜像中包含tini(可通过Dockerfile安装:RUN apt-get update && apt-get install -y tini)
  • 修改Deployment的容器启动命令为:
    command: ["tini", "--", "node", "dist/main.js"]
    

3. 检查Pod终止超时配置

确认Pod的terminationGracePeriodSeconds设置(默认30秒),如果你的优雅停机逻辑需要更长时间,可适当调整该值,但前提是应用已正确处理SIGTERM信号。

内容的提问来源于stack exchange,提问作者Hans-Peter Bock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:16:16