Как использовать подмножества при балансировке нагрузки между версиями приложения с istio? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть следующая служба:

apiVersion: v1
kind: Service
metadata:
  name: downstream-service
spec:
  type: ClusterIP
  selector:
    app: downstream
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

, которую я бы хотел сбалансировать на основе версии приложения, которую я определил следующим образом в развертываниях:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: downstream-deployment-v1
  labels:
    app: downstream
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: downstream
      version: v1
  template:
    metadata:
      labels:
        app: downstream
        version: v1
    spec:
      containers:
      - name: downstream
        image: downstream:0.1
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: downstream-deployment-v2
  labels:
    app: downstream
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: downstream
      version: v2
  template:
    metadata:
      labels:
        app: downstream
        version: v2
    spec:
      containers:
      - name: downstream
        image: downstream:0.2
        ports:
        - containerPort: 80

Сейчас это направляет трафик c 50/50, как ожидалось в обоих этих развертываниях, но я хотел бы настроить веса в соответствии с https://istio.io/latest/docs/reference/config/networking/virtual-service/#HTTPRouteDestination, поэтому я определил DestinationRule и VirtualService:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: downstream-destination
spec:
  host: downstream-service.svc.cluster.local
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: downstream-virtualservice
spec:
  hosts:
  - downstream-service.svc.cluster.local
  http:
  - name: "downstream-service-v1-routes"
    route:
    - destination:
        host: downstream-service.svc.cluster.local
        subset: v1
      weight: 5
  - name: "downstream-service-v2-routes"
    route:
    - destination:
        host: downstream-service.svc.cluster.local
        subset: v2
      weight: 95

, но с этим я все еще получаю разделение 50/50.

Я пробовал заменить downstream-service.svc.cluster.local только downstream-service, но результат был без weight s определенный в yaml и с удаленными subset s, я бы получил разделение 50/50, но когда я добавил подмножество (без весов), я получил бы весь трафик c на экземпляре v1.

Что я здесь делаю не так?


EDIT

Это может быть причиной, но я не уверен, что делать это:

$ istioctl x describe service downstream-service
Service: downstream-service
   Port:  80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
   Matching subsets: v1,v2
   No Traffic Policy
VirtualService: downstream-route
   2 HTTP route(s)
$ istioctl x describe pod downstream-deployment-v2-69bdfc8fbf-bm22f
Pod: downstream-deployment-v2-69bdfc8fbf-bm22f
   Pod Ports: 80 (downstream), 15090 (istio-proxy)
--------------------
Service: downstream-service
   Port:  80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
   Matching subsets: v2
      (Non-matching subsets v1)
   No Traffic Policy
VirtualService: downstream-route
   1 additional destination(s) that will not reach this pod
      Route to non-matching subset v1 for (everything)
$ istioctl x describe pod downstream-deployment-v1-65bd866c47-66p9k
Pod: downstream-deployment-v1-65bd866c47-66p9k
   Pod Ports: 80 (downstream), 15090 (istio-proxy)
--------------------
Service: downstream-service
   Port:  80/auto-detect targets pod port 80
DestinationRule: downstream-service for "downstream-service"
   Matching subsets: v1
      (Non-matching subsets v2)
   No Traffic Policy
VirtualService: downstream-route
   1 additional destination(s) that will not reach this pod
      Route to non-matching subset v2 for (everything)

EDIT2

Итак, я запустил kiali, чтобы увидеть, что:

enter image description here

Вес принимается равным 100 потому что существует только один пункт назначения маршрута

https://kiali.io/documentation/v1.13/validations/#_the_weight_is_assumed_to_be_100_because_there_is_only_one_route_destination

Не знаю, как это исправить.

1 Ответ

1 голос
/ 19 июня 2020

Хорошо, похоже, я пропустил одну большую опечатку с моей стороны, которая заключалась в том, что это routes, у которых много destination, которые взвешены, а не http, у которого много взвешенных route s.

Итак, правильная версия моего VirtualService выглядит следующим образом:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: downstream-service
spec:
  hosts:
  - downstream-service
  http:
  - name: "downstream-service-routes"
    route:
    - destination:
        host: downstream-service
        subset: v1
      weight: 10
    - destination:
        host: downstream-service
        subset: v2
      weight: 90
...