【问题标题】:How do I host multiple services using subdirectories with nginx-ingress?如何使用带有 nginx-ingress 的子目录托管多个服务?
【发布时间】:2020-03-17 15:36:59
【问题描述】:

问题

我想在不同路径下的单个域名上托管多个服务。问题是我无法使用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 目录(该目录不存在)。

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) 上托管

【问题讨论】:

  • 请附上你的入口控制器的 YAML。您使用kubernetes.io/ingress.class: nginx,但不清楚如何运行入口控制器。它应该有 - '--ingress-class=nginx' 作为命令字段的参数
  • @KonstantinVustin - 我正在使用 helm 安装前端。看起来它将类指定为nginx:github.com/helm/charts/blob/master/stable/nginx-ingress/…

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


【解决方案1】:

这不太可能是 AKS 的问题,因为您使用的组件在 Kubernetes 层之上工作。但是,如果您想确保可以将其部署在本地 minikube 之上并查看问题是否仍然存在。

还有一些其他的事情需要考虑:

  1. 有一个detailed guide 关于在 AKS 上创建入口控制器。该指南是最新的,并确认可以正常工作。

本文向您展示如何部署 NGINX 入口控制器 Azure Kubernetes 服务 (AKS) 群集。 cert-manager 项目是 用于自动生成和配置 Let's Encrypt 证书。最后,两个应用程序在 AKS 集群中运行, 每个都可以通过一个 IP 地址访问。

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

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

  1. 请记住:

操作员通常希望将此组件安装到 kube-system 命名空间的默认服务帐户所在的命名空间 将确保有足够的权限来观看 Ingress 资源 集群范围内。

如果有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2019-09-05
    相关资源
    最近更新 更多