【问题标题】:Kubernetes https ingress 400 responseKubernetes https 入口 400 响应
【发布时间】:2023-03-26 02:32:01
【问题描述】:

我有一个裸机 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: "/$1"
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,那么我会从 nginx 得到 404;我的服务没有受到打击。根据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 请求,那么请求会到达应用(但它无法处理它们)

【问题讨论】:

  • 您的服务是否使用有效的 SSL 证书? Nginx 将拒绝连接到具有无效证书的服务。
  • 有效是什么意思?证书是自签名的。
  • 实际上我不确定这些天是否需要有效的证书(旧版本需要它)。你能检查 Nginx 日志中的 400 错误吗?
  • 我在日志中看到了 400,但看不到它的来源(即使在 -v=5 上)
  • 如果 Nginx 没有给出 400 的原因 - 那么 400 不是由 Nginx 生成的。您应该检查您的应用日志。

标签: https kubernetes nginx-ingress


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-07-08
    • 2019-09-24
    • 2017-04-07
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2021-04-26
    • 2015-01-03
    相关资源
    最近更新 更多