Может ли istio поддерживать маршрут к другому сервису по динамической части пути uri?
Я знаю, что istio поддерживает маршрут к другому сервису по статическому правилу, как показано ниже:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-virtualservice
spec:
hosts:
- "*"
gateways:
- my-gateway
http:
- match:
- uri:
prefix: /applications/app-a
route:
- destination:
host: app-a
port:
number: 9080
Но у меня есть требование, чтобы я динамически создавал сервисы, когда появляется новый пользователь или приходит новая конфигурация. Если я использую "статический" способ, то мне приходится каждый раз создавать новый виртуальный сервис или обновлять существующий виртуальный сервис.
Я не нахожу документацию, в которой упоминается этот вид использования, но могу ли я использовать что-то вроде "regex" или какой-то другой способ создать одно правило, которое будет применяться ко всем этим вновь создаваемым сервисам без обновления виртуальных сервисов каждый раз? Ниже что-то не работает, но попробуйте продемонстрировать мою идею:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-virtualservice
spec:
hosts:
- "*"
gateways:
- my-gateway
http:
- match:
- uri:
regex: /applications/(?<appname>.*)
route:
- destination:
host: $('appname')--svc
port:
number: 9080
Конечно, любое предложение будет с благодарностью. Благодарю.
2 ответа
Я не думаю, что Истио может сделать то, что вы просите. Хорошей стороной этого является то, что вы должны контролировать все точки входа в ваш кластер - какое приложение доступно и как оно доступно - меньше дыр в безопасности.
Я не уверен, но на GitHub они используют регулярные выражения в VirtualService
:
- match:
- headers:
cookie:
regex: "^(.*?;)?(user=dev-123)(;.*)?"
так что вы можете попробовать использовать что-то вроде:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-virtualservice
spec:
hosts:
- "*"
gateways:
- my-gateway
http:
- match:
- uri:
prefix:
regex: "/applications/(?<appname>.*)"
route:
- destination:
host: match_group['appname']
port:
number: 9080
вместо regix