k8s-graceful-shutdown:该库提供了使用 Kubernetes 实现 Graceful Shutdown(优雅退出) Node.js App 的资源。

问题描述

在 kubernetes 中运行微服务时。我们需要处理 kubernetes 发出的终止信号。这样做的正确方法是:

  1. 监听 SIGINT, SIGTERM
  2. 收到信号后,将服务置于不健康模式(/health 路由应返回状态码 4xx5xx)
  3. 在关闭之前添加宽限期,以允许 kubernetes 将您的应用程序从负载均衡器中移除
  4. 关闭服务器和所有打开的连接
  5. 关闭

该库使上述过程变得容易。只需注册您的 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秒的优雅关闭周期,在此之后,钩子(在关闭功能的帮助下负责关闭服务器)被触发。在发送 SIGINTSIGTERM 信号时,用户可以看到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 应用程序使用具有 healthnotHealthy 处理程序的 fn(ctx) 支持的 getHealthContextHandler,而不是将 healthnotHealthy 处理程序作为 fn(req, res)getHealthHandler

它是如何工作的?

正常关闭工作流程的工作方式示例:

  1. KubernetesPod 发送 SIGTERM 信号。手动缩小 Pod 或在滚动部署期间自动缩小 Pod 时会发生这种情况
  2. 该库接收 SIGTERM 信号并调用您的 notHealthy 处理程序。您的处理程序应返回 400500http 状态代码(抛出错误?),这表明该 pod 不再接收任何流量。注意此步骤是可选的(请检查下一步)
  3. 库等待指定的 grace time 以启动应用程序的关闭。宽限时间应在 520 秒之间。 kubernetes 端点控制器需要宽限时间才能从有效端点列表中删除 Pod,进而从服务中删除 Pod(从 iptables 所有节点中获取 podip 地址)。
  4. KubernetesService 中删除 Pod
  5. 该库调用您所有已注册的关闭 hook
  6. 在配置的宽限期之后,应用程序将使用我们的关机机制正确地关机,你可能期望默认工作,但在 NodeJS http server, expressKoa 不是

互相交流学习

我的微信:

Node.js Kubernetes Graceful Shutdown相关推荐

  1. 小程序动画从头开始_如何从头开始在Kubernetes上部署弹性Node.js应用程序

    小程序动画从头开始 视频 (Video) 描述 (Description) You may have heard the buzz around Kubernetes and noticed that ...

  2. centos下设置node.js开机启动(并且启动自己的项目js)

    1.请确保安装了node 2.安装pm2 npm install pm2 -g 安装完毕后 pm2 -v 出现以下界面就代表安装成功 (如果报错bash:pm2:command not found 解 ...

  3. 在Google Cloud Platform上持续部署Node.js

    by Gautam Arora 由Gautam Arora 在Google Cloud Platform上持续部署Node.js (Continuous Deployment for Node.js ...

  4. 2019 年,19 种方法让自己成为更好的 Node.js 工程师

    原文作者:Yoni Goldberg 译者:UC 国际研发 Jothy 写在最前:欢迎你来到"UC国际技术"公众号,我们将为大家提供与客户端.服务端.算法.测试.数据.前端等相关的 ...

  5. 使用node.js作为简单的Web服务器

    我想运行一个非常简单的HTTP服务器. 对example.com每个GET请求都应该将index.html提供给它,但是作为常规HTML页面(即,与阅读普通网页时相同的体验). 使用下面的代码,我可以 ...

  6. 如何在Node.js中退出

    用于退出的命令是什么? (即终止Node.js进程) #1楼 从命令行, .exit就是你想要的: $ node > .exit $ 它在REPL文档中有记录 . REPL(Read-Eval- ...

  7. 在2019年,如何成为更好的Node.js开发者?

    这篇文章汇编了 19 项在 2019 年可能会很有价值的技能和主题.但请不要感觉到有任何压力--我和其他大多数开发者也并非对每一个主题都很熟悉.我只是觉得这些东西应该值得我们关注,而且 JavaScr ...

  8. 大规模 Node.js 网关架构设计与工程实践

    作者:王伟嘉,腾讯云 CloudBase 前端负责人. 本文是王伟嘉在 GMTC 2021 全球大前端技术大会(深圳站)上的演讲内容:<十亿级 Node.js 网关的架构设计与工程实践>. ...

  9. 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/ ...

  10. Node.js 框架设计及企业 Node.js 基础建设相关讨论

    大家好,我是若川.19年我写的 lodash源码 文章投稿到海镜大神知乎专栏竟然通过了,后来20年海镜大神还star了我的博客,同时还转发了我的微博.时间真快啊.今天分享这篇Node.js的讨论. 2 ...

最新文章

  1. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口
  2. oracle查看临时表空间文件,Oracle-临时表空间
  3. 关于delphi中的register, pascal, cdecl, stdcall, safecall
  4. enumerate()函数用法
  5. wpf Visibility 动画
  6. 《Spring 3.0就这么简单》——1.6 展现层
  7. Linux--结构体的详细学习
  8. hdu 1569 方格取数(2) 最大点权独立集
  9. 【GIS风暴】什么是地理空间智能(Geospatial AI)?
  10. oracle能查dml记录么,如何查询DML操作的详细记录
  11. Spring-tx-@EnableTransactionManagement注解
  12. idea 生成sdk_如何安装独立的Android SDK,然后将其添加到Windows上的IntelliJ IDEA?
  13. 还不会回答Spring Boot和Spring MVC的关系?大厂Java高级面试官告诉你答案!
  14. [渝粤教育] 重庆工程职业技术学院 数控机床编程与操作 参考 资料
  15. How to read Ext4 in Windows 10
  16. ERP软件厂商薪资情况披露
  17. 中学-综合素质【3】
  18. B站粉丝数监控(Python实现)
  19. 《大秦帝国》第四部,阵容太强大
  20. 龙族路明非和零h_第一章 海芒

热门文章

  1. 【历史上的今天】10 月 10 日:谷歌推出 Dart 预览版;俄罗斯最大的社交网站上线;上海大众汽车公司诞生
  2. c语言date用法,c语言getdate()和gettime()的用法
  3. 行走在拉萨、林芝的路上
  4. html中竖线怎么写,HTML如何写出竖线
  5. R语言使用dplyr包计算dataframe分组聚合样本独特值个数、计数个数、四分位距IQR
  6. 《关于促进互联网金融健康发展的指导意见》
  7. JavaWeb项目开发案例精粹-第4章博客网站系统-003Dao层
  8. 四分位数和百分位数_20种四分位数
  9. [剑指Offer]-把数字翻译成字符串
  10. 云桌面到底是干什么的?