我有一个裸机kubernetes集群(1.13),并且正在运行nginx入口控制器(通过头盔部署到默认名称空间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。我的服务没有受到影响。根据{{3}}的说法,该网址已正确重写。
我也直接从吊舱内部点击了服务,效果也很好。
#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请求,则请求将到达该应用程序(但它无法处理它们)
答案 0 :(得分:2)
如果请求标头无效(如其中的特殊字符),Nginx将以400静默失败。您可以使用tcpdump进行调试。