Kubernetes https 入口 400 响应

Kubernetes https ingress 400 response

我有一个裸机 kubernetes 集群 (1.13) 和 运行 nginx 入口控制器(通过 helm 部署到默认命名空间 v0.22.0)。

我在尝试使用 nginx 控制器的不同命名空间中有一个入口。

#ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: myapp
annotations:
  kubernetes.io/backend-protocol: https
  nginx.ingress.kubernetes.io/enable-rewrite-log: "true"
  nginx.ingress.kubernetes.io/rewrite-target: "/"
spec:
  tls:
  - hosts:
    - my-host
    secretName: tls-cert
  rules:
  - host: my-host
    paths:
    - backend:
        servicename: my-service
        servicePort: https
      path: "/api/(.*)"

nginx 控制器成功找到入口,并说有端点。如果我到达终点,我会得到一个 400,没有任何内容。如果我打开 custom-http-headers then I get a 404 from nginx; my service is not being hit. According to re-write logging,url 将被正确重写。

我也直接从 pod 内部点击服务,效果也很好。

#service.yaml
kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  ports:
  - name: https
    protocol: TCP
    port: 5000
    targetPort: https
  selector:
    app: my-app
  clusterIP: <redacted>
  type: ClusterIP
  sessionAffinity: None

可能出了什么问题?

编辑:全面禁用 https 仍然会出现相同的 400 错误。但是,如果我的应用程序需要 HTTPS 请求,而 nginx 正在发送 HTTP 请求,则请求会到达应用程序(但它无法处理它们)

如果请求 headers 无效(如其中的特殊字符),Nginx 将静默失败并返回 400。您可以使用 tcpdump 进行调试。