如何将70%的流量路由到ExternalName服务并附加url?

时间:2018-12-27 09:43:28

标签: kubernetes traefik kubernetes-ingress istio

我想将来自服务A的流量的70%路由到外部端点并附加URL。

为此,我创建了一个externalName类型的服务,该服务指向外部端点,然后使用treafik入口控制器将权重划分为百分比。

我的服务定义如下:

    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: wensleydale
    spec:
      ports:
      - name: http
        targetPort: 80
        port: 80
      selector:
        app: cheese
        task: wensleydale

    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: test-service
    spec:
      type: ExternalName
      externalName: www.google.com
      ports:
      - name: http
        targetPort: 80
        port: 80
      selector:
        app: cheese
        task: test-service

Ingress.yaml:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        traefik.ingress.kubernetes.io/service-weights: |
          test-service: 70%
          wensleydale: 30%
      name: cheese
    spec:
      rules:
      - http:
          paths:
          - backend:
              serviceName: test-service
              servicePort: 80
            path: /
          - backend:
              serviceName: wensleydale
              servicePort: 80
            path: /

我还想要在流量进入test-service时添加路径。
在我的test-service中,我希望URL像www.google.com/something

我愿意使用其他工具来实现这一目标。

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  1. 使用Istio Ingress网关而不是traefik网关。在Istio中,建议使用Istio Ingress Gateway进行Ingress控制。参见https://istio.io/docs/tasks/traffic-management/ingress/

  2. 在相应的虚拟服务中,使用HTTPRewrite指令https://istio.io/docs/reference/config/istio.networking.v1alpha3/#HTTPRewrite

rewrite: uri: /something

答案 1 :(得分:1)

很遗憾,您遇到了限制。 traefik入口文档在加权时说明了这种情况-“关联的服务后端必须共享相同的路径和主机”。 (https://docs.traefik.io/user-guide/kubernetes/#traffic-splitting)因此,您不能只为其中一个加权目标重写路径。该限制来自https://github.com/kubernetes/kubernetes/issues/25485,因此您可以在那里看到建议,其中很多建议都提到了istio。 (另请参见https://github.com/zalando/skipper/issues/324

一个简单的解决方案可能是将另一个代理部署到群集中,并使用该代理将目标重写为您无法更改的内部服务。这样您的Ingress就可以为两者使用相同的路径。

另一种方法是查看使用conf文件而不是入口注释配置代理。配置片段可能足以实现此目的,但我不确定。我怀疑您最好部署一个额外的代理,并在外部公开它并直接进行配置(避免使用Ingress抽象)。