Может ли 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

Другие вопросы по тегам