#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 есть несколько примеров для виртуального сервиса.
- https://github.com/streamsets/helm-charts/blob/master/incubating/control-hub/templates/istio-gateway-virtualservice.yaml
- https://github.com/salesforce/helm-starter-istio/blob/master/templates/virtualService.yaml
как тысячи виртуальных серверов повлияют на производительность обработки запросов?
По этому поводу есть проблема с github, о чем упоминал @lanceliuu
Когда мы создаем ~ 1 тыс. виртуальных сервисов в одном кластере, входной шлюз медленно получает новые виртуальные сервисы.
Так что это может быть одной из проблем с тысячами виртуальных сервисов.
Дорого ли содержать их с точки зрения потребления процессора и оперативной памяти?
Я бы сказал, что это потребует тестирования. Я проверил вышеупомянутую проблему с github, и они упомянули, что для компонентов istio нет нагрузки на память / процессор, но я не могу сказать, насколько это дорого.
Теоретически вы могли бы создать 1 большую виртуальную службу вместо тысяч, но, как упоминалось в документации, вам лучше разделить большие виртуальные службы на несколько ресурсов.
Дополнительные ресурсы:
Комментарии:
1. Спасибо за ответ и особенно за ссылки!