【发布时间】: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