为什么Nginx在我的Kubernetes入口路由上返回404?

时间:2019-09-12 10:17:32

标签: nginx networking kubernetes proxy routing

我设置了两个nginx Web服务器。一种是在AWS Elastic Beanstalk上设置的,另一种是使用稳定/ nginx-ingress舵图在Kubernetes上设置的。

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

这是问题: 两条路由之一(主/路由)转发到正确的服务并返回200。另一条路由/eks-test应该路由到同一服务,但返回404。 这怎么可能?

规格

Kubernetes上的nginx正在运行nginx 0.25.1。我正在AWS EKS 1.14版上运行Kubernetes。

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入口资源:

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掌舵图表值(不是默认值):

controller.ingressClass: internal

3 个答案:

答案 0 :(得分:1)

此问题的答案可以找到here

基本上,路径没有被重写为/,但Pod中的Web服务器仅在根路径上侦听。添加nginx.ingress.kubernetes.io/rewrite-target: /批注解决了该问题。

答案 1 :(得分:0)

请使用以下配置,它可能会解决您的问题。

annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/rewrite-target: "/"
    ingress.kubernetes.io/configuration-snippet: |
      sub_filter_once on;
      sub_filter '<base href="/">' '<base href="/{{$definitionName}}/">';
spec:
  rules:
  - http:
      paths:
      - path: /{{$definitionName}}
        backend:
          serviceName: {{$definitionName}}
          servicePort: 80

此致

Vaibhav巨蛋

答案 2 :(得分:0)

您应该从Nginx配置中删除以下行:

proxy_set_header        Host $host;

它重写了主机名,而Kubernetes找不到目标主机。