Introduction EaseMesh разделяет основные компоненты на две части: одна — это Control plane, другая — Data plane. В плоскости управления EaseMesh использует кластер Easegress для формирования надёжной единицы доставки и сохранения решений. Плоскость данных состоит из каждой mesh-службы с бизнес-логикой пользователя и модулей расширения EaseMesh, включая EaseAgent и Easegress-sidecar. Также существует блок Mesh Ingress для маршрутизации и обработки трафика в направлении «юг-север».
Установка Пожалуйста, ознакомьтесь с install.md, чтобы установить EaseMesh.
Клиентский командный инструмент
Клиентский командный инструмент EaseMesh — emctl
, пожалуйста, ознакомьтесь с emctl.md для использования.
Mesh-служба Службы являются основными элементами EaseMesh. Разработчикам необходимо разбить свою бизнес-логику на небольшие модули и реализовать её как службы.
В отличие от K8s-служб, EaseMesh управляет приложением через службу, служба имеет логическое имя, связанное с одним или несколькими развёртываниями K8s. Служба имеет собственную спецификацию и должна принадлежать к арендатору.
Служба может иметь несколько версий, версия службы представляет собой MeshDeployment или собственное K8s-развёртывание, которое привязывается к ресурсу Kubernetes Deployment.
Арендатор
используется для группировки нескольких служб одного бизнес-домена. Службы могут взаимодействовать друг с другом в одном арендаторе. В EaseMesh есть специальный глобальный арендатор, который виден всей сети. Пользователи могут размещать некоторые глобальные общие службы в этом специальном арендаторе.
Примечание: Все спецификации в EaseMesh написаны в формате Yaml.
Создайте арендатора для служб. Вы можете развернуть новую mesh-службу в существующем арендаторе или создать новый для неё. Измените пример содержимого YAML ниже и примените его:
name: ${your-tenant-name}
description: "This is a test tenant for EaseMesh demoing"
Пожалуйста, не забудьте изменить заполнители YAML, такие как ${your-tenant-name}, на реальное название службы перед применением. Ссылка на спецификацию арендатора: https://github.com/megaease/easemesh-api/blob/master/v1alpha1/meshmodel.md#easemesh.v1alpha1.Tenant
Создайте службу и укажите, к какому арендатору принадлежит служба. Создайте свою mesh-службу в EaseMesh. Обратите внимание, что сейчас нам нужно добавить только эту новую сущность логики службы. Реальная бизнес-логика и способ развёртывания будут представлены позже. Измените пример содержимого YAML ниже и примените его.
name: ${your-service-name} registerTenant: ${your-tenant-name}
loadBalance:
policy: roundRobin
HeaderHashKey:
sidecar:
discoveryType: eureka
address: "127.0.0.1"
ingressPort: 13001
ingressProtocol: http
egressPort: 13002
egressProtocol: http
Теперь у нас есть новый арендатор и новая сервисная сетка. Они оба являются логическими единицами без реальных обрабатывающих сущностей.
Для регистрации/обнаружения сервисов EaseMesh поддерживает три основных решения: Eureka/Consul/Nacos. Ознакомьтесь с соответствующей конфигурацией ниже:
| Имя | URL в конфигурации развёртывания сетки |
| --- | ------------------------------------- |
| Eureka | http://127.0.0.1:13009/mesh/eureka |
| Consul | http://127.0.0.1:13009 |
| Nacos | http://127.0.0.1:13009/nacos/v1 |
Взаимодействие между внутренними сервисами сетки может осуществляться через рекомендованные Spring Cloud клиенты, такие как `WebClient`, `RestTemplate` и `FeignClient`. Исходный RPC на основе HTTP домена остаётся неизменным. Обратите внимание, что EaseMesh будет размещать трафик по маршруту Ease-West по имени сервиса сетки, поэтому необходимо сохранить имя сервиса сетки таким же, как исходное имя приложения Spring Cloud для RPC на основе HTTP домена.
## Нативное развёртывание
Помимо пользовательского ресурса [MeshDeployment](#meshdeployment), мы поддерживаем нативный ресурс развёртывания K8s для автоматического внедрения JavaAgent и sidecar.
Если вы хотите, чтобы EaseMesh управлял приложениями, вам необходимо выполнить следующие предварительные условия:
1. Создайте пространство имён с указанной меткой.
2. Аннотируйте спецификацию развёртывания соответствующими аннотациями.
3. Разверните приложения через K8s Deployments.
### Создайте конкретное (заинтересованное) пространство имён
EaseMesh следит только за операциями создания/обновления, происходящими в заинтересованном пространстве имён. Заинтересованным пространством имён является пространство имён с определённой меткой. Поэтому, если вы хотите, чтобы EaseMesh автоматически внедрил sidecar и JavaAgent для развёртывания в пространстве имён, вам нужно создать пространство имён с меткой ключа: `mesh.megaease.com/mesh-service`.
Например:
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: spring-petclinic
labels:
mesh.megaease.com/mesh-service: "true"
Независимо от того, какое значение установлено для
mesh.megaease.com/mesh-service
, EaseMesh будет рассматривать пространство имён как заинтересованное пространство имён, в котором будут инструментированы операции создания/обновления развёртываний.
Как упоминалось ранее, EaseMesh будет инструментировать операции создания/обновления развёртываний в указанном пространстве имён, но внедрение EaseMesh не всегда будет применяться ко всем развёртываниям в пространстве имён, оно будет влиять только на развёртывание, аннотированное указанной аннотацией.
EaseMesh предоставляет следующие аннотации пользователям, которые помогут EaseMesh эффективно управлять приложениями пользователей:
mesh.megaease.com/service-name
: Обязательная аннотация, это имя MeshService.mesh.megaease.com/service-labels
: Необязательная аннотация, если вам нужна канареечная версия приложений, вы можете указать её в форме «ключ=значение». Эти метки будут прикреплены к экземплярам, зарегистрированным в реестре служб.mesh.megaease.com/app-container-name
: Необязательная аннотация, Если ваши развёртывания содержат несколько контейнеров, вам необходимо указать, какой контейнер является вашим контейнером приложения. Если он опущен, EaseMesh предполагает, что первый контейнер является контейнером приложения.mesh.megaease.com/application-port
: Необязательная аннотация, Если контейнер приложения прослушивает несколько портов, вы должны указать порт в качестве порта приложения, с которого предоставляются услуги. Если он опущен, первый порт считается портом приложения.mesh.megaease.com/alive-probe-url
: Необязательная аннотация, sidecar должен знать, жив или мёртв контейнер приложения. Если она опущена, по умолчанию используется: http://localhost:9900/health
, JavaAgent откроет порт для прослушивания. Mesh.megaease.com/init-container-image: Необязательная аннотация, имя образа initContainer, который содержит jar JavaAgent, обеспечивающий наблюдаемость сервиса. Если опущено, будет использоваться образ контейнера по умолчанию.Mesh.megaease.com/sidecar-image: Необязательная аннотация, образ sidecar для управления трафиком сервиса. Если опущено, будет использован образ sidecar по умолчанию.
Например:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ${your-ns-name}
name: ${your_service-name}-canary
annotations:
mesh.megaease.com/service-name: ${your_service-name}
spec:
replicas: 0
selector:
matchLabels:
app: app1 #Note! service name should remain the same with the origin mesh service
template:
metadata:
labels:
app: app1
spec:
containers:
...
Будет устаревшим в версии 1.4.0. Мы не рекомендуем его использовать. Предпочитайте использовать собственное развёртывание с выделенной аннотацией, см. Native deployment.
EaseMesh полагается на Kubernetes для управления экземплярами сервисов и требуемыми ресурсами. Например, мы можем масштабировать количество экземпляров с помощью Kubernetes. Фактически EaseMesh использует механизм, называемый Kubernetes Custom Resource Define (CRD), чтобы объединить метаданные сервиса, используемые EaseMesh, и оригинальное развёртывание Kubernetes. MeshDeployment можно использовать не только для развёртывания и управления экземплярами сервиса, но и для реализации канареечного развёртывания.
MeshDeployment оборачивает собственные ресурсы K8s Deployment спецификации. Содержимое раздела spec.deploy
в спецификации MeshDeployment полностью соответствует определению спецификации развёртываний K8s.
apiVersion: mesh.megaease.com/v1beta1
kind: MeshDeployment
metadata:
namespace: ${your-ns-name}
name: ${your_service-name}-canary
spec:
service:
name: ${your-service-name}
labels:
version: canary # Эти карты используются для маркировки этих канареечных экземпляров
deploy: # Содержимое спецификации собственного развёртывания K8s
replicas: 2
selector:
matchLabels:
app: ${your-service-name} #Note! service name должно совпадать с именем исходного сервиса mesh
template:
metadata:
labels:
app: ${your-service-name}
spec:
containers:
...
В EaseMesh мы используем EaseMeshController на основе Easegress для выполнения роли Sidecar. В качестве сайдкара контроллер сетки будет обрабатывать входящий и исходящий трафик. Входящий трафик означает бизнес-трафик извне в сайдкар, а исходящий — бизнес-трафик из сайдкара наружу. Мы представляем их простой диаграммой:
Входящий трафик
MeshController создаст выделенный конвейер для обработки входящего трафика:
Исходящий трафик
MeshController создаёт выделенные конвейеры для обработки исходящего трафика:
Диаграмма выше представляет логическое направление запроса трафика, потоки ответов идут в противоположном направлении, которое относится к той же категории, что и соответствующие запросы.
Обратите внимание, что сайдкар обрабатывает только бизнес-запросы, то есть он не перехватывает трафик:
Но мы хорошо совместимы с экосистемой Java, поэтому адаптируем основные реестры обнаружения служб, такие как Eureka, Nacos и др. HTTP based RPC
Информация о взаимодействии между mesh-сервисами через протокол HTTP, такая как задержка, код состояния, путь запроса и так далее. В настоящее время EaseMesh поддерживает трассировку для WebClient, RestTemplate и FeignClient. Вскоре будет поддерживаться больше библиотек HTTP RPC.
JDBC
Информация о задержке выполнения SQL-запросов MySQL, операторах, результатах и так далее.
Redis
Информация о задержках команд Redis, ключах и так далее.
RabbitMQ
Информация о задержках команд RabbitMQ, топиках, рутинах ключей и так далее.
Kafka
Информация о задержках топиков Kafka и так далее.
EaseMesh использует EaseAgent для ненавязчивого сбора данных о промежутках времени и Kafka для хранения всех собранных данных трассировки.
outputServer:
enabled: true
bootstrapServer: ${your_kafka_host_one}:9093,${your_kafka_host_two}:9093,${your_kafka_host_three}:9093
timeout: 30000
Спецификация OutputServer: https://github.com/megaease/easemesh-api/blob/master/v1alpha1/meshmodel.md#easemesh.v1alpha1.ObservabilityOutputServer
tracings:
enabled: true # Глобальный переключатель включения
sampleByQPS: 30 # Данные выше QPS 30 будут игнорироваться
output:
enabled: true # Включение отчётности Kafka
reportThread: 1 # Использование одного потока для отчёта в JavaAgent
topic: log-tracing # Название темы отчёта Kafka
messageMaxBytes: 999900 #
queuedMaxSpans: 1000
queuedMaxSize: 1000000
messageTimeout: 1000
request:
enabled: false
servicePrefix: httpRequest
remoteInvoke:
enabled: true # Включение этого переключателя только для трассировки RPC
servicePrefix: remoteInvoke
kafka:
enabled: false
servicePrefix: kafka
jdbc:
enabled: false
servicePrefix: jdbc
redis:
enabled: false
servicePrefix: redis
rabbit:
enabled: false
servicePrefix: rabbit
Спецификации ObservabilityTracings: https://github.com/megaease/easemesh-api/blob/master/v1alpha1/meshmodel.md#easemesh.v1alpha1.ObservabilityTracings
MegaEase предоставляет сложный инструмент для быстрой диагностики проблем пользователями.
Проверка веб-консоли на предмет информации трассировки RPC для вашего mesh-сервиса:
tracings:
enabled: false # Глобальный переключатель включения
sampleByQPS: 30 # Данные выше QPS 30 будут игнорироваться
output:
enabled: true
......
tracings:
enabled: true
sampleByQPS: 30
output:
enabled: true
reportThread: 1
topic: log-tracing
messageMaxBytes: 999900
queuedMaxSpans: 1000
queuedMaxSize: 1000000
messageTimeout: 1000
request:
enabled: true
servicePrefix: httpRequest
remoteInvoke:
enabled: true
servicePrefix: remoteInvoke
kafka:
enabled: true
servicePrefix: kafka
jdbc:
enabled: true
servicePrefix: jdbc
redis:
enabled: false # Отключаем этот переключатель, чтобы не отслеживать вызовы Redis
servicePrefix: redis
Для получения подробной информации о каждой метрике ознакомьтесь с руководством по разработке EaseAgent develop-guide.md.
Вот некоторые из метрик, которые уже поддерживаются EaseMesh:
Название | Описание |
---|---|
HTTP-запрос | Метрики HTTP API mesh-сервиса, такие как m1/m5/m15 rate (m1 указывает на выполнение HTTP-запросов в секунду экспоненциально взвешенное скользящее среднее за последнюю минуту), URL, общее количество, количество ошибок, p99 (длительность выполнения HTTP-запроса в миллисекундах для 99% пользователей) и так далее. |
JDBC Statement | Метрики операторов JDBC mesh-сервиса, такие как сигнатура (используется для полного сопоставления предложений SQL), общее количество JDBC, скорость m1 JDBC (выполнение методов JDBC в секунду экспоненциальное взвешенное скользящее среднее за последнюю минуту.), максимальная ошибка скорости JDBC M1, длительность выполнения JDBC P99 и так далее. |
Соединение JDBC | Метрики соединения JDBC mesh-сервиса, такие как URL, общее количество соединений JDBC, скорость соединения JDBC M1, минимальная длительность выполнения соединения JDBC, минимальная длительность выполнения соединения JDBC, длительность выполнения соединения JDBC P99 и так далее. |
Память JVM | Связанные с памятью JVM метрики mesh-сервиса, такие как начальная память JVM, используемая память JVM, зафиксированная память JVM и максимальная память JVM. |
Сборщик мусора JVM | Метрики сборщика мусора JVM mesh-сервиса. |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )