Node.js Kubernetes Graceful Shutdown
![](/assets/blank.gif)
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
不是
互相交流学习
我的微信:
![](/assets/blank.gif)
Node.js Kubernetes Graceful Shutdown相关推荐
- 小程序动画从头开始_如何从头开始在Kubernetes上部署弹性Node.js应用程序
小程序动画从头开始 视频 (Video) 描述 (Description) You may have heard the buzz around Kubernetes and noticed that ...
- centos下设置node.js开机启动(并且启动自己的项目js)
1.请确保安装了node 2.安装pm2 npm install pm2 -g 安装完毕后 pm2 -v 出现以下界面就代表安装成功 (如果报错bash:pm2:command not found 解 ...
- 在Google Cloud Platform上持续部署Node.js
by Gautam Arora 由Gautam Arora 在Google Cloud Platform上持续部署Node.js (Continuous Deployment for Node.js ...
- 2019 年,19 种方法让自己成为更好的 Node.js 工程师
原文作者:Yoni Goldberg 译者:UC 国际研发 Jothy 写在最前:欢迎你来到"UC国际技术"公众号,我们将为大家提供与客户端.服务端.算法.测试.数据.前端等相关的 ...
- 使用node.js作为简单的Web服务器
我想运行一个非常简单的HTTP服务器. 对example.com每个GET请求都应该将index.html提供给它,但是作为常规HTML页面(即,与阅读普通网页时相同的体验). 使用下面的代码,我可以 ...
- 如何在Node.js中退出
用于退出的命令是什么? (即终止Node.js进程) #1楼 从命令行, .exit就是你想要的: $ node > .exit $ 它在REPL文档中有记录 . REPL(Read-Eval- ...
- 在2019年,如何成为更好的Node.js开发者?
这篇文章汇编了 19 项在 2019 年可能会很有价值的技能和主题.但请不要感觉到有任何压力--我和其他大多数开发者也并非对每一个主题都很熟悉.我只是觉得这些东西应该值得我们关注,而且 JavaScr ...
- 大规模 Node.js 网关架构设计与工程实践
作者:王伟嘉,腾讯云 CloudBase 前端负责人. 本文是王伟嘉在 GMTC 2021 全球大前端技术大会(深圳站)上的演讲内容:<十亿级 Node.js 网关的架构设计与工程实践>. ...
- js写的程序如何上线到linux,将 Node.js 应用发布到 Linux 应用服务 - Visual Studio | Microsoft Docs...
将 Node.js 应用程序发布到 Azure(Linux 应用服务)Publish a Node.js application to Azure (Linux App Service) 11/22/ ...
- Node.js 框架设计及企业 Node.js 基础建设相关讨论
大家好,我是若川.19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了,后来20年海镜大神还star了我的博客,同时还转发了我的微博.时间真快啊.今天分享这篇Node.js的讨论. 2 ...
最新文章
- java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
- oracle查看临时表空间文件,Oracle-临时表空间
- 关于delphi中的register, pascal, cdecl, stdcall, safecall
- enumerate()函数用法
- wpf Visibility 动画
- 《Spring 3.0就这么简单》——1.6 展现层
- Linux--结构体的详细学习
- hdu 1569 方格取数(2) 最大点权独立集
- 【GIS风暴】什么是地理空间智能(Geospatial AI)?
- oracle能查dml记录么,如何查询DML操作的详细记录
- Spring-tx-@EnableTransactionManagement注解
- idea 生成sdk_如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
- 还不会回答Spring Boot和Spring MVC的关系?大厂Java高级面试官告诉你答案!
- [渝粤教育] 重庆工程职业技术学院 数控机床编程与操作 参考 资料
- How to read Ext4 in Windows 10
- ERP软件厂商薪资情况披露
- 中学-综合素质【3】
- B站粉丝数监控(Python实现)
- 《大秦帝国》第四部,阵容太强大
- 龙族路明非和零h_第一章 海芒
热门文章
- 【历史上的今天】10 月 10 日:谷歌推出 Dart 预览版;俄罗斯最大的社交网站上线;上海大众汽车公司诞生
- c语言date用法,c语言getdate()和gettime()的用法
- 行走在拉萨、林芝的路上
- html中竖线怎么写,HTML如何写出竖线
- R语言使用dplyr包计算dataframe分组聚合样本独特值个数、计数个数、四分位距IQR
- 《关于促进互联网金融健康发展的指导意见》
- JavaWeb项目开发案例精粹-第4章博客网站系统-003Dao层
- 四分位数和百分位数_20种四分位数
- [剑指Offer]-把数字翻译成字符串
- 云桌面到底是干什么的?