簡體   English   中英

配置 nginx-ingress 以在到達時將字節轉發到底層 HTTP 服務

[英]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 在到達時將字節轉發到底層 HTTP 服務,例如通過注釋片段

回答我自己的問題,因為它可能對其他人有所幫助

您所要做的就是添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM