使用主机和路径的Nginx入口错误404

时间:2019-10-25 16:08:37

标签: nginx kubernetes-ingress azure-kubernetes

我在Azure云上使用Kubernetes,并且已经安装了zipkin。 我已经安装了nginx ingress,并且如果使用以下主机规则,则可以正常运行:


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
  namespace: nginx-ingress
spec:
    - host: zipkin.hostname.com
      http:
        paths:
          - backend:
              serviceName: zipkin
              servicePort: 9411

但这不是我想要的。我想要的是诸如hostname.com/zipkin之类的东西。

我尝试过此操作,但出现404错误:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
  namespace: nginx-ingress
spec:
  rules:
  - http:
      paths:
        - path: /zipkin
          backend:
            serviceName: zipkin
            servicePort: 9411

我该怎么办?

编辑: 我试图添加主机,并在执行describe命令后得到了这个信息

Name:             NAME
Namespace:        NAMESPACE
Address:
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host           Path  Backends
  ----           ----  --------
  hostname.com
                 /zipkin   zipkin:9411 (10.244.0.63:9411)

编辑: 我通过添加重写规则注释解决了我的问题

nginx.org/rewrites: >
      serviceName=zipkin rewrite=/;

3 个答案:

答案 0 :(得分:0)

这是因为您在这里没有提到new RestTemplateXhrTransport()

host

答案 1 :(得分:0)

首先,上一个答案是错误的,除非您要设置DNS,否则无需指定host,这不是强制性的。

第二,后端zipkin需要/zipkin URI来响应吗?如果是这种情况,则重写批注将删除URI。因此,您需要像这样更改yaml,以将/zipkin传递到您的后端。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
  namespace: nginx-ingress
spec:
  rules:
  - http:
      paths:
        - path: /zipkin
          backend:
            serviceName: zipkin
            servicePort: 9411

答案 2 :(得分:0)

只是为了阐明OP问题。

有不同的ingress Controllers

注意:

  

创建入口时,应使用适当的ingress.class注释每个入口,以指示如果集群中存在多个入口控制器,则应使用哪个入口控制器。

     

如果您未定义类,则您的云提供商可能会使用默认的入口控制器。

     

理想情况下,所有入口控制器都应满足此规范,但是各种入口控制器的操作略有不同。

使用此注释:

<Route>

您似乎正在使用nginxinc提供的NGINX Ingress Controller。

您可以找到有关nginxinc here为NGINX Ingress Controller提供的重写支持的更多信息。

示例:

react-router

它与kubernetes/ingress-nginx repo的kubernetes社区不同。 不同的入口控制器具有不同的配置和注释。

因此对于此示例:

Main

测试:

nginx.org/rewrites: >
      serviceName=zipkin rewrite=/;