首页 > 解决方案 > 带有 url 参数的 Kubernetes 入口路由

问题描述

因为明天我将没有 wifi,所以这更像是某种理论制作。我需要在“离线模式”下准备入口文件。

我想从 到ApplicationA路由ApplicationB。这些路由有望携带 url 参数。两个应用程序都使用spring bootREST。集群(当前)由minikube.

因此,例如,我在ServiceA:中得到了这个 url http://url.com/customerapi/getCustomerById?id=5。这个 url 应该命中一个在ApplicationB. ApplicationB可使用customerservice端口 31001 访问。

是不是像下面的入口那么简单?这几乎是直截了当的。此致。

我会这样定义kubernetes ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: serviceA
spec:
  rules:
  - http:
      paths:
      - path: /customerapi
        backend:
          serviceName: customerservice
          servicePort: 31001

标签: spring-bootkubernetes

解决方案


如果我理解正确,您希望根据 url 将来自网络的流量路由到两个后端。

您可以通过以下方式设置 Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: url.com
    http:
      paths:
      - path: /test1
        backend:
          serviceName: test1-svc
          servicePort: 80
      - path: /test2
        backend:
          serviceName: test2-svc
          servicePort: 80

这将路由所有从url.com/test1到后端test1-svc和所有从url.com/test2到后端test2-svc

如果你需要使用里面的参数Url,我认为下面的方法可以工作:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    ingress.kubernetes.io/query-routing: default/query-routing
spec:
  backend:
    serviceName: default-backend
    servicePort: 80
  rules:
  - host: url.com

---

kind:ConfigMap
apiVersion: v1
metadata:
  name: query-routing
data:
  mapping: |-
    [{
      "field": "getCustomerById",
      "value": "1",
      "path": "customerapi/",
      "service": "customerservice",
      "port": "31001"
    }]

但是请在您的示例中对其进行测试,因为您的问题中没有足够的细节。

有一种方法可以通过Header 使用nginx.ingress.kubernetes.io/server-snippet注释来捕获参数。Shopify 正在使用这个特定的,用法在此处进行说明。有关更多注释,请查看 Kubernetes NGINX Ingress Controller


推荐阅读