【问题标题】:Rewriting Kubernetes services in an Nginx ingress在 Nginx 入口中重写 Kubernetes 服务
【发布时间】:2019-05-15 09:34:52
【问题描述】:

我有多个 API 都在监听“/api”,还有一个 Web 前端在监听“/”。

有没有一种方法可以编写我的入口定义来将路径重写为以下内容?

/api/      -> /api/ on service1
/api2/api/ -> /api/ on service2
/api3/api/ -> /api/ on service3
/          -> /     on service4

我知道我可以更改 API 以收听其他内容,但我不想这样做。我知道我也可以将所有内容重写为 /api/ 并让 service3 作为默认值,但将来可能会有其他服务需要路由到其他地方。

我听说您可以使用多个入口,但我不确定这会如何影响性能以及这样做是否是最佳做法。

另外,有没有办法调试哪个路由去哪个服务?

谢谢, 詹姆斯

【问题讨论】:

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


    【解决方案1】:

    在@Rahman 的帮助下 - 查看其他答案。我已经设法让它与单个入口一起工作。

    由于字数限制,我不得不将此作为附加答案发布。

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress-name
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$1
    spec:
      tls:
      - secretName: tls-secret
      rules:
      - host: localhost
        http:
          paths:
          - path: /(api/.*)
            backend:
              serviceName: service1
              servicePort: 80
          - path: /api2/(api.*)
            backend:
              serviceName: service2
              servicePort: 80
          - path: /api3/(api.*)
            backend:
              serviceName: service3
              servicePort: 80
          - path: /(.*)
            backend:
              serviceName: service4
              servicePort: 80
    

    只是为将来遇到此问题的其他人提供上下文,服务 1 是主要 API,服务 2 和 3 是另一个子域下的其他 API,服务 4 是 Web 前端。

    【讨论】:

      【解决方案2】:

      如果您使用的是 Nginx,您应该能够像这样配置 Ingress 以进行路径匹配:

      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: test-ingress
        annotations:
          nginx.ingress.kubernetes.io/rewrite-target: /$1
      spec:
        rules:
        - host: test.com
          http:
            paths:
            - path: (/api/.*)
              backend:
                serviceName: service1
                servicePort: 80
      ---
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: test-ingress-2
        annotations:
          nginx.ingress.kubernetes.io/use-regex: "true"
      spec:
        rules:
        - host: test.com
          http:
            paths:
            - path: /api2/.*
              backend:
                serviceName: service2
                servicePort: 80
            - path: /api3/.*
              backend:
                serviceName: service3
                servicePort: 80
            - path: /.*
              backend:
                serviceName: service4
                servicePort: 80
      
      

      More info

      【讨论】:

      • 嗨,对不起,我的重写路径有点错误 - 我已经更新了问题:)
      • 感谢您的帮助,我已按照您提供的内容进行操作,但 API2 等 API 似乎无法正常工作。有没有办法调试路径被重写的内容?我需要 API2 来监听 /api2/api/xyz 但将它传递给像 /api/xyz 这样的服务 另外,使用多个入口有什么缺点吗?对我来说似乎有点乱。
      • 我可能应该添加其他路由(/api/ 和 /)按预期工作。我只需要在将请求转发到服务之前去掉“api2/”部分
      • 真棒@JamesB。我可以看到你的编辑。你可以请rewrite-target 只检查两个入口吗?我的意思是从第二个中删除 use-regex 并验证它是否仍然有效。因为我认为其中之一就足够了。
      • 感谢@Rahman 的所有帮助 - 我在代码中添加了另一个答案以实现这一点,以便将来遇到此问题的其他人可以看到。
      猜你喜欢
      • 2019-07-17
      • 2020-10-13
      • 2022-06-16
      • 2020-05-22
      • 1970-01-01
      • 2018-10-04
      • 2020-08-14
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多