将 kibana 放在 nginx-ingress 后面失败并出现 HTTP 错误

Putting kibana behind nginx-ingress fails with a HTTP error

我在kubernetes环境下部署了kibana。如果我给它一个 LoadBalancer 类型的服务,我就可以很好地访问它。但是,当我尝试通过 nginx-ingress 访问它时,它失败了。我在 nginx ingress 中使用的配置是:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
  name: my-ingress
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: kibana
              servicePort: {{ .Values.kibanaPort }}
            path: /kibana

我已经使用以下设置启动了我的 kibana:

    - name: SERVER_BASEPATH
      value: /kibana

而且我可以通过 LoadBalancer IP 访问 kibana。但是,当我尝试通过 Ingress 访问时,除了对 vendors.bundle.js 的 GET 调用几乎一直失败之外,大多数调用都正常进行。

本次调用ingress中的日志信息如下:

2019/10/25 07:31:48 [error] 430#430: *21284 upstream prematurely closed connection while sending to client, client: 10.142.0.84, server: _, request: "GET /kibana/bundles/vendors.bundle.js HTTP/2.0", upstream: "http://10.20.3.5:3000/kibana/bundles/vendors.bundle.js", host: "1.2.3.4", referrer: "https://1.2.3.4/kibana/app/kibana"
10.142.0.84 - [10.142.0.84] - - [25/Oct/2019:07:31:48 +0000] "GET /kibana/bundles/vendors.bundle.js HTTP/2.0" 200 1854133 "https://1.2.3.4/kibana/app/kibana" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 47 13.512 [some-service] 10.20.3.5:3000 7607326 13.513 200 506f778b25471822e62fbda2e57ccd6b

我不确定为什么我会在不同的浏览器中得到 upstream prematurely closed connection while sending to client。我已经尝试将 proxy-connect-timeoutproxy-read-timeout 设置为 100 秒,但即使这样也失败了。我不确定这是否是由于某种默认大小或块造成的。

另外值得注意的是,只有一些 kibana 调用失败,并非所有都失败。

在浏览器中,我看到错误信息:

GET https://<ip>/kibana/bundles/vendors.bundle.js net::ERR_SPDY_PROTOCOL_ERROR 200

在开发者控制台中。

任何人都知道我需要将什么样的配置选项传递给我的 nginx-ingress 才能使 kibana proxy_pass 正常?

我找到错误原因了。 vendors.bundle.js 文件相对较大,并且由于我是从相对较慢的网络访问的,所以请求被终止了。我解决这个问题的方法是,将以下字段添加到 nginx-ingress 配置中:

nginx.ingress.kubernetes.io/proxy-body-size: 10m (Change this as you need)
nginx.ingress.kubernetes.io/proxy-connect-timeout: "100"
nginx.ingress.kubernetes.io/proxy-send-timeout: "100"
nginx.ingress.kubernetes.io/proxy-read-timeout: "100"
nginx.ingress.kubernetes.io/proxy-buffering: "on"