为什么 nginx 在我的 Kubernetes Ingress 路由上返回 404?

为什么 nginx 在我的 Kubernetes Ingress 路由上返回 404?

我设置了两个 nginx Web 服务器。一个设置在 AWS Elastic Beanstalk 上,另一个设置在 Kubernetes 上,使用 stable/nginx-ingress helm chart。

Elastic Beanstalk Web 服务器将来自我域的所有子路由的流量转发到 Kubernetes nginx Web 服务器。我可以通过检查 Kubernetes nginx 的日志来验证这些流量是否被正确转发。我使用 Ingress 资源来确保这些流量被转发到正确的 Kubernetes 服务。

问题在于:两条路由中的一条,即主/路由,被转发到正确的服务并返回 200。另一条路由,/eks-test应该路由到相同的服务,但却返回 404。这怎么可能?

眼镜

Kubernetes 上的 nginx 正在运行 nginx 0.25.1

Nginx 日志:

172.16.10.103 - [172.16.10.103] - - [12/Sep/2019:08:05:09 +0000] "GET / HTTP/1.0" 200 8 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 703 0.004 [default-eks-test-repo-80] [] 172.16.10.100:8080 8 0.004 200 90dfa37364a5c43e57f12c5fb1a2d86f
172.16.40.108 - [172.16.40.108] - - [12/Sep/2019:08:05:12 +0000] "GET /eks-test HTTP/1.0" 404 9 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 730 0.002 [default-eks-test-repo2-80] [] 172.16.43.125:8080 9 0.004 404 ef1c81bba75dff2bdd2376799aa93c56

第一个 nginx 配置(Elastic Beanstalk):

server {
    listen 80;
    
    server_name my.domain.com;

    location / {

        proxy_pass http://internal.my.domain.lan/;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Kubernetes Ingress 资源:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: internal
  name: eks-test
  namespace: default
spec:
  rules:
    - host: my.domain.com
      http:
        paths:
          - path: /
            backend:
              serviceName: eks-test-repo
              servicePort: 80
          - path: /eks-test
            backend:
              serviceName: eks-test-repo
              servicePort: 80

Kubernetes 服务:

kind: Service
apiVersion: v1
metadata:
  name: eks-test-repo
  namespace: default
  labels:
    name: eks-test-repo
spec
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: eks-test-repo
  type: ClusterIP

Nginx helm chart 值(非默认值):

controller.ingressClass: internal

即使将 ingress.kubernetes.io/rewrite-target: / 添加到我的注释中,基于路径的路由也不起作用,但主机基础路由可以正常工作。除了 rewrite-target 之外,ingress yaml 文件中是否还需要进行任何更改。为什么基于路径的路由不起作用。youtube 上有很多与入口路径基础路由相关的视频,如果遵循其中的大部分,但仍然面临同样的问题。

答案1

Nginx Ingress 不会剥离您的请求的路径。

当你/eks-test在 Ingress 上发出请求时,请求将转发到你的服务(包括路径),并以 结尾进入你的容器"GET /eks-test HTTP/1.0"。然后你的容器返回404,因为它没有路由/eks-test

如果你想从请求中剥离路径,你可以配置一些重写规则(例如:设置nginx.ingress.kubernetes.io/rewrite-target: /注释)。

相关内容