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 进行调试。
我有一个裸机 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 进行调试。