使用Nginx Ingress只重写特定的路由

off*_*cer 5 nginx kubernetes kubernetes-ingress nginx-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
Run Code Online (Sandbox Code Playgroud)

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

是否可以/api通过myapp-api服务将请求提供给服务,但将这些请求重写/为服务而无需创建另一个Ingress?因此,myapp-api应该将请求提供给myapp.westeurope.cloudapp.azure.com/api/v1/myresource

Nee*_*koy 1

您有两个选择:

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

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

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

  • 我知道选项 b),但我想保持 api 服务不变。您能否详细说明如何实现方法 a)?我真的不明白如何实现这一点。 (2认同)