Node.js & Kubernetes Graceful Shutdown

k8s-graceful-shutdown:该库提供了使用 Kubernetes 实现 Graceful Shutdown(优雅退出) Node.js App 的资源。
问题描述
在 kubernetes 中运行微服务时。我们需要处理 kubernetes 发出的终止信号。这样做的正确方法是:
- 监听
SIGINT,SIGTERM - 收到信号后,将服务置于不健康模式(
/health路由应返回状态码4xx,5xx) - 在关闭之前添加宽限期,以允许 kubernetes 将您的应用程序从负载均衡器中移除
- 关闭服务器和所有打开的连接
- 关闭
该库使上述过程变得容易。只需注册您的 graceful shutdown hook(优雅退出的钩子)并添加宽限期即可。
请注意,您的宽限期必须小于 kubernetes 中定义的宽限期!
使用 Express 框架的示例
例如,使用Express框架:
import { Response, Request } from 'express'
import express from 'express'
import { addGracefulShutdownHook, getHealthHandler, shutdown } from '@neurocode.io/k8s-graceful-shutdown'
const app = express()
app.disable('x-powered-by')
const port = process.env.PORT || 3000
const server = app.listen(port, () => console.log(`App is running on http://localhost:${port}`))
// 修补 NodeJS 服务器关闭功能,使其具有正确的关闭功能,因为您可能期望为您关闭 keep-alive connections(保持活动的连接)!
// 在这里阅读更多信息 https://github.com/nodejs/node/issues/2642
server.close = shutdown(server)
const healthy = (req: Request, res: Response) => {
res.send('everything is great')
}
const notHealthy = (req: Request, res: Response) => {
res.status(503).send('oh no, something bad happened!')
}
const healthTest = async () => {
// 这是可选的
// 你可以用它来进行健康检查
return true
}
const healthCheck = getHealthHandler({ healthy, notHealthy, test: healthTest })
app.get('/health', healthCheck)
const sleep = (time: number) => new Promise((resolve) => setTimeout(resolve, time))
const asyncOperation = async () => sleep(3000).then(() => console.log('Async op done'))
const closeServers = async () => {
await asyncOperation() // 可以是任何异步操作,例如 mongo db 关闭,或发送 slack 消息;)
server.close()
}
const gracePeriodSec = 5*1000
addGracefulShutdownHook(gracePeriodSec, closeServers)
server.addListener('close', () => console.log('shutdown after graceful period'))
上面所示的这个简单的应用程序,添加了一个
5秒的优雅关闭周期,在此之后,钩子(在关闭功能的帮助下负责关闭服务器)被触发。在发送SIGINT或SIGTERM信号时,用户可以看到5秒的宽限期,之后发生了3秒的等待异步操作,然后才会显示“shutdown after graceful period”的消息,表示关闭服务器。该应用程序还展示了
“getHealthHandler”的功能。在请求localhost:3000/health时,healthTest将返回true,并显示'everything is great'消息,表明 health 检查为正常。用户可以将healthTest改为返回false,然后看到消息变为'oh no, something bad happened!'这表明了一种不健康的状态。
如果您使用 Koa 框架,请查看 demos/ 文件夹。 我们有一个 Koa 示例,其功能与上述应用类似。Koa 应用程序使用具有 health和 notHealthy 处理程序的 fn(ctx) 支持的 getHealthContextHandler,而不是将 health 和 notHealthy 处理程序作为 fn(req, res) 的 getHealthHandler。
它是如何工作的?
正常关闭工作流程的工作方式示例:
Kubernetes向Pod发送SIGTERM信号。手动缩小Pod或在滚动部署期间自动缩小Pod时会发生这种情况- 该库接收
SIGTERM信号并调用您的notHealthy处理程序。您的处理程序应返回400或500的http状态代码(抛出错误?),这表明该pod不再接收任何流量。注意此步骤是可选的(请检查下一步) - 库等待指定的 grace time 以启动应用程序的关闭。宽限时间应在
5到20秒之间。kubernetes端点控制器需要宽限时间才能从有效端点列表中删除Pod,进而从服务中删除Pod(从iptables所有节点中获取pod的ip地址)。 Kubernetes从Service中删除Pod- 该库调用您所有已注册的关闭 hook
- 在配置的宽限期之后,应用程序将使用我们的关机机制正确地关机,你可能期望默认工作,但在
NodeJS http server,express和Koa不是
互相交流学习
我的微信:

