确保基于容器的应用程序正常运行对您的业务成功至关重要。Kubernetes 中的健康检查功能对 Pod 执行特定检查,以确定有关其当前状态的信息,并评估应用程序在其生命周期不同阶段的状态。这些检查包括活跃度和就绪度。
在本教程中,我们将了解运行状况检查的基础知识,并向您展示如何将它们与部署在 Kubernetes 上的 Node.js 应用程序结合使用。
健康检查的类型
Kubernetes 中有四种类型的健康检查:启动检查、活跃检查、就绪检查和关闭检查。
启动检查
启动检查是在创建或重新启动 Pod 时执行的健康检查。启动检查确保在应用程序准备好接收流量之前需要运行的任何代码都已执行。
如果在应用程序启动过程中出现任何故障,此检查将返回一个错误,导致 Kubernetes 销毁 pod。
活性检查
在应用程序运行时执行活性检查。具体来说,您将使用活性检查来确定您的应用程序是否处于活动状态,并确保它不在容器仍在运行但应用程序无法运行的状态。
如果活性检查失败,Kubernetes 将销毁 pod 并为应用程序创建一个新的 pod。
准备情况检查
就绪检查也在运行时执行,用于确定应用程序何时准备好接收流量。您通常会使用这些检查来查看您的应用程序所依赖的相关服务或资源的可用性。
例如,如果您的应用程序依赖于外部 API,您可以注册一个就绪检查,以确定外部 API 是否可用。如果外部 API 可用,Pod 将开始接收流量。如果外部 API 不可用,就绪端点将返回为不可用,并且 Kubernetes 不会将流量定向到该 Pod。
Kubernetes 在他们的文档中提供了有关如何配置活动性和就绪性检查的信息。
停机检查
关闭检查确定应用程序是否清除任何正在使用的资源。这通常用于在应用程序关闭之前关闭网络连接和保存任何所需数据等活动。
Kubernetes 允许您将这些检查配置SIGTERM为在容器收到消息时运行。Kubernetes 将向SIGTERM容器发送一条消息,这意味着它们将在终止宽限期后关闭。这段时间过后,Kubernetes 会向SIGKILL容器发送信号,然后将其移除。请注意,Kubernetes 不会等待您的 pod 关闭;SIGKILL无论如何,一旦宽限期结束,它就会发送。
因此,如果您的容器关闭时间超过默认的 30 秒宽限期,您应该增加terminationGracePeriodSecondspod YAML 中的值。
Node.js 和健康检查
如果您有要管理的,我们建议使用生命周期使Node.js或打字稿应用云计算的健康或CloudHealthConnect提供模块CloudNativeJS。
Cloud Health 为您提供了一个框架来注册和运行就绪、活跃和联合运行状况(就绪和活跃)检查,以及关闭处理。
Cloud Health Connect 包装了 Cloud Health 功能,并将其公开为基于连接的中间件,可与Express和LoopBack等服务器框架一起使用。
付诸实践:使用 CloudNativeJS 在 Express.js 应用程序中注册健康检查
现在您了解了不同的健康检查,我将向您展示如何在 Node.js Express 应用程序中使用这些不同的健康检查来管理其生命周期。
先决条件
要学习本教程的其余部分,您需要在您的机器上安装 Node.js 8.2.0 或更高版本。
首先,您使用 Express 生成器来创建应用程序框架。我将向您展示如何在新的空目录中安装此应用程序中的运行状况检查。Express 生成器将使用目录名称作为项目的默认名称。
步骤 1. 创建应用程序骨架
- 创建新目录:
mkdir express-app cd express-app展示更多 - 使用运行 Express 生成器
npxnpx express-generator展示更多 - 安装并启动您的应用程序
npm install npm start展示更多
您现在应该有一个框架 Express 应用程序在运行:http://localhost:3000
要停止您的应用程序,请\*\*Ctrl-C\*\*在您的应用程序运行的终端窗口中使用。
Express 生成器将为您提供以下目录结构:
.
├── app.js
├── bin
| ├── www
├── package-lock.json
├── package.json
├── public
| ├── images
| ├── javascripts
| ├── stylesheets
| | ├── style.css
└── routes
├── index.js
└── users.js
├── views
├── error.jade
├── index.jade
├── layout.jade
7 directories, 10 files
展示更多
步骤 2. 向您的应用程序添加运行状况检查
现在您需要app.js使用@cloudnative/health-connect包中提供的连接中间件将健康检查添加到文件中。
首先,使用以下步骤添加活性检查:
- 将
@cloudnative/health-connect依赖项添加到您的项目中:npm install @cloudnative/health-connect展示更多 - 将 HealthChecker 添加到您的
app.js:const health = require('@cloudnative/health-connect'); let healthCheck = new health.HealthChecker();展示更多 - 注册活性检查:
const livePromise = () => new Promise((resolve, _reject) => { const appFunctioning = true; // You should change the above to a task to determine if your app is functioning correctly if (appFunctioning) { resolve(); } else { reject(new Error("App is not functioning correctly")); } }); let liveCheck = new health.LivenessCheck("LivenessCheck", livePromise); healthCheck.registerLivenessCheck(liveCheck);展示更多
现在已经配置了 Liveness 检查,让我们配置一个 Readiness 检查。这与我们在第 2 步中定义的 healthCheck 的使用方式类似。
let readyCheck = new health.PingCheck("example.com");
healthCheck.registerReadinessCheck(readyCheck);
展示更多
上面的就绪检查使用模块中的PingCheck功能@cloudnative向 example.com 发送请求。如果收到响应,检查会给出 status UP。您可以使用这种类型的检查向应用程序的依赖项发送请求,并检查应用程序发送和接收请求的能力。
您可以在@cloudnative/health和@cloudnative/health-connect模块中以这种方式注册所有上述检查。我们选择使用该connect模块是因为我们现在将使用 Express 的中间件功能为每个不同的健康检查注册端点。
- 使用以下命令注册您的 Liveness 端点:
app.use('/live', health.LivenessEndpoint(healthCheck));展示更多 - 注册就绪端点
app.use('/ready', health.ReadinessEndpoint(healthCheck));展示更多 - 注册一个组合的健康端点
app.use('/health', health.HealthEndpoint(healthCheck));展示更多
现在再次使用启动您的应用程序npm start,您将拥有一个 Readiness、Liveness 和一个组合的 Health 端点,您可以通过以下 URL 访问它们:
- 就绪端点:http://localhost:3000/ready
- Liveness 端点:http://localhost:3000/live
- 健康端点:http://localhost:3000/health
您应该UP从每个端点看到以下状态:
- 就绪端点:
{“status”: ”UP”,”checks”:[{“name”: “PingCheck HEAD:example.com:80/“, “state”: “UP”, “data”:{“reason” : ““ }}]}展示更多 - 活跃度端点:
{“status”: “UP”,“checks”: [{“name”: “LivenessCheck”, “state”: “UP”, “data” :{“reason” : ““ }}]}展示更多 - 健康终点:
{“status”: ”UP”, ”checks” : [{“name”: “PingCheck HEAD:example.com:80/“, “state”: “UP”, “data”: {“reason”: “” }} , { “name”: “LivenessCheck”, “state”: “UP”, “data”: {“reason” : ““ }}]}展示更多
如您所见,/ready端点显示您实施的就绪检查的结果,/live显示活动检查,并将/health活动和就绪检查显示为组合的健康检查。该/health端点在只有一个端点用于活动和就绪检查的云平台中特别有用,例如 Cloud Foundry。
现在,您拥有一个已设置运行状况检查的 Node.js 应用程序,可以部署到您的 Kubernetes 集群。