существуетВзаимодействие между службами и управление микрослужбамиВ этой статье мы упомянули, что текущая архитектура Service Mesh Scallop основана на Envoy.
Главный герой этой статьи — новичокEnvoy
Отказались от Nginx, выбрали Envoy
На самом деле, гребешки и раньше использовали Nginx, и у них больше опыта в его развертывании, настройке и настройке. Если возможно, мы по-прежнему склонны выбирать Nginx в качестве основного решения Service Mesh.
Но есть несколько неизбежных проблем:
- Обратный прокси-сервер Nginx не поддерживает http2/grpc (кажется, поддерживается в марте этого года)
- В отличие от Envoy, где почти все сетевые конфигурации могут быть динамически изменены с помощью xDS API, в Nginx отсутствует эффективный механизм для «горячих» изменений конфигурации (если только он не глубоко разработан или постоянно не перезагружается).
- Многие функции микросервиса 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 для сбора журнала трафика и ограничение скорости для защиты службы.