Node.js & Kubernetes Graceful Shutdown的更多相关文章
- Node.js 集群
稳定性: 2 - 不稳定 单个 Node 实例运行在一个线程中.为了更好的利用多核系统的能力,可以启动 Node 集群来处理负载. 在集群模块里很容易就能创建一个共享所有服务器接口的进程. var c ...
- Node.js使用PM2的集群将变得更加容易
介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...
- 使用PM2将Node.js的集群变得更加容易
介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...
- node.js使用汇总贴
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发,以及弱类型语言难以避免的拼写错误与弱小的语法提示 ...
- 微软开放技术发布针对 Mac 和 Linux 的更新版 Azure Node.JS SDK 和命令行工具
发布于 2013-12-04 作者 Eduard Koller 这次为我们使用Linux 的朋友带来了更多关于部署云上虚拟机的消息.今天,微软开放技术有限公司 (MS Open Tech),想与大家分 ...
- 当Node.js遇见Docker
Node.js Best Practices - How to Become a Better Developer in 2017提到的几点,我们Fundebug深有同感: 使用ES6 使用Promi ...
- node.js后台快速搭建在阿里云(二)(pm2和nginx篇)
前期准备 阿里云服务器 node.js pm2 express nginx linux(推荐教程:鸟哥的私房菜) 简介 嗯……我只是个前端而已 在第一部分说完了express篇. 后面继续项目的部署, ...
- 树莓派.使用Node.js控制GPIO
树莓派上的40个GPIO是最好玩的东西 它们可以被C,/C++, Python, Java等语言直接控制 现在就来看看怎么用Node.js做到同样的事情 在试验之前, 请先安装好Node.js, 具体 ...
- node.js cluster模式启用方式
众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心处理器 ...
随机推荐
- 前端开发入门到进阶第三集【sublime 的package control ——install package报错】
参考:https://www.cnblogs.com/ae6623/p/5338049.html,解决2帮我解决问题. 解决Sublime包管理package control 报错 There are ...
- React构建组件的方式
一.是什么 组件就是把图形.非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式 在React中,一个类.一个函数都可以视为一个组件 在Vue系列中,我们了解到组件所存在的优势: 降低整个系 ...
- python解析excel
import xlrd, base64excel_obj = xlrd.open_workbook(file_contents=base64.decodestring(filename)).#打开要解 ...
- 华为高斯DB(for MySQL)搭建演示
产品架构 云数据库 GaussDB(for MySQL)整体架构自下向上分为三层. 存储层: 基于华为DFV存储,提供分布式.强一致和高性能的存储能力,此层来保障数据的可靠性以及横向扩展能力. 存储抽 ...
- 记一次针对excel导出的优化
最近发现我们系统导出excel文件时由于是导出百万级数据导出,速度过慢并且内存占用多,故进行了下面的一次优化. 我们使用apache的poi进行excel文件操作 主要耗时: 1.从数据库得到需要导出 ...
- XCTF-open-source
下载附件拿到源码. #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { if ( ...
- Java8 新特性 Stream Api 之集合遍历
前言 随着java版本的不断更新迭代,java开发也可以变得甜甜的,最新版本都到java11了,但是后面版本也是不在提供商用支持,需要收费,但是java8 依然是持续免费更新使用的,后面版本也更新很快 ...
- 通信协议,TCP/UDP对比:
通信协议 协议:约定,比如在中国约定说普通话 网络通信协议:速率,传输码率,代码结构,传输控制... 问题:非常复杂 大事化小:分层 TCP/IP协议簇:实际上是一组协议 重要: TCP:用户传输协议 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- Spring Cloud Alibaba - Gateway
Gateway Gateway简介 底层使用Netty框架,性能大于Zuul 配置gateway模块,一般使用yaml格式: server: port: 80 #spring boot actuato ...