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

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

    Пожалуйста, убедитесь, что вы прочитали документацию по установке перед продолжением.

    Настройка через веб-консоль

    1. Перейдите в Alauda Container Platform -> Networking -> Gateways

    2. Нажмите кнопку Create Gateway

    3. На странице Create Gateway выберите envoy-gateway-operator-cpaas-default в поле GatewayClass, после чего отобразятся следующие параметры конфигурации:

      ПолеОписаниеПуть в YAML
      Nameимяgateway: .metadata.name
      envoygateway: .metadata.name
      GatewayClassкакой GatewayClass используетсяgateway: .spec.gatewayClassName
      Service Typeтип сервисаenvoygateway: .spec.provider.kubernetes.envoyService.type
      Service Annotationаннотация сервисаenvoygateway: .spec.provider.kubernetes.envoyService.annotations
      Resource Limitsлимиты ресурсов деплойментаenvoygateway: .spec.provider.kubernetes.envoyDeployment.container.resources
      Replicasколичество реплик деплойментаenvoygateway: .spec.provider.kubernetes.envoyService.replicas
      Node Labelsметки узлов деплойментаenvoygateway: .spec.provider.kubernetes.envoyService.nodeSelector
      Listenerlistenergateway: .spec.listeners
      WARNING

      Форма веб-консоли поддерживает только GatewayClasses, созданные с помощью EnvoyGatewayCtl. Для других GatewayClasses используйте редактор YAML.

      NOTE

      При использовании GatewayClass, созданного EnvoyGatewayCtl, веб-консоль автоматически создаёт сопутствующий ресурс envoyproxy с именем и пространством имён, совпадающими с Gateway.

    Настройка через YAML

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: demo
      namespace: demo
    spec:
      infrastructure:
        parametersRef:
          group: gateway.envoyproxy.io
          kind: EnvoyProxy
          name: demo
      gatewayClassName: envoy-gateway-operator-cpaas-default
      listeners:
        - name: http
          port: 80
          hostname: a.com
          protocol: HTTP
          allowedRoutes:
            namespaces:
              from: Same
        - name: https
          port: 443
          hostname: a.com
          protocol: HTTPS
          allowedRoutes:
            namespaces:
              from: Same
          tls:
            mode: Terminate
            certificateRefs:
              - name: demo-tls
        - name: tcp
          port: 8080
          protocol: TCP
          allowedRoutes:
            namespaces:
              from: Same
        - name: udp
          port: 8080
          protocol: UDP
          allowedRoutes:
            namespaces:
              from: Same
    ---
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyProxy
    metadata:
      name: demo
      namespace: demo
    spec:
      provider:
        kubernetes:
          envoyService:
            type: ClusterIP
          envoyDeployment:
            replicas: 1
            container:
              imageRepository: registry.alauda.cn:60080/acp/envoyproxy/envoy
              resources:
                limits:
                  cpu: '1'
                  memory: 1Gi
                requests:
                  cpu: '1'
                  memory: 1Gi
        type: Kubernetes
    1. Сопутствующий envoyproxy
    2. Указание, к какому GatewayClass относится
    3. Listener
    4. Hostname слушателя
    5. Поддерживаемый тип слушателя
    6. Разрешённые namespace для маршрутов
    7. Конфигурация TLS
    8. Имя сопутствующего envoyproxy
    9. Тип сервиса
    10. Пожалуйста, сохраните и не изменяйте значение по умолчанию репозитория
    11. Ресурсы для экземпляра envoy-proxy
    12. Пожалуйста, сохраните и не изменяйте

    Введение

    Тип сервиса

    Тип сервиса определяет, как будет открыт доступ к шлюзу. Существует три режима: LoadBalancer, NodePort и ClusterIP.

    LoadBalancer (Рекомендуется)

    Преимущество — простота использования и возможности высокодоступного балансировщика нагрузки. Для использования LoadBalancer в кластере должна быть поддержка LoadBalancer, которую можно включить через MetalLB.

    NodePort

    Преимущество — отсутствие внешних зависимостей.

    Однако у NodePort есть следующие недостатки:

    • Можно использовать только в кластерах с количеством узлов менее 16, иначе статус шлюза может стать некорректным.
    • При использовании NodePort Kubernetes назначает номера портов NodePort, отличающиеся от портов сервиса. Для доступа необходимо использовать порт NodePort, а не порт сервиса.
    • Сервис доступен по IP-адресу любого узла кластера, что может представлять потенциальные риски безопасности.
    Как получить правильный порт при использовании NodePort
    kubectl get svc -n ${ENVOYGATEWAYCTL_NS} -l gateway.envoyproxy.io/owning-gateway-name=${GATEWAY_NAME} -o=jsonpath='{.items[0].spec.ports[?(@.port==${PORT})].nodePort}'

    Выводом будет порт NodePort.

    ClusterIP

    Очень удобно, если внешний доступ не требуется.

    Listener

    Listener определяет порт и протокол, на которых слушает шлюз. Для протоколов HTTP или HTTPS разные hostnames могут рассматриваться как разные слушатели.

    Нельзя создавать слушателя с конфликтующим портом, протоколом или hostname.

    В Gateway должен быть создан хотя бы один listener.

    Поддерживаемый тип слушателя

    Каждый listener поддерживает разные типы маршрутов в зависимости от протокола:

    Протокол слушателяПоддерживаемый тип маршрута
    HTTPHTTPRoute
    HTTPSHTTPRoute, GRPCRoute
    TLSTLSRoute
    TCPTCPRoute
    UDPUDPRoute

    При настройке маршрутов убедитесь, что они соответствуют протоколу слушателя, к которому будут прикреплены. Например, нельзя прикрепить HTTPRoute к TCP listener.

    Разрешённые namespace для маршрутов

    По умолчанию маршруты могут прикрепляться только к Gateway в том же namespace. Чтобы разрешить маршрутизацию между namespace, необходимо указать, какие namespace разрешены для прикрепления маршрутов к listener этого Gateway с помощью поля allowedRoutes.

    Для подробностей смотрите attach to gateway create on other ns.

    TLS

    По умолчанию можно использовать только secret, созданный в том же namespace. В противном случае смотрите use secret create on other ns.

    По умолчанию используется режим Terminate. Для других режимов смотрите ssl passthrough.

    Hostname

    Hostname в listener является уникальным идентификатором для слушателей с одинаковым протоколом. Нельзя добавить или обновить слушателя с конфликтующим hostname в одном Gateway.

    Правила пересечения hostname слушателя и hostname маршрутов

    При поступлении запроса он сопоставляется с пересечением hostname слушателя и hostname маршрутов. Для маршрутизации используются только hostname из пересечения.

    Hostname слушателяHostname маршрутовРезультат пересеченияПример
    Нет hostnameНет hostnameСовпадает со всеми хостамиЛюбой входящий заголовок host принимается
    Нет hostnameЕсть hostname (например, api.example.com)Все hostname маршрутовСовпадают только запросы с api.example.com
    Есть hostname (например, api.example.com)Нет hostnameВсе hostname слушателяСовпадают только запросы с api.example.com
    Есть hostname (например, api.example.com)Есть точное совпадение hostname (например, api.example.com)Точное совпадение hostnameСовпадают только запросы с api.example.com
    Есть wildcard (например, *.example.com)Есть совпадающие hostname (например, api.example.com, web.example.com)Совпадающие конкретные hostnameСовпадают запросы с api.example.com или web.example.com
    Есть hostname (например, api.example.com)Есть несовпадающие hostname (например, web.example.com)Нет пересечения — статус маршрута некорректенМаршрут не может обрабатывать трафик
    NOTE

    Подстановочные знаки (*) выполняют сопоставление по суффиксу. Например, *.example.com соответствует foo.example.com и bar.example.com, но не example.com.

    WARNING

    Отсутствие пересечения — статус маршрута некорректен, маршрут не может обрабатывать трафик.

    Сопутствующий EnvoyProxy

    Envoy Gateway предоставляет различные уровни контроля над развертыванием шлюзов. Рекомендуется создавать отдельный ресурс EnvoyProxy для каждого Gateway и ссылаться на него через поле .spec.infrastructure.parametersRef Gateway.

    Такой подход один к одному обеспечивает лучшую изоляцию и более тонкий контроль над конфигурациями развертывания, такими как количество реплик, ресурсы и ограничения планирования.

    Для других способов конфигурации развертывания смотрите deployment-mode.

    Репозиторий образов

    Это значение по умолчанию. Оно будет заменено на фактический репозиторий образов текущего кластера, пожалуйста, не изменяйте его.

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

    Настройка GatewayAPI Route