Я пытаюсь реализовать глобальное ограничение скорости для соединений tcp через входной шлюз istio.Я следил за официальными документами для реализации глобальной службы ограничителя скорости http и сумел заставить ее работать. https://istio.io/latest/docs/tasks/policy-enforcement/rate-limit/, но не обрабатывает TCP-соединения.
Вот конфиги ограничения скорости http
версия API: networking.istio.io/v1alpha3
тип: EnvoyFilter
метаданные:
имя: предел скорости фильтра
#namespace: istio-вход
спецификация:
Селектор рабочей нагрузки:
# выбрать по метке в том же пространстве имен
этикетки:
Истио: вход
configPatches:
# Конфигурация Envoy, которую вы хотите изменить
- применить к: HTTP_FILTER
соответствовать:
контекст: ШЛЮЗ
слушатель:
фильтрЦепь:
фильтр:
имя: "envoy.filters.network.http_connection_manager"
подфильтр:
имя: "envoy.filters.http.router"
пластырь:
операция: INSERT_BEFORE
# Добавляет Envoy Rate Limit Filter в цепочку фильтров HTTP.
стоимость:
имя: envoy.filters.http.ratelimit
типизированная_конфигурация:
"@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
# домен может быть любым! Сопоставьте его с конфигурацией сервиса ratelimter
домен: ctfd-ratelimit
failure_mode_deny: правда
тайм-аут: 10 сек.
rate_limit_service:
grpc_service:
envoy_grpc:
имя_кластера: rate_limit_cluster
тайм-аут: 10 сек.
транспорт_апи_версия: V3
- применить к: КЛАСТЕР
соответствовать:
контекст: ШЛЮЗ
кластер:
сервис: ratelimit.istio-ingress.svc.cluster.local
пластырь:
операция: ДОБАВИТЬ
# Добавляет кластер службы ограничения скорости для службы ограничения скорости, определенной на шаге 1.
стоимость:
имя: rate_limit_cluster
тип: STRICT_DNS
connect_timeout: 10 с
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
имя_кластера: rate_limit_cluster
конечные точки:
- lb_конечные точки:
- конечная точка:
адрес:
адрес_сокета:
адрес: ratelimit.istio-ingress.svc.cluster.local
порт_значение: 8081
версия API: networking.istio.io/v1alpha3
тип: EnvoyFilter
метаданные:
имя: filter-ratelimit-svc
#namespace: istio-вход
спецификация:
Селектор рабочей нагрузки:
этикетки:
Истио: вход
configPatches:
- применить к: VIRTUAL_HOST
соответствовать:
контекст: ШЛЮЗ
конфигурация маршрута:
vhost:
имя: ""
маршрут:
действие: ЛЮБОЕ
пластырь:
операция: ОБЪЕДИНИТЬ
# Применяет правила ограничения скорости.
стоимость:
rate_limits:
- действия: # любые действия здесь
- Заголовки_запроса:
header_name: ":путь"
дескриптор_ключ: "ПУТЬ"
апиВерсия: v1
вид: карта конфигурации
метаданные:
имя: ratelimit-config
данные:
конфиг.yaml: |
домен: tcp-ratelimit
дескрипторы:
- ключ: ПУТЬ
скорость_лимит:
единица измерения: минута
запросы_на_юнит: 1
Я начал изменять ссылки на фильтры посланников, чтобы они были более сетевыми, но я не уверен, что еще мне не хватает, или это правильный способ сделать это. Вот что я изменил по сравнению с предыдущей конфигурацией на данный момент
версия API: networking.istio.io/v1alpha3
тип: EnvoyFilter
метаданные:
имя: предел скорости фильтра
#namespace: istio-вход
спецификация:
Селектор рабочей нагрузки:
# выбрать по метке в том же пространстве имен
этикетки:
Истио: вход
configPatches:
# Конфигурация Envoy, которую вы хотите изменить
- применить к: NETWORK_FILTER
соответствовать:
контекст: ШЛЮЗ
слушатель:
фильтрЦепь:
фильтр:
имя: "envoy.filters.network.ratelimit"
пластырь:
операция: INSERT_BEFORE
# Добавляет Envoy Rate Limit Filter в цепочку фильтров HTTP.
стоимость:
имя: envoy.filters.network.ratelimit
типизированная_конфигурация:
"@type": type.googleapis.com/envoy.extensions.filters.network.ratelimit.v3.RateLimit
# домен может быть любым! Сопоставьте его с конфигурацией сервиса ratelimter
домен: tcp-ratelimit
failure_mode_deny: правда
тайм-аут: 10 сек.
rate_limit_service:
grpc_service:
envoy_grpc:
имя_кластера: rate_limit_cluster
тайм-аут: 10 сек.
транспорт_апи_версия: V3
- применить к: КЛАСТЕР
соответствовать:
контекст: ШЛЮЗ
кластер:
сервис: ratelimit.istio-ingress.svc.cluster.local
пластырь:
операция: ДОБАВИТЬ
# Добавляет кластер службы ограничения скорости для службы ограничения скорости, определенной на шаге 1.
стоимость:
имя: rate_limit_cluster
тип: STRICT_DNS
connect_timeout: 10 с
lb_policy: ROUND_ROBIN
http2_protocol_options: {}
load_assignment:
имя_кластера: rate_limit_cluster
конечные точки:
- lb_конечные точки:
- конечная точка:
адрес:
адрес_сокета:
адрес: ratelimit.istio-ingress.svc.cluster.local
порт_значение: 8081
Возможно ли то, что я пытаюсь сделать?