kubernetes 如何在Next.js上设置健康检查的端点?

jqjz2hbq  于 2023-05-16  发布在  Kubernetes
关注(0)|答案(6)|浏览(288)

我有一个部署在Kubernetes(谷歌云)上的应用程序。要使部署正常工作,它需要向“/healthz”和“/"返回200状态响应。我在Express服务器上设置了这个路由,返回如下响应:

app.use('/healthz', ((_req, res) => {
      logGeneral.info("Health Status check called.");
      res.sendStatus(200);
    }));

但是我不知道如何为我的前端做同样的事情,它运行在Next. js/ React上。不支持res.send等命令。
有人知道吗?
谢谢

uxhixvfz

uxhixvfz1#

使用API路由是正确的答案。在/pages/API中创建一个名为healthcheck.js的新文件,内容如下:

export default function handler(req, res) {
  res.status(200).json({ "status": "ok" })
}

端点将位于(hostname)/API/healthcheck

1tuwyuhd

1tuwyuhd2#

我也有类似的要求。我不得不在AWS上部署代码,我需要一个健康检查URL,比如http://localhost:4000/ping
我创建了一个名为ping/index.js的文件,其中包含以下内容-

// health check URL
function Ping() {
}

// This gets called on every request
export async function getServerSideProps(context) {
  context.res.end('pong');
  return { props: { } }
}

export default Ping;

参考文献-

  1. https://github.com/vercel/next.js/issues/6750
  2. https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering
1tu0hz3e

1tu0hz3e3#

如果你必须使用/healthz的根路径,你可以按照这里的建议添加一个API路由;

// ./pages/api/health.js
export default function handler(req, res) {
  res.send('OK');
}

另外,您在next.config.js中定义了一个重写,因此/healthz将由/api/health在内部处理;

/** @type {import('next').NextConfig} */
module.exports = {
  rewrites: async () => {
    return [
      {
        source: '/healthz',
        destination: '/api/health',
      },
    ];
  },
};
ggazkfy8

ggazkfy84#

在next.js中使用API路由,这似乎是处理此类情况的正确方法
https://nextjs.org/docs/api-routes/introduction

hjzp0vay

hjzp0vay5#

添加到@Koen回答。
如果您的应用正在运行basePath,例如。“/abc”,并且您希望从健康检查URL中排除basePath,例如https://example.com/healthz
然后下面的代码在k8/docker容器中工作。

// ./pages/api/health.js
export default function handler(req, res) {
  res.status(200).json({ message: 'Health Check Okay' })
}

next.config.js

module.exports = {
 rewrites: async () => {
  return [
   {
     source: '/healthz',
     destination: 'https://example.com/api/healthz', 
     //can write destination: http://localhost:<PORT>/api/healthz to make it ENV independent. 
     basePath: false
   },
  ];
 },
};

参考:https://nextjs.org/docs/api-reference/next.config.js/rewrites

2q5ifsrm

2q5ifsrm6#

使用Next.js 13 app route,您可以添加一个健康检查端点,如下所示:
src/app/api/health/route.ts/api/health
src/app/healthz/route.ts/healthz

export function GET() {
  return NextResponse.json({});
}

或者如果需要纯文本

export function GET() {
  return new NextResponse('OK');
}

https://nextjs.org/docs/app/building-your-application/routing/router-handlers

相关问题