существуетВзаимодействие между службами и управление микрослужбамиВ этой статье мы упомянули, что текущая архитектура 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 для сбора журнала трафика и ограничение скорости для защиты службы.