Как использовать переменные в Istio VirtualService?

#kubernetes #routes #istio

#kubernetes #маршруты #istio

Вопрос:

В настоящее время я работаю над случаем, когда нам нужно динамически создавать сервисы и предоставлять к ним доступ через подпутки URI главного шлюза.

Я планирую использовать виртуальные сервисы для маршрутизации трафика для них. Виртуальная служба для конкретной службы должна выглядеть так:

 apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: subpaths-routes
spec:
  hosts:
  - mainservice.prod.svc.cluster.local
  http:
  - name: "subpath-redirection"
    match:
    - uri:
        prefix: "/bservices/svc-2345-6789"
    route:
    - destination:
        host: svc-2345-6789.prod.svc.cluster.local
  

Но таких сервисов может быть огромное количество (например, тысячи). Все они следуют одному и тому же шаблону маршрутизации.
Я хотел бы знать, есть ли в Istio механизм для указания VirtualService с переменными / параметрами, подобными следующим:

 apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: subpaths-routes
spec:
  hosts:
  - mainservice.prod.svc.cluster.local
  http:
  - name: "subpath-redirection"
    match:
    - uri:
        prefix: "/bservices/"{{ variable }}
    route:
    - destination:
        host: {{ variable }}.prod.svc.cluster.local
  

В Nginx можно сделать аналогичную вещь, указав что-то вроде этого:

 location ~ /service/(?<variable>[0-9a-zA-Z_-] )/ {
  proxy_pass http://$variable:8080;
}
  

Есть ли способ в Istio для этого?
А если нет, то как тысячи виртуальных машин повлияют на производительность обработки запросов? Дорого ли содержать их с точки зрения потребления процессора и оперативной памяти?

Заранее благодарю!

Ответ №1:

Как использовать переменные в Istio VirtualService?

Насколько я знаю, в istio нет такой опции, чтобы указывать переменную в префиксе и хосте, если бы это был только префикс, вы могли бы попробовать использовать регулярное выражение вместо префикса.


Если вы хотите каким-то образом автоматизировать это, я имею в виду создать переменную и ввести ее как в prefix, так и в host, тогда вы можете попробовать сделать это с помощью helm.

В helm есть несколько примеров для виртуального сервиса.


как тысячи виртуальных серверов повлияют на производительность обработки запросов?

По этому поводу есть проблема с github, о чем упоминал @lanceliuu

Когда мы создаем ~ 1 тыс. виртуальных сервисов в одном кластере, входной шлюз медленно получает новые виртуальные сервисы.

Так что это может быть одной из проблем с тысячами виртуальных сервисов.

Дорого ли содержать их с точки зрения потребления процессора и оперативной памяти?

Я бы сказал, что это потребует тестирования. Я проверил вышеупомянутую проблему с github, и они упомянули, что для компонентов istio нет нагрузки на память / процессор, но я не могу сказать, насколько это дорого.

Теоретически вы могли бы создать 1 большую виртуальную службу вместо тысяч, но, как упоминалось в документации, вам лучше разделить большие виртуальные службы на несколько ресурсов.


Дополнительные ресурсы:

Комментарии:

1. Спасибо за ответ и особенно за ссылки!