【问题标题】:Nginx returning status 400 when using kubernetes ingressNginx 在使用 kubernetes 入口时返回状态 400
【发布时间】:2019-08-30 17:26:14
【问题描述】:

我正在使用后端服务器和套接字服务器设置容器部署。当我尝试连接到我的 Web 服务器端点时它很好,但是当连接到套接字服务器端点时它返回一个 400

我跟进了几个主题,例如: WebSocket handshake: Unexpected response code: 400 in kubernetes-ingress

但是添加注释 WebSocket-services 和代理超时不起作用。

当我转发部署 pod 时,它工作正常。所以问题一定是nginx入口控制器。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  namespace: {{ include "namespace" . }}
  labels:
    helm.sh/chart: {{ include "chartname" . }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
    app.kubernetes.io/stage: {{ .Values.stage }}
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
spec:
  tls:
  - secretName: tls-certificate
    hosts:
    {{ range .Values.hosts }}
    - {{ . | quote }}
    {{ end }}
  rules:
  - host: mydomain.tk
    http:
      paths:
        - path: /
          backend:
            serviceName: web
            servicePort: http
        - path: /socket
          backend:
            serviceName: web
            servicePort: socket

这是我的 service.yml 文件:

apiVersion: v1
kind: Service
metadata:
  name: web
  namespace: {{ include "namespace" . }}
  labels:
    helm.sh/chart: {{ include "chartname" . }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
    app.kubernetes.io/stage: {{ .Values.stage }}
spec:
  type: NodePort
  sessionAffinity: ClientIP
  ports:
  - port: {{ .Values.web.port }}
    targetPort: http
    protocol: TCP
    name: http
  - port: {{ .Values.web.socket }}
    targetPort: socket
    protocol: TCP
    name: socket
  selector:
    name: web

无论我在做什么,它总是在 /socket 端点上返回 400。

我目前正在使用最新版本的 nginx ingress 和 GKE 版本 1.11.7

ingress的输出:

Name:             ingress
Namespace:        backend
Address:
Default backend:  default-http-backend:80 (10.48.0.9:8080)
TLS:
  tls-certificate terminates mydomain.tk
Rules:
  Host     Path  Backends
  ----     ----  --------
  mydomain.tk
           /         web:http (10.48.0.28:8080)
           /socket   web:socket (10.48.0.28:9092)
Annotations:
  kubernetes.io/ingress.class:                     nginx
  nginx.ingress.kubernetes.io/proxy-read-timeout:  3600
  nginx.ingress.kubernetes.io/proxy-send-timeout:  3600
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------
  Normal  CREATE  13s   nginx-ingress-controller  Ingress backend/ingress

【问题讨论】:

  • 400 还是 404? 404 通常意味着入口后端无法访问,您被路由到入口default-backend。在这种情况下检查标签选择器。
  • 我总是收到 400 错误代码
  • 那么一定是入口问题。尝试kubectl exec -it <ingress-pod> /bin/sh 并检查生成的 nginx.conf 是否有意义
  • 你能在你的入口资源上运行kubectl describe ingress吗?
  • 如您所见,我将输出添加到我的帖子中

标签: nginx kubernetes socket.io nginx-ingress


【解决方案1】:

我基本上通过在我的应用程序中添加跨域标头来解决问题。

【讨论】:

    【解决方案2】:

    在我的情况下,问题是由客户端发送的标题行过长引起的。我通过设置/增加NGINX Ingress ControllerConfigMap的以下配置参数解决了这个问题:

    【讨论】:

    • client-header-buffer-size 对我有用!非常感谢
    猜你喜欢
    • 2021-02-17
    • 2020-12-05
    • 2020-09-07
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多