Быстрый старт посланника

Микросервисы Архитектура HTTP Nginx

существуетВзаимодействие между службами и управление микрослужбамиВ этой статье мы упомянули, что текущая архитектура Service Mesh Scallop основана на Envoy.

Главный герой этой статьи — новичокEnvoy

Отказались от Nginx, выбрали Envoy

На самом деле, гребешки и раньше использовали Nginx, и у них больше опыта в его развертывании, настройке и настройке. Если возможно, мы по-прежнему склонны выбирать Nginx в качестве основного решения Service Mesh.

Но есть несколько неизбежных проблем:

  1. Обратный прокси-сервер Nginx не поддерживает http2/grpc (кажется, поддерживается в марте этого года)
  2. В отличие от Envoy, где почти все сетевые конфигурации могут быть динамически изменены с помощью xDS API, в Nginx отсутствует эффективный механизм для «горячих» изменений конфигурации (если только он не глубоко разработан или постоянно не перезагружается).
  3. Многие функции микросервиса Nginx доступны только при покупке Nginx Plus.

В качестве прокси для основного решения сервисной сетки Envoy рассматривает сервисную сетку везде в своем дизайне.После определенного понимания мы решительно вошли в яму Envoy.

Что такое посланник

Приводим описание с официального сайта:

Envoy is an L7 proxy and communication bus designed for large modern service oriented architectures. The project was born out of the belief that: "The network should be transparent to applications. When network and application problems do occur it should be easy to determine the source of the problem."

Основные характеристики / преимущества Envoy

  • Ненавязчивая архитектура:EnvoyОн работает параллельно со службой приложений, прозрачно проксируя трафик, отправляемый/получаемый службой приложений. Служба приложений должна толькоEnvoyОбщайтесь, не зная, где применяются другие микросервисы.
  • На основе реализации Modern C++11, отличная производительность.
  • Архитектура фильтра L3/L4:EnvoyЯдром является прокси-сервер L3/L4, который затем проходит через подключаемый фильтр (network filters) для выполнения задач, связанных с TCP/UDP, таких как переадресация TCP, аутентификация TLS и т. д.
  • Архитектура фильтра HTTP L7: HTTP — это особый протокол прикладного уровня в современных прикладных системах, поэтомуEnvoyСуществует очень встроенный фильтр:http_connection_manager.http_connection_managerсам по себе такой особенный и сложный, поддерживает богатую конфигурацию и сам по себе представляет собой архитектуру фильтра, которую можно пропустить через серию http-фильтров (http filters) для реализации задач на уровне http-протокола, таких как: http-маршрутизация, перенаправление, поддержка CORS и т. д.
  • HTTP/2 как первый гражданин:EnvoyПоддерживаются HTTP/1.1 и HTTP/2, рекомендуется HTTP/2.
  • Поддержка gRPC: благодаря хорошей поддержке HTTP/2,EnvoyМожет легко поддерживать gRPC, особенно для полезных нагрузок и прокси.
  • Обнаружение служб: поддерживает различные схемы обнаружения служб, включая DNS, EDS.
  • Проверка работоспособности: встроенная подсистема проверки работоспособности.
  • Расширенные решения по балансировке нагрузки: в дополнение к общей балансировке нагрузки Envoy также поддерживает различные расширенные решения по балансировке нагрузки, основанные на услугах ограничения скорости, в том числе: автоматические повторные попытки, разрыв цепи, глобальное ограничение скорости.
  • Отслеживание: легко интегрируется с системой Open Tracing и отслеживает запросы.
  • Статистика и мониторинг: встроенный модуль статистики, легко интегрируемые решения для мониторинга, такие как prometheus/statsd
  • Динамическая конфигурация: динамическая настройка конфигурации без перезапуска через «Dynamic Configuration API».EnvoyУслуги.

Объяснение основных терминов

Host

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

Downstream

Хост, отправляющий запрос в Envoy, находится в нисходящем направлении (downstream), например клиент gRPC.

Upstream

Хост, который получает запрос от Enovy, является вышестоящим (upstream), например сервер gRPC.

Listener

Адрес, который слушает Envoy, например, ip:port, сокет unix и т. д.

Cluster

Группа вышестоящих хостов с одинаковой функцией называется кластером. похожийk8sизService, nginxизupstream

Http Route Table

Правила маршрутизации HTTP, такие как запрошенное доменное имя, каким правилам соответствует путь и в какой кластер он перенаправляется.

конфигурация (v2)

Интерфейс конфигурации Envoy определен в формате proto3 (Protocol Buffers v3).Полное определение см.data plane API repository

Поддержка записи конкретного конфигурационного файла:yaml, json, pb, pb_textЧетыре формата. Для удобочитаемости мы будем использовать следующееyamlформат например.

Давайте рассмотрим простой пример:

полностью статическая конфигурация

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["example.com"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    hosts: [{ socket_address: { address: 127.0.0.2, port_value: 1234 }}]

В приведенном выше примере мы настроили экземпляр envoy для прослушивания 127.0.0.1:10000, поддержки доступа по протоколу http и доменного имени для доступа по http: example.com. Весь полученный HTTP-трафик перенаправляется на службу по адресу 127.0.0.2:1234.

Вскоре у всех обнаружилась проблема, то есть исправлены хосты в кластере some_service(127.0.0.2:1234), но весьма вероятно, что соответствующий хост изменится. Например: добавление нового хоста (горизонтальное расширение),k8sВ среде был выдан новый код (изменен pod) и т.д. В настоящее время нам не нужно держать хосты в кластере, верно? Будьте уверены, если это так, мы не будем использоватьEnvoy.

пройти черезEDSДинамическая настройка хостов кластера

Далее мы столкнемся с первым примером динамической настройки, которая заключается в динамической настройке хостов кластера.

Предположим, что есть такой服务A,адрес:127.0.0.3:5678, который возвращает подчиненный ответ в кодировке proto3

version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
  cluster_name: some_service
  endpoints:
  - lb_endpoints:
    - endpoint:
        address:
          socket_address:
            address: 127.0.0.2
            port_value: 1234

тогда мы ставимenvoyКонфигурация настроена на:

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["example.com"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
          http_filters:
          - name: envoy.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    lb_policy: ROUND_ROBIN
    type: EDS
    eds_cluster_config:
      eds_config:
        api_config_source:
          api_type: GRPC
          cluster_names: [xds_cluster]
  - name: xds_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    hosts: [{ socket_address: { address: 127.0.0.3, port_value: 5678 }}]

может быть достигнутsome_serviceДинамическая конфигурация хостов этого кластера. В новой конфигурации,some_serviceХосты этого кластераEDS(Endpoint Discovery Service)определяется возвращаемым значением, т.EDSвернусьsome_serviceСписок хостов для этого кластера. В новой конфигурации,EDSАдрес службы указан вxds_clusterВ этом кластере адрес именно такой, какой мы предполагали в начале服务Aадрес г.

На самом деле посланникlistener, cluster, http routeи т. д. могут быть динамически настроены, методы иEDSто же, черезLDS, CDS, RDSдля реализации конфигурации, и все вместе они называютсяxDS. Полный пример динамической конфигурации выглядит следующим образом:

на основеxDSдинамическая конфигурация

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

dynamic_resources:
  lds_config:
    api_config_source:
      api_type: GRPC
      cluster_names: [xds_cluster]
  cds_config:
    api_config_source:
      api_type: GRPC
      cluster_names: [xds_cluster]

static_resources:
  clusters:
  - name: xds_cluster
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    http2_protocol_options: {}
    hosts: [{ socket_address: { address: 127.0.0.3, port_value: 5678 }}]

Здесь мы предполагаем, что 127.0.0.3:5678 предоставляет полную xDS

LDS:

version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Listener
  name: listener_0
  address:
    socket_address:
      address: 127.0.0.1
      port_value: 10000
  filter_chains:
  - filters:
    - name: envoy.http_connection_manager
      config:
        stat_prefix: ingress_http
        codec_type: AUTO
        rds:
          route_config_name: local_route
          config_source:
            api_config_source:
              api_type: GRPC
              cluster_names: [xds_cluster]
        http_filters:
        - name: envoy.router

RDS:

version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.RouteConfiguration
  name: local_route
  virtual_hosts:
  - name: local_service
    domains: ["*"]
    routes:
    - match: { prefix: "/" }
      route: { cluster: some_service }

CDS:

version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.Cluster
  name: some_service
  connect_timeout: 0.25s
  lb_policy: ROUND_ROBIN
  type: EDS
  eds_cluster_config:
    eds_config:
      api_config_source:
        api_type: GRPC
        cluster_names: [xds_cluster]

EDS:

version_info: "0"
resources:
- "@type": type.googleapis.com/envoy.api.v2.ClusterLoadAssignment
  cluster_name: some_service
  endpoints:
  - lb_endpoints:
    - endpoint:
        address:
          socket_address:
            address: 127.0.0.2
            port_value: 1234

заключительные замечания

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

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

Наши различные микросервисы соответствуют каждому кластеру черезauthorityнастроить таблицу маршрутизации.

Используйте статистические данные Envoy для мониторинга производительности вызовов службы, журнал доступа Envoy для сбора журнала трафика и ограничение скорости для защиты службы.