[英]Kubernetes nginx-ingress how to deal with routing in Express
[英]Configure nginx-ingress to forward bytes to underlying HTTP service, as they arrive
我正在構建一個 API,而不是使用戶能夠通過 HTTP 來處理來自 nodejs express 服務器的請求,而我希望能夠處理來自nodejs express 服務器的請求。
客戶端.js
const request = require('request');
someReadableStream.pipe(request({
method: "POST",
uri: `${process.env.SERVER_URL || "https://streaming.service.com/"}/`,
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
},
}));
服務器.js
const express = require('express');
const app = express();
app.post('/', function rootPostHandler(req, res) {
console.log('request received');
const tickInterval = setInterval(() => console.log('tick'), 1000);
req.on('data', (chunk) => console.log('data received'));
req.on('end', () => {
console.log('request end received');
clearInterval(tickInterval);
res.end('done')
});
});
app.listen(process.env.PORT);
我的開發服務器上的一切都按預期工作:服務器接收數據並可以在客戶端仍在推送時開始處理它(請參閱下面 output 中的每秒tick
)。
開發服務器 output:
request received
data received
data received
data received
tick
data received
data received
data received
tick
data received
data received
data received
tick
data received
data received
request end received
Now, when we deploy the same server code to our kubernetes cluster, initial experiments suggest that Nginx Ingress (or some other K8s component) wait the request to be completed before sending it to the underlying HTTP service (no tick
in output below).
服務器 pod 日志
request received
data received
data received
data received
data received
data received
data received
data received
data received
data received
data received
data received
request end received
kubernetes 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
labels:
tier: ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "issuer"
nginx.ingress.kubernetes.io/proxy-body-size: 30720m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "180"
nginx.ingress.kubernetes.io/proxy-read-timeout: "180"
nginx.ingress.kubernetes.io/proxy-send-timeout: "180"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_pass_request_headers on;
spec:
ingressClassName: nginx
tls:
- hosts:
- streaming.service.com
secretName: streaming-tls
rules:
- host: streaming.service.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: streaming
port:
number: 80
---
apiVersion: v1
kind: Service
metadata:
name: streaming
labels:
app: streaming
spec:
type: ClusterIP
clusterIP: None
sessionAffinity: ClientIP
ports:
- port: 80
selector:
app: streaming
回答我自己的問題,因為它可能對其他人有所幫助
您所要做的就是添加nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
注釋
新入口配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-stream
labels:
name: ingress-stream
tier: ingress
annotations:
nginx.ingress.kubernetes.io/proxy-request-buffering: "off" # here
spec:
ingressClassName: nginx
rules:
- host: streaming.service.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: streaming
port:
number: 80
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.