如何使用带有nginx-ingress的子目录托管多个服务?

时间:2019-11-21 16:23:18

标签: nginx kubernetes url-rewriting kubernetes-ingress nginx-ingress

问题

我想在不同路径下的单个域名上托管多个服务。问题是我无法使用nginx-ingress重写请求路径。

我尝试过的事情

我已经使用these instructions安装了nginx-ingress:

helm install stable/nginx-ingress --name nginx-ingress --set controller.publishService.enabled=true
CHART                   APP VERSION
nginx-ingress-0.3.7     1.5.7

该示例非常适合基于主机名的后端:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: first.testdomain.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-first
          servicePort: 80

但是,我无法进行路径重写。该版本将请求重定向到hello-kubernetes-first服务,但不进行路径重写,因此我从该服务中收到404错误,因为它正在该服务中查找/ foo目录(不存在)。 / p>

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: first.testdomain.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-first
          servicePort: 80
        path: /foo

我也尝试过this example进行路径/重写:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hello-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: first.testdomain.com
    http:
      paths:
      - backend:
          serviceName: hello-kubernetes-first
          servicePort: 80
        path: /foo(/|$)(.*)

但是请求甚至都没有定向到hello-kubernetes-first服务。

看来我的重写配置没有将其写入/etc/nginx/nginx.conf文件。当我运行以下命令时,没有任何结果:

kubectl exec nginx-ingress-nginx-ingress-XXXXXXXXX-XXXXX  cat /etc/nginx/nginx.conf | grep rewrite

如何使路径重写起作用?

其他信息:

  • kubectl / kubernetes版本:v1.14.8
  • 在Azure Kubernetes服务(AKS)上托管

1 个答案:

答案 0 :(得分:0)

这不是AKS的问题,因为您使用的组件正在Kubernetes层上运行。但是,如果要确保可以在本地将其部署在minikube之上,然后查看问题是否仍然存在。

还有其他几件事要考虑:

  1. detailed guide关于在AKS上创建入口控制器。该指南是最新的,并且可以正常使用。
  

本文向您展示了如何在以下位置部署NGINX入口控制器   Azure Kubernetes服务(AKS)群集。证书经理项目是   用于自动生成和配置“让我们加密”   证书。最后,两个应用程序在AKS集群中运行,   每个都可以通过一个IP地址访问。

  1. 您可能还想使用Traefik之类的替代方法:
  

Traefik是现代的HTTP反向代理和负载均衡器,用于   轻松部署微服务。

  1. 请记住:
  

操作人员通常希望将此组件安装到   kube-system名称空间,该名称空间的默认服务帐户   将确保有足够的特权来观看Ingress资源   整个集群。

请让我知道是否有帮助。