【问题标题】:Rewrite only specific route with nginx Ingress仅使用 nginx Ingress 重写特定路由
【发布时间】:2019-01-20 01:47:15
【问题描述】:

我的后端运行了三个服务,并且 Ingress 路由定义如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - myapp.westeurope.cloudapp.azure.com
    secretName: acme-crt-secret
  rules:
  - host: myapp.westeurope.cloudapp.azure.com
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-mvc
          servicePort: 80
      - path: /api
        backend:
          serviceName: myapp-api
          servicePort: 80
      - path: /identity
        backend:
          serviceName: myapp-identity
          servicePort: 80

问题是 myapp-api 已经在监听对/api/v1/myresource 的请求。在当前配置下,myapp-api 服务仅向myapp.westeurope.cloudapp.azure.com/api/api/v1/myresource 提供请求(请注意.../api/api/...)。

是否可以通过 myapp-api 服务向 /api 提供请求,但在不创建另一个 Ingress 的情况下将这些请求重写为服务的 /?因此,myapp-api 应该为myapp.westeurope.cloudapp.azure.com/api/v1/myresource 提供请求。

【问题讨论】:

  • 你解决了这个问题吗?
  • 不完全令人满意。在我的例子中,我使用 .NET Core 作为服务,它为提取第一个路径的 http 请求 (UsePathBase(...)) 提供了一个中间件。我认为其他选择是使用 nginx 以外的其他入口实现,或者使用多个入口。

标签: nginx kubernetes kubernetes-ingress nginx-ingress


【解决方案1】:

你有两个选择:

a) 更改 API 的端口并让它在该端口上服务/。

b) 更改您的应用,使其在“/v1/myresource”上提供 API,并通过 Ingress 为其提供 URL 的“api”部分。

无论哪种方式,您都可以在“myapp.westeurope.cloudapp.azure.com/api/v1/myresource”获得资源。

【讨论】:

  • 我知道选项 b) 但我想保持 api 服务不变。您能否详细说明如何实现 a) 方法?我真的不明白如何做到这一点。
猜你喜欢
  • 2018-12-12
  • 2018-09-12
  • 2021-09-17
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2015-09-30
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多