我想将来自服务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
我愿意使用其他工具来实现这一目标。
答案 0 :(得分:2)
您可以执行以下操作:
使用Istio Ingress网关而不是traefik网关。在Istio中,建议使用Istio Ingress Gateway进行Ingress控制。参见https://istio.io/docs/tasks/traffic-management/ingress/
在相应的虚拟服务中,使用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抽象)。