多个 nginx 入口重写的默认路径

Mig*_*edo 6 kubernetes kubernetes-ingress

这是我的情况,我在 kubernetes (ingress) 上,有两个 docker 图像:一个专门用于网络,第二个用于 api。

在下一个配置下(在消息的末尾):/web将显示将调用 的前端/api一切都很好

但是/是 404,因为没有定义任何内容,我无法在入口配置中找到/应该重定向到的方法/web

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dev-ingress
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - demo.com
    secretName: tls-secret
  rules:
  - host: demo.com
    http: 
      paths:
      - path: /api
        backend:
          serviceName: api-app
          servicePort: 8080
      - path: /web
        backend:
          serviceName: web-app
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

Rya*_*son 5

这取决于您的前端和后端应用程序对路径的期望。通常,前端需要能够在某个外部路径上找到后端/api,在您的情况下,听起来您的后端需要在与集群内工作的路径不同的外部路径 ( ) 上可用( /)。您可以重写 api 请求的目标,以便将请求路由到后端时/api转到:/

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dev-ingress-backend
  annotations:
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - demo.com
    secretName: tls-secret
  rules:
  - host: demo.com
    http: 
      paths:
      - path: /api
        backend:
          serviceName: api-app
          servicePort: 8080
Run Code Online (Sandbox Code Playgroud)

您还可以为不重写目标的前端定义一个单独的入口(使用不同的名称),以便/web将请求发送到/web它:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dev-ingress-frontend
  annotations:
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - hosts:
    - demo.com
    secretName: tls-secret
  rules:
  - host: demo.com
    http: 
      paths:
      - path: /web
        backend:
          serviceName: web-app
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)