• Русский
  • Настройка маршрута GatewayAPI

    Обзор

    В этом документе объясняется, как настроить ресурсы Route после того, как Gateway готов. Route прикрепляется к одному или нескольким слушателям gateway и определяет, как совпадающий трафик перенаправляется на backend-сервисы.

    В рекомендуемом рабочем процессе этот документ следует после Настройка GatewayAPI Gateway и перед Настройка GatewayAPI Policy.

    Помимо операций создания и обновления, в этом документе также представлены дополнительные возможности просмотра маршрутов, предоставляемые ACP Web Console.

    Предварительные требования

    Пожалуйста, убедитесь, что вы выполнили следующие шаги перед продолжением:

    1. Ознакомились с Настройка GatewayAPI Gateway для понимания слушателей, правил прикрепления и EnvoyProxy
    2. Создали Gateway, к которому будет прикреплен ваш Route
    NOTE

    В этом документе сначала отдельно представлены каждый тип маршрута, затем приведены примеры YAML, и, наконец, объяснены общие концепции маршрутов в общей справочной секции.

    Конфигурация

    Route прикрепляется к одному или нескольким слушателям на Gateway. Выбор слушателя зависит от типа маршрута, протокола слушателя и настроек разрешённых пространств имён маршрутов слушателя.

    Конфигурация через Web Console

    1. Перейдите в Alauda Container Platform -> Networking -> Gateway -> Routes
    2. Нажмите кнопку Create Route
    3. Выберите тип маршрута (HTTPRoute, TCPRoute, UDPRoute, GRPCRoute или TLSRoute)

    Создание HTTPRoute

    ПолеОписаниеПуть в YAML
    Publish to Listenerпубликация на слушатель.spec.parentRefs
    Hostnameshostnames.spec.hostnames
    Matchesсовпадения.spec.rules[].matches
    Filtersфильтры.spec.rules[].filters
    Backend Instancebackend.spec.rules[].backendRefs
    Optionsопции.spec.rules[].filters, .spec.rules[].timeouts, .spec.rules[].retry, .spec.rules[].sessionPersistence
    Конфигурация опций

    Поле Options позволяет настроить расширенные параметры управления трафиком:

    ОпцияОписаниеПуть в YAML
    Session Affinityсохранение сессии.spec.rules[].sessionPersistence
    Timeoutнастройки таймаута.spec.rules[].timeouts
    Retryполитика повторных попыток.spec.rules[].retry

    Создание TCP/UDP Route

    ПолеОписаниеПуть в YAML
    Publish to Listenerпубликация на слушатель.spec.parentRefs
    Backend Instancebackend.spec.rules[].backendRefs

    Создание GRPCRoute

    ПолеОписаниеПуть в YAML
    Publish to Listenerпубликация на слушатель.spec.parentRefs
    Hostnameshostnames.spec.hostnames
    Matchesgrpc совпадения.spec.rules[].matches
    Filtersgrpc фильтры.spec.rules[].filters
    Backend Instancebackend.spec.rules[].backendRefs

    Создание TLSRoute

    ПолеОписаниеПуть в YAML
    Publish to Listenerпубликация на слушатель.spec.parentRefs
    Hostnameshostnames (опционально).spec.hostnames
    Backend Instancebackend.spec.rules[].backendRefs

    Конфигурация через YAML

    Следующий минимальный пример создаёт HTTPRoute, который прикрепляется к слушателю https в Gateway с именем demo и перенаправляет совпадающий трафик на backend Service.

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: demo-443
      namespace: demo
    spec:
      hostnames:
        - example.com
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          sectionName: https
      rules:
        - matches:
            - path:
                type: Exact
                value: /a
          backendRefs:
            - group: ''
              kind: Service
              name: echo-resty
              namespace: demo-space
              port: 80
              weight: 100

    Если вам нужны другие типы маршрутов и расширенные опции HTTPRoute, используйте следующий полный пример:

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: demo-443
      namespace: demo
    spec:
      hostnames:
        - example.com
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          sectionName: https
      rules:
        - backendRefs:
            - group: ''
              kind: Service
              name: echo-resty
              namespace: demo-space
              port: 80
              weight: 100
          filters: [] 
          matches:
            - path:
                type: Exact
                value: /a
          timeouts:
            request: '30s'
            backendRequest: '10s'
          retry:
            codes:
              - 503
            attempts: 3
            backoff: '100ms'
          sessionPersistence:
            type: Cookie
            sessionName: a
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: TCPRoute
    metadata:
      name: tcp
      namespace: demo-space
    spec:
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          sectionName: tcp
      rules:
        - backendRefs:
            - group: ''
              kind: Service
              name: echo-resty
              port: 80
              weight: 100
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: UDPRoute
    metadata:
      name: udp
      namespace: demo
    spec:
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          namespace: demo
          sectionName: udp
      rules:
        - backendRefs:
            - group: ''
              kind: Service
              name: echo-resty
              namespace: demo
              port: 53
              weight: 100
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: GRPCRoute
    metadata:
      name: grpc
      namespace: demo
    spec:
      hostnames:
        - grpc.example.com
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          sectionName: https
      rules:
        - matches:
            - method:
                type: service
                value: myservice
          filters:
            - type: RequestHeaderModifier
              requestHeaderModifier:
                set:
                  - name: x-custom-header
                    value: custom-value
          backendRefs:
            - group: ''
              kind: Service
              name: grpc-service
              port: 50051
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: TLSRoute
    metadata:
      name: tls
      namespace: demo
    spec:
      hostnames:
        - tls.example.com
      parentRefs:
        - group: gateway.networking.k8s.io
          kind: Gateway
          name: demo
          sectionName: tls
      rules:
        - backendRefs:
            - group: ''
              kind: Service
              name: tls-backend
              port: 443

    Справочник по полям маршрута

    Каждый маршрут — это CR, определённый спецификацией GatewayAPI. Для подробной информации о полях и параметрах конфигурации каждого типа маршрута, пожалуйста, обратитесь к официальной документации:

    Publish to Listener

    В Web Console

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

    • Права пользователя: у вас должен быть доступ к пространству имён gateway (проект должен включать это пространство имён).
    • Белый список пространств имён маршрутов: разрешённые пространства имён маршрутов слушателя gateway должны включать пространство имён маршрута.
    • Совпадение типа маршрута: тип маршрута (HTTPRoute, GRPCRoute и т.д.) должен соответствовать разрешённым типам маршрутов слушателя.

    Для более сложных сценариев с кросс-пространствами имён смотрите прикрепление к gateway, созданному в другом пространстве имён.

    В YAML
    • sectionName — это имя слушателя.
    • Маршруты могут быть прикреплены только к слушателям, поддерживающим их конкретный тип.
    • По умолчанию маршруты могут быть прикреплены только к слушателям, где Gateway находится в том же пространстве имён.

    Для прикрепления к gateway в другом пространстве имён смотрите прикрепление к gateway, созданному в другом пространстве имён.

    Backend

    Определяет целевой сервис(ы), куда должны перенаправляться совпадающие запросы.

    Каждый сервис может иметь поле weight для указания доли трафика, направляемого на этот сервис.

    Hostnames

    Поле hostnames поддерживается HTTPRoute, GRPCRoute и TLSRoute. TCPRoute и UDPRoute это поле не используют.

    hostnames — массив строк. Он следует правилам пересечения hostnames.

    Rules

    Каждый маршрут может содержать несколько правил. Каждое правило состоит из следующих компонентов:

    Matches

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

    Правило может иметь несколько совпадений:

    • Каждое совпадение состоит из нескольких условий (например, путь, заголовки, параметры запроса, метод)
    • Условия внутри одного совпадения связаны логикой И (все должны быть выполнены)
    • Совпадения между собой связаны логикой ИЛИ (достаточно, чтобы выполнилось любое совпадение)

    Пример: Если Match-1 требует path=/api И header=v1, а Match-2 требует query=test, то запрос маршрутизируется, если он соответствует либо (path=/api И header=v1), либо (query=test).

    Структура совпадения общая для всех типов маршрутов, но поддерживаемые условия совпадения зависят от типа маршрута. Например, HTTPRoute и GRPCRoute поддерживают разные наборы условий.

    Filters

    Определяет преобразования или модификации, применяемые к запросам или ответам.

    Концепция фильтров общая для всех типов маршрутов, но поддерживаемые типы фильтров зависят от типа маршрута.

    Справочник HTTPRoute

    Для HTTPRoute используются следующие типы условий совпадения, фильтров и расширенных опций.

    Типы условий совпадения
    ОбъектМетодТипы значенийОписаниеТребования к значению
    Path
    Exactпуть (строка)Совпадение с URL-путём точно и с учётом регистра. Это значит, что точное совпадение пути /abc сработает только для /abc, НЕ для /abc/, /Abc или /abcd.Должен начинаться с /, без последовательных //.
    PathPrefixпуть (строка)Совпадение по префиксу URL-пути, разделённому /. Совпадение чувствительно к регистру и происходит поэлементно по пути. Например, пути /abc, /abc/ и /abc/def совпадут с префиксом /abc, а /abcd — нет.Должен начинаться с /, без последовательных //.
    RegularExpressionпуть (строка)Регулярное выражение: движок RE2.например, /api/v1/.*.
    Header
    Exactимя (ключ заголовка) + значениеТочное совпадение значения заголовка.
    RegularExpressionимя (ключ заголовка) + значениеРегулярное выражение: движок RE2.
    QueryParam
    Exactимя (ключ параметра) + значениеТочное совпадение значения параметра запроса.Значение параметра: 1-1024 символа
    RegularExpressionимя (ключ параметра) + значениеРегулярное выражение: движок RE2.
    Method-имя методаСовпадение HTTP-метода.GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH
    Ссылки на условия совпадения
    Тип условияОфициальная документация
    PathHTTPPathMatch
    HeadersHTTPHeaderMatch
    QueryParamsHTTPQueryParamMatch
    MethodHTTPMethod
    Типы фильтров
    ТипМетодТипы значенийОписаниеТребования к значению
    RequestHeaderModifierSetимя (строка) + значение (строка)Перезаписывает заголовок запроса с указанным именем и значениемМакс 16 элементов, значение: 1-4096 символов
    Addимя (строка) + значение (строка)Добавляет заголовок к запросу, дописывая к существующим значениямМакс 16 элементов, значение: 1-4096 символов
    Remove[]stringУдаляет указанные заголовки из запроса (без учёта регистра)Макс 16 элементов
    ResponseHeaderModifierSetимя (строка) + значение (строка)Перезаписывает заголовок ответа с указанным именем и значениемМакс 16 элементов, значение: 1-4096 символов
    Addимя (строка) + значение (строка)Добавляет заголовок к ответу, дописывая к существующим значениямМакс 16 элементов, значение: 1-4096 символов
    Remove[]stringУдаляет указанные заголовки из ответа (без учёта регистра)Макс 16 элементов
    RequestRedirectSchemeстрокаСхема для заголовка Location (http/https)Опционально, enum: http|https
    HostnamePreciseHostnameХост для заголовка LocationОпционально
    ReplaceFullPathстрокаЗаменить весь путь запросаОпционально, макс 1024 символа
    ReplacePrefixMatchстрокаЗаменить совпадающий префикс путиОпционально, макс 1024 символа, только с PathPrefix
    PortPortNumberПорт для заголовка LocationОпционально, диапазон: 1-65535
    StatusCodeintHTTP код перенаправленияОпционально, по умолчанию: 302, enum: 301|302
    URLRewriteHostnamePreciseHostnameХост для переписывания в запросеОпционально
    ReplaceFullPathстрокаЗаменить весь путь запросаОпционально, макс 1024 символа
    ReplacePrefixMatchстрокаЗаменить совпадающий префикс путиОпционально, макс 1024 символа, только с PathPrefix
    CORSAllowOrigins[]stringСписок разрешённых источников для CORS-запросовОпционально
    AllowMethods[]HTTPMethodСписок разрешённых HTTP-методовОпционально, например GET, POST, PUT
    AllowHeaders[]stringСписок разрешённых заголовков в CORS-запросахОпционально
    ExposeHeaders[]stringСписок заголовков, доступных клиенту в ответеОпционально
    MaxAgeDurationВремя кэширования для CORS preflight-ответаОпционально
    AllowCredentialsboolРазрешены ли учётные данные в CORS-запросахОпционально

    Примечания:

    • RequestRedirect и URLRewrite нельзя использовать одновременно в одном правиле
    • ReplacePrefixMatch совместим только с PathPrefix HTTPRouteMatch
    • Имена заголовков нечувствительны к регистру согласно RFC 7230
    • Несколько значений одного заголовка должны использовать формат с запятыми согласно RFC 7230
    Ссылки на фильтры
    Тип фильтраОфициальная документация
    RequestHeaderModifierHTTPHeaderFilter
    ResponseHeaderModifierHTTPHeaderFilter
    RequestRedirectHTTPRequestRedirectFilter
    URLRewriteHTTPURLRewriteFilter
    CORSHTTPCORSFilter
    RequestMirrorHTTPRequestMirrorFilter
    HTTPExternalAuthFilterHTTPExternalAuthFilter
    Options

    Раздел Options предоставляет расширенные возможности управления трафиком для HTTPRoute, включая настройки таймаута, повторных попыток и сохранения сессии.

    Таймауты
    ПолеОписаниеПуть в YAML
    Request TimeoutМаксимальное время, за которое gateway должен завершить HTTP-ответ после получения полного запроса от клиента. Опции: Default (использует таймаут по умолчанию, обычно 15 секунд), Unlimited (устанавливает "0s" для снятия таймаута), Custom..spec.rules[].timeouts.request
    Backend Request TimeoutМаксимальное время для одного вызова gateway к backend, от начала отправки запроса до получения полного ответа от backend. Опции: Default (использует таймаут по умолчанию), Unlimited (устанавливает "0s"), Custom..spec.rules[].timeouts.backendRequest
    NOTE
    • Таймаут Request Timeout начинает отсчёт после полного получения запроса от клиента и охватывает всю транзакцию, которая может включать несколько вызовов backend при повторных попытках.
    • Backend Request Timeout должен быть ≤ Request Timeout, если задан.
    • При выборе "Default" поле устанавливается в nil (используется таймаут по умолчанию реализации).
    • При выборе "Unlimited" поле устанавливается в "0s" (максимально возможное значение).
    ПолеСпецификация
    .spec.rules[].timeoutsHTTPRouteTimeouts
    Retry
    ПолеОписаниеПуть в YAML
    Status CodesHTTP-коды статуса, при которых происходит повтор (например, 503, 502). Диапазон значений: 400-599..spec.rules[].retry.codes
    AttemptsКоличество попыток повторов..spec.rules[].retry.attempts
    BackoffВремя ожидания перед повтором (например, "100ms", "1s")..spec.rules[].retry.backoff
    NOTE
    • По умолчанию повторные попытки отключены. Если поле retry не настроено или пустое, gateway не будет повторять неудачные запросы.
    • Для включения повторных попыток необходимо явно настроить и количество попыток, и условия повторов.
    • При настройке retry в веб-консоли, если удалить все элементы конфигурации retry, поле устанавливается в nil.
    ПолеСпецификация
    .spec.rules[].retryHTTPRouteRetry
    Сохранение сессии

    Настраивает параметры сохранения сессии, чтобы запросы от одного клиента направлялись на один и тот же backend.

    ПолеОписаниеПуть в YAML
    TypeТип сохранения сессии. Опции: Cookie, Header..spec.rules[].sessionPersistence.type
    Session NameИмя cookie или заголовка, используемого для отслеживания сессии..spec.rules[].sessionPersistence.sessionName
    ПолеСпецификация
    .spec.rules[].sessionPersistenceSessionPersistence

    Справочник совпадений и фильтров GRPCRoute

    Для GRPCRoute используются следующие типы совпадений и фильтров.

    Совпадения GRPCRoute

    GRPCRoute поддерживает следующие типы совпадений:

    ОбъектМетодТипы значенийОписание
    Method-тип (service/method) + значениеСовпадение gRPC метода. Тип может быть service (совпадение по имени сервиса) или method (по имени метода).
    HeadersExactимя (ключ заголовка) + значениеТочное совпадение значения заголовка.
    RegularExpressionимя (ключ заголовка) + значениеРегулярное выражение: движок RE2.
    Фильтры GRPCRoute

    GRPCRoute поддерживает только фильтр RequestHeaderModifier:

    ТипМетодТипы значенийОписаниеТребования к значению
    RequestHeaderModifierSetимя (строка) + значение (строка)Перезаписывает заголовок запроса с указанным именем и значениемМакс 16 элементов, значение: 1-4096 символов
    Addимя (строка) + значение (строка)Добавляет заголовок к запросу, дописывая к существующим значениямМакс 16 элементов, значение: 1-4096 символов
    Remove[]stringУдаляет указанные заголовки из запроса (без учёта регистра)Макс 16 элементов
    NOTE

    GRPCRoute не поддерживает опции, такие как таймаут, повторные попытки или сохранение сессии.

    Справочник TLSRoute

    Следующее поведение характерно для TLSRoute.

    NOTE
    • Для TLSRoute hostnames необязательны. Если у слушателя есть hostname, а у TLSRoute нет, TLSRoute автоматически наследует hostname слушателя.
    • TLSRoute может быть прикреплен только к слушателям с протоколом TLS в режиме Passthrough.

    Просмотр

    Топология

    Следующие функции предоставляют дополнительные возможности просмотра, доступные в ACP Web Console.

    Вкладка топологии предоставляет визуальное представление маршрута и связанных с ним ресурсов. Она отображает все политики, прикреплённые к маршруту, а также их зависимые ресурсы, такие как секреты, на которые ссылается SecurityPolicy.

    Эта функция в настоящее время доступна только для HTTPRoute.

    Следующий шаг

    После прикрепления маршрутов к слушателям продолжайте с Настройка GatewayAPI Policy, если вам нужны расширенные политики трафика или безопасности. Для дополнительных примеров эксплуатации смотрите Задачи для Envoy Gateway.

    Связанные задачи