TL;DR
如何设置轻量级web服务器以执行外部程序来处理REST请求?
长版本:
我们通过Helm在Kubernetes中部署了一组服务和数据库。我需要执行一些执行维护、清理、备份、恢复等的可执行文件(有些是按需执行的,有些是定期执行的)
我想把一个小型、轻量级的web服务器放在可以访问二进制文件的地方,并在处理REST请求时执行它们。
- 服务器需要占用较小的内存
- 交通将非常繁忙(每次请求间隔几分钟)
- 安全性不是特别重要(它将在我们的信任区域内运行)
- 服务器需要处理GET和POST(即将二进制内容传递给外部程序)
我看过带有CGI模块的lighttpd或nginx,但我对它们没有经验
你推荐什么?你有一个小例子来展示如何做吗?
这里是k8s原生方法:
... a set of services and databases deployed in Kubernetes... some executables that perform maintenance, cleanup, backup, restore etc...some on-demand & some periodically
如果你能把那些";可执行文件";在图像中,您可以按需运行这些程序作为k8s作业,并将重复作业安排为k8s cronjob。如果这在您的上下文中是可能的,那么您可以创建一个k8s角色,该角色刚好有权调用job/cronjob api,并将该角色绑定到一个专用的k8s服务帐户。
然后,使用您选择的任何语言/框架构建一个迷你web应用程序,使用专用服务帐户在k8s上运行此web应用程序。使用NodePort/LoadBalancer将您的pod作为服务公开,以接收GET/POST请求。最后,您可以直接调用K8SAPI服务器的api,根据您的逻辑运行作业。
我想我会做一个小服务。我会选择Node,因为这是我熟悉的东西,但很多语言都采用了这种方式来设置服务器,所以选择你喜欢的东西。
index.js
const express = require('express')
const { exec } = require('child_process')
const app = express()
const port = 3000
app.get('/os-release', (req, res) => {
exec('cat /etc/os-release', (error, stdout, stderr) => {
res.send(stdout)
})
})
app.listen(port, () => {
console.log(`Listening on port ${port}`)
})
软件包.json
{
"name": "shell-exec",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"child_process": "^1.0.2",
"express": "^4.17.1"
}
}
Dockerfile
FROM node:alpine
EXPOSE 3000
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . ./
CMD ["node", "index.js"]
如果需要的话,我应该相对容易地发出接受输入参数的POST请求。我还喜欢您可以将命令的输出发送回调用者。
如果您构建并运行它,那么您就可以访问/os发布端点,并从cat /etc/os-release
命令中获取数据。