使用Istio在K8s集群内部路由加权流量

时间:2019-12-09 08:14:55

标签: kubernetes google-kubernetes-engine istio eks

我有2个应用程序(Web和Api),分别有2个服务和2个Istio virtualServices。每个服务还有2个版本(v1和v2)。

我想做三件事-

  1. 对于Web,除 test-user 之外的所有流量都只会将 100%路由到版本 v1

    < / li>
  2. 对于Web,对于测试用户,流量只会将 100%路由到版本 v2 (反之亦然)第一点。)。质量检查小组上线之前,将对版本 v2 执行测试,一旦获得质量检查小组验证,会将流量从 100%迁移到 v2 每个用户并删除版本 v1

  3. 对于Api,对于版本 v1 (稳定),流量将分布 95%,对于版本 v2的流量分布为 5% (发布)。

Web清单文件:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: web-vs
spec:
  hosts:
  - web.example.com
  http:
  - match:
    - headers:
        end-user:
          exact: test-user
    route:
    - destination:
        host: web-svc
        subset: v2
  - route:
    - destination:
        host: web-svc
        subset: v1
---
apiVersion: v1
kind: Service
metadata:
  name: web-svc
  labels:
    app: web
spec:
  ports:
  - name: http
    port: 3000
    targetPort: 3000
  selector:
    app: web

API清单文件:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api-vs    -------------> #1
spec:
  hosts:
  - api-svc
  http:
  - route:
    - destination:
        host: api-svc
        subset: v1
        weight: 95
    - destination:
        host: api-svc
        subset: v2
        weight: 5
---
apiVersion: v1
kind: Service
metadata:
  name: api-svc    -------------> #2
  labels:
    app: api
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 8000
  selector:
    app: api

流量路由策略-

  1. 当我们点击URL web.example.com 时,它将通过服务 web-svc 提供流量。 (已设置)

  2. 在后端,服务 web-svc 将在内部调用服务 api-svc ,服务 api-svc 将分发流量 95% v1 5% v2 。 (这就是我努力应对的路由问题。)

1 个答案:

答案 0 :(得分:0)

我认为问题在于缩进和主机。在Istio docs中,尝试执行以下操作:

  var stRef = st.ref(`event-photos/${eventId}`); // st is firebase.storage()
  var upTask = stRef.put(this.fileBlob);

  upTask
    .then(snapshot => {
      return snapshot.ref.getDownloadUrl();
    })
    .then(url => {
      return db
        .collection('events')
        .doc(eventId)
        .set({
          image_url: url
        });
    })
    .catch(error => {
      alert(error.message);
    });

已编辑:目标主机。