Мышление Даббо под K8s

Kubernetes

Автор | Цао Шэнли Apache Dubbo PMC

Управляемое чтение: Стереотип о Dubbo как о высокопроизводительной среде Java RPC давно глубоко укоренился в сердцах людей.С точки зрения выбора архитектуры Cloud Native, Spring Cloud может быть предпочтительным выбором в отрасли. Фактически, Dubbo незаметно превратилась в инфраструктуру Cloud Native, не только унаследовав славу прошлой эпохи RPC, но и улучшив отсутствие существующей инфраструктуры. С появлением на сцене контейнеров и K8 это поставило перед исходной областью RPC большие проблемы.В этой статье в основном обсуждаются проблемы, возникающие в области RPC, и некоторые мысли о том, как RPC может использовать K8.

Введение в K8s

Kubernetes — это приложение с открытым исходным кодом, используемое для управления контейнерными приложениями на нескольких узлах облачной платформы. Цель Kubernetes — сделать развертывание контейнерных приложений простым и эффективным. Kubernetes предоставляет метод развертывания, планирования, обновления и обслуживания приложений. механизм. Kubernetes сокращенно K8s.

file

В Kubernetes наименьший элемент управления — это не отдельные контейнеры, а поды. В жизненном цикле пода необходимо обратить внимание на следующие моменты:

  • Контейнеры и приложения могут быть уничтожены в любое время;
  • IP-адрес пода и имя хоста могут отличаться (если только они не были созданы с помощью StatefulSet);
  • Файлы, записанные на локальный диск, могут исчезнуть.Если вы хотите избежать инвалидации, вам необходимо использовать том хранилища.

Связь между приложением, контейнером и модулем

  • Приложения развертываются в контейнерах.Как правило, приложение развертывается только в одном контейнере;
  • Под может содержать один или несколько контейнеров.Как правило, для пода рекомендуется развертывать только один контейнер. За исключением следующих сценариев:
    • боковая машина;
    • Контейнер работает с другим контейнером локально. Например, приложение в одном контейнере отвечает за загрузку данных, а приложение в другом контейнере предоставляет услуги внешнему миру.

Service

Если некоторые модули предоставляют некоторые функции для использования другими модулями, как эти внешние интерфейсы могут постоянно отслеживать эти серверные части в кластере Kubernetes? Ответ: Служба.

Служба Kubernetes – это абстракция политики, определяющая набор модулей Pod. Эти модули, отмеченные службой, обычно определяются селектором меток. Сервисы абстрагируют доступ к подам.

Служба по умолчанию получает запись через IP-адрес кластера. Однако иногда необходимо вернуть список всех IP-адресов Pod, соответствующих условиям, и в этом случае Headless Services можно использовать напрямую.

Ссылаться на:kubernetes.io/

Рекомендуемые книги:kubernetes in action

Введение и анализ RPC

С ростом популярности микросервисов существует достаточно зрелых решений для связи между приложениями.

  • После того, как в 2011 году исходный код Dubbo был открыт, его приняло большое количество малых и средних компаний;
  • После запуска Spring Boot Spring постепенно показал свою вторую пружину, а затем был запущен Spring Cloud, постепенно занимающий рынок и борющийся с Dubbo на китайском рынке;
  • gRPC — это инструмент сквозной связи, основанный на Http2, запущенный Google, и постепенно занимает доминирующее положение на рынке K8s, например, etcd, Istio и т. д. — все они используют gRPC в качестве средства связи;
  • Концепция Service Mesh с самого начала была горячей, и теперь она постепенно становится зрелой;
  • Istio + Envoy (другие коляски) постепенно начали выходить на сцену.

Точка зрения разработчика приложений

С функционального уровня функции, которые воспринимаются разработчиками:

  • реализация услуги
  • Экспозиция службы (аннотация или конфигурация)
  • Сервисный вызов (аннотация или конфигурация)
  • Управление услугами и т. д.

С точки зрения выбора следует обратить внимание на следующие моменты:

  • Простота использования (простота разработки и готовность к работе)
  • представление
  • Функции
  • Расширяемость и т.д.

Точка зрения разработчика фреймворка

Ключевой процесс:

  • сервисное воздействие
  • регистрация службы
  • обнаружение службы
  • сервисный звонок
  • Служба управления

Ключевые точки знаний:

  • Сериализация
  • Телекоммуникации
  • сервисная маршрутизация
  • балансировки нагрузки
  • Лимит сервисного тока
  • предохранитель
  • Управление услугами, например переход на более раннюю версию

Внедрение основных технологий

Dubbo / HSF

file

  • Dubbo обеспечивает интерфейсно-ориентированный вызов удаленных методов. Разработчики приложений определяют интерфейсы, пишут службы и выставляют их;
  • Клиентская сторона звонит через интерфейс;
  • Размер службы регистрации Dubbo — это размер интерфейса, и каждый интерфейс будет записывать часть данных в центр регистрации;
  • Dubbo поддерживает условную маршрутизацию, маршрутизацию по сценариям, маршрутизацию по тегам и т. д. Эти правила маршрутизации сильно зависят от IP-адресов.

Примечания: Большинство механизмов Dubbo и HSF схожи, поэтому Dubbo используется в качестве решения для обсуждения ниже.

SpringCloud

Spring Cloud совершает сетевые вызовы в виде Rest. Разработчики приложений могут создавать свои собственные открытые сервисы Rest, такие как springmvc.

Регистрация службы в Spring Cloud является измерением приложения (Eureka), и клиент и сервер взаимодействуют согласованным образом.

Spring Cloud предоставляет набор стандартных API, из которых Netflix является лучшим среди них.Этот API был реализован.Большинство разработчиков могут напрямую полагаться на Netflix и использовать его, поэтому можно сказать, что Netflix предоставляет ядро Весеннее облако. Однако, как коммерческая компания, инвестиции в открытый исходный код часто изменчивы, например, Eureka систематически поддерживается.

gRPC

gRPC — это инфраструктура RPC, разработанная на основе протокола HTTP/2, который использует Protobuf в качестве IDL. Как сквозное коммуникационное решение, gRPC может решить текущую проблему многоязычия.

Сам gRPC не предоставляет функции регистрации и управления услугами. Но теперь видно, что у gRpc есть амбиции расширяться в этом направлении.

K8s

В системе K8s нет среды честного общения, и в качестве основы RPC обычно рекомендуется gRPC.

По умолчанию в системе K8s IP-адрес модуля меняется, поэтому существует несколько способов связи между модулем и модулем:

  • Сервис+DNS: Чтобы создать новый Сервис, вы можете выбрать набор списков Pod через метки.Этот Сервис соответствует неизменному IP-адресу кластера, клиент получает доступ к IP-адресу кластера через DNS или напрямую. Этот кластерный IP примерно равен реализации балансировки нагрузки (режим iptable);
  • Услуги без головы: разница между безголовой службой и вышеупомянутой службой заключается в том, что он не предоставляет кластер IP, но получает набор списков IP в виде хостов имен хоста, и клиент решает, какой POD к доступу.

Istio + Envoy

file

Уровень управления Istio будет запрашивать и отслеживать информацию о модулях, сервисную информацию и другую информацию с сервера K8s API. Таким образом, у Istio есть полная информация о подах, сервисах и т. д. во всем кластере K8s. При изменении информации в кластере K8s Istio также может получить уведомление и обновить соответствующую информацию.

В качестве примера кратко представлен Envoy, одна из наиболее распространенных реализаций Proxy. Envoy динамически обнаруживает ресурсы, запрашивая файлы или серверы управления. Соответствующая служба обнаружения и соответствующие API называются xDS. Содержание соглашения включает LDS, RDS, CDS и так далее.

использованная литература:

Введение в Service Mesh:woohoo.info Q.capable/article/pat…Istio
Правила маршрутизации:это TiO.IO/docs/tasks/…

Примечания: Вышеуказанные знания получены путем ознакомления с информацией (официальный сайт Istio) и общения со студентами группы Service Mesh. Если есть какие-либо проблемы, пожалуйста, поправьте меня.

резюме

file

Возникшие проблемы и вызовы

Симбиоз Spring Cloud и Dubbo

Dubbo по умолчанию основан на TCP-соединении, а Spring Cloud в основном основан на запросах Rest. В процессе коммерциализации Alibaba Cloud было обнаружено, что большому количеству компаний нужны приложения Spring Cloud для связи с Dubbo, и сообщество в основном полагается на добавление уровня шлюза в Dubbo для решения проблемы.

Существует ли решение для унифицированного обнаружения регистрации службы и вызова службы?

Основная теория может относиться к:

Особенно Aliyun.com/articles/58…

Задача Даббо на сцене K8s

IP-адрес Pod под K8s является переменным (по умолчанию), и управление услугами Dubbo сильно зависит от IP-адреса.

Регистрация службы K8s завершается определением пода, а обнаружение службы — это фактически процесс поиска подов. Поды и приложения имеют определенное соответствие, которое не соответствует модели обнаружения регистрации службы измерения интерфейса в Dubbo.

Жилое пространство Даббо в сцене Service Mesh

Dubbo должен поддерживать отсечение, и большинство функций Dubbo можно выполнять с помощью sidecar (прокси).

Если компания уже развертывает инфраструктуру RPC и ей необходимо внедрить Service Mesh в настоящее время, есть ли хороший план перехода?

сортировка проблем

определение услуги

Как определяется услуга? Нам нужно посмотреть, как определять сервисы с точки зрения разработчиков приложений.

Услуга соответствует функции в функциональном измерении, например, запрос сведений о приобретенном заказе. В Dubbo он соответствует методу под интерфейсом, в Spring Cloud и gRPC — http-запросу.

С точки зрения функционально-ориентированного программирования сервис — это функция. В языке Java класс является основой всего программирования, поэтому, если некоторые службы агрегируются в соответствии с определенным измерением и помещаются в интерфейс, он становится интерфейсом, содержащим множество служб.

Объясните с точки зрения Dubbo: Dubbo — это удаленная связь для программирования интерфейса, поэтому Dubbo — это сервисно-ориентированное программирование.Если вы хотите вызвать сервис, вы должны ввести его через интерфейс, а затем вызвать сервис в интерфейс. Функция запроса службы, представленная в Dubbo Ops, на самом деле не запрашивает одну службу, а получает определенные методы (службы) после запроса интерфейса (набора служб).

В мире Spring Cloud поставщик услуг регистрирует информацию о своем приложении (IP+port) в качестве экземпляра под приложением, а потребитель услуг и поставщик услуг делают запросы на отдых в согласованной форме. Каждому запросу соответствует услуга.

Отличие от Сервиса в K8s

Служба в K8s на самом деле соответствует набору списков pod+port, которые тесно связаны с DNS, что выражается простым для понимания способом: поддерживается сопоставление отношений набора pod. Упомянутые выше услуги представляют собой два понятия, которые относятся к разным сценариям.

При таком определении служб степень детализации управления службами фактически основывается на степени детализации службы.Вы можете установить период ожидания для каждой службы, установить правила маршрутизации и т. д. Но какое отношение детализация регистрации услуг имеет к услугам?

Детализация регистрации службы

Приложение содержит множество интерфейсов, а интерфейс содержит множество служб (Dubbo) или приложение содержит множество служб (Spring Cloud). Проанализируйте преимущества и недостатки регистрации измерения приложения и измерения интерфейса. Будет отдельная статья, объясняющая схему применения регистрации размеров.

Регистрация измерения интерфейса

преимущество:

  • Служебный запрос очень удобен для запроса в соответствии с измерением интерфейса, а сложность реализации невелика;
  • Когда приложение разделено или объединено, клиенту (потребителю) не нужно заботиться, чтобы пользователь этого не чувствовал.

недостаток:

  • Это не соответствует модели основных платформ, таких как K8s;
  • Объем регистрируемых данных очень велик, и существует определенный риск производительности.

применить измерение

преимущество:

  • Совместим с K8s, Spring Cloud и другими моделями;
  • Производительность может быть значительно снижена.

недостаток:

  • Когда приложение разделено или объединено, клиент должен это воспринимать (если вы хотите быть невидимым, разработчику фреймворка необходимо поддерживать хранилище интерфейса и отношения отображения приложения);
  • Если вы хотите сохранить исходный запрос измерения интерфейса Dubbo для пользователей, вам потребуется дополнительная рабочая нагрузка;
  • Для пользователя меньше прозрачности, и в OPS должны быть предоставлены некоторые другие инструменты. Например, разработчики приложений могут проверить, предоставляет ли конкретный IP-адрес услугу, и так далее.

Даббо и Весеннее облако

Цель:

  • Унифицировать сервисное обнаружение Dubbo и Spring Cloud;
  • Dubbo и Spring Cloud могут звонить друг другу.

Унифицированное обнаружение сервисов

Dubbo трансформируется в сервисную регистрацию приложений. (Специфика не будет расширена, и будет объяснена в следующей статье)

Пройти вызов

В реализации Dubbo поддержка будет представлена ​​в протоколе Rest и распознана Spring Cloud.

Dubbo + K8s

Как объяснялось в K8s, далее также предполагается, что приложение развернуто в контейнере, а контейнер развернут в поде.

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

Служба управления

Управление службами в оригинальной системе Dubbo сильно зависит от IP.Когда настроен набор правил управления службами, он в конечном итоге основывается на одном или нескольких IP-адресах.

После входа в систему K8s следует учитывать, что IP Pod не зафиксирован. Таким образом, текущие правила маршрутизации не могут соответствовать условиям, и будет создано много ненужных данных правил. В системе K8s поиск подов через сервисы основан на селекторах меток; управление подами через развертывания фактически основано на селекторах меток подов. Таким образом, селектор меток пода является более общим решением в упражнениях K8.

Взяв в качестве примера правила маршрутизации, необходимо поддерживать новое правило маршрутизации: маршрутизацию по меткам. После выполнения определенных условий найдите результат в списке подов, запрошенном с помощью селектора меток, вместо исходного списка IP-адресов.

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

Как приложение получает информацию о текущем поде

  • Pod определяет переменные среды, и приложение получает их; Dubbo обеспечивает поддержку чтения переменных среды. Pod должен установить конкретную информацию о модуле в соответствии с переменными среды, определенными Dubbo.

  • Передача информации Pod через API Downward; Dubbo должен обеспечить чтение каталога для Downward, и соответствующую конфигурацию нисходящего направления необходимо настроить в Pod.

  • Получайте данные через API-сервер; это самый мощный способ, но приложения должны в значительной степени полагаться на API-сервер.

Как приложения получают информацию от других модулей

  • Получается путем вызова сервисов других подов; это зависит от того, как приложение получает информацию о своем поде и в то же время предоставляет информацию о своем поде в качестве службы (протокол отдыха или дублирования). Клиентская сторона получает полную информацию о соответствующем поде, вызывая соответствующий под.

  • Получение данных через сервер API; очень мощный, но увеличивает зависимость от сервера API.

Регистрация и обнаружение службы

В системе K8s обнаружение службы RPC имеет следующие методы:

  • Механизм регистрации: записываем IP в центр регистрации, сохраняем соединение с сердцебиением, когда сердцебиение прекращается, удаляем его из центра регистрации;

  • Используя Сервис + DNS: Создать новый Сервис, вы можете выбрать набор списков Pod через метки, этот Сервис соответствует неизменному IP-адресу кластера, клиент обращается к IP-адресу кластера через DNS или напрямую. Этот кластерный IP примерно равен реализации балансировки нагрузки (режим iptable);

  • Использование безголовой службы (DNS). Разница между безголовой службой и вышеупомянутой службой заключается в том, что она не предоставляет кластерный IP-адрес, а получает набор списков IP-адресов в виде имен хостов, а клиент решает, к какому поду обращаться;

  • API-сервер: клиент напрямую запрашивает API-сервер для получения списка модулей, и клиент сам определяет логику доступа к модулям. В то же время добавьте часы при его получении, и сервер API будет синхронизировать информацию об изменении модуля с Клиентом.

Получив IP-адрес или хост сервера, клиент может инициировать запросы http или другого протокола.

Ниже приведены возможные решения, соответствующие Dubbo:

1. Dubbo + Zookeeper pod cluster (HSF+CS cluster)

Это самый простой способ, а сам Dubbo не требует каких-либо модификаций. Проблема в том, что обслуживание Zookeeper увеличено, в то же время это решение не является облачным и не имеет ничего общего с системой K8s.

Мозговой штурм

В приведенной выше схеме в качестве центра регистрации используется ZooKeeper, так можно ли использовать сервис в K8s в качестве центра регистрации? Создайте службу для каждого интерфейса в Dubbo, обновите информацию о конечной точке в процессе запуска каждого экземпляра приложения и установите связь между Службой->Конечная точка->Список IP-адресов.

В этом решении определение службы K8s было преобразовано, и определено слишком много служб, поэтому обслуживание и управление службами представляет собой сложную проблему.

Сценарии на основе K8s

В традиционном домене RPC службы делятся на регистрацию службы и обнаружение службы. В области K8s между модулями и приложениями существует связь один к одному.K8s сам предоставляет возможность поиска модулей, поэтому в определенной степени регистрация службы может не существовать, а требуется только обнаружение службы. Но на самом деле это требует предпосылки:

Dubbo необходимо преобразовать детализацию обнаружения регистрации службы в измерение приложения. > На уровне эксплуатации и обслуживания напишите app=xxx (имя приложения) в метке модуля.

2. Dubbo + K8s DNS

Если служба K8s предоставляет IP-адрес кластера, то Dubbo отвечает только за вызов IP-адреса кластера, а логика маршрутизации и балансировки нагрузки передается для завершения прокси-серверу K8s. Это решение уменьшает основные возможности Dubbo. Далее мы обсудим возможности, предоставляемые безголовым сервисом.

Инициируйте запрос на получение списка IP-адресов, запросив ..svc.. IN A, но он должен постоянно получать обновленный список IP-адресов путем опроса.

Функции, связанные с управлением службами, должны независимо поддерживаться в вышеуказанном разделе управления службами.

Ссылаться на:GitHub.com/Это так особенно/…

3. Dubbo + Api Server

file

Для приложения Dubbo, развернутого в контейнере Pod, процесс регистрации службы может быть удален напрямую.Функция обнаружения службы взаимодействует с сервером Api, чтобы получить информацию о Pod и службе и одновременно отслеживать изменения модуля и службы. Таким образом, информацию, связанную с управлением службами, также можно получить непосредственно через сервер Api.

4. Dubbo + Istio + Envoy

Dubbo может напрямую использовать указанный ip+port для вызова Envoy из того же модуля (это также может быть Envoy того же узла). Dubbo делегирует Istio и Envoy правила маршрутизации, балансировку нагрузки, автоматические выключатели и другие функции. Envoy должен поддерживать пересылку протокола Dubbo.

Таким образом, Dubbo необходимо выполнить две вещи: прямое локальное IP-соединение (существующая функция), обрезка избыточных функций (пока не реализована).

5. Dubbo + Istio

file

  • Приложения Dubbo больше не полагаются на Envoy как на вспомогательный инструмент, а напрямую взаимодействуют с Istio, используя Istio в качестве реестра и центра конфигурации для управления услугами;
  • Dubbo должен предоставить аналогичный протокол xDS и преобразовать экземпляр службы в формат протокола dubbo в пилотной версии;
  • Dubbo также необходимо адаптировать к некоторым функциям istio, таким как проверка работоспособности и логика, связанная с безопасностью. Для конкретной реализации, пожалуйста, обратитесь к реализации Envoy.

6. Вариантов сосуществования Dubbo и Istio под системой K8s множество, предлагаю всем на размышление две идеи:

  • Вся регистрация служб осуществляется через механизм k8s, а все обнаружение служб осуществляется через службу Headless. В процессе создания коляски необходимо обновить исходный сервис K8s;

  • Nacos выступает в качестве регистрационного центра Dubbo и должен частично передавать данные в K8s. Dubbo, зарегистрируйте службу в Nacos в измерении приложения, Istio Pilot необходимо идентифицировать данные Nacos; операционный механизм Istio в основном не изменился, а данные экземпляра службы K8s необходимо записать в nacos для вызова Dubbo.

7. Сосуществование облачных и внеоблачных сред и многокластерных сред в облаке

Istio предоставляет кросс-кластерные решения и решения «облако в облаке», а kubeFed также может играть роль кросс-кластерного решения K8s.

Сложность этой темы еще выше, и у меня есть некоторые ответы в моем сердце.Я надеюсь, что у вас также будут некоторые мысли через вышеизложенное.

Сервисный запрос

Выбросьте три способа, чтобы все подумали.

Дуббо оригинальный способ

Исходный служебный запрос Dubbo предназначен для интерфейсов, и у каждого интерфейса есть номер версии и группа. Имя интерфейса + номер версии + группа определяют уникальный набор услуг. В этом наборе услуг есть соответствующие поставщики услуг и потребители услуг (зависимости на уровне интерфейса). Поставщик услуг — это набор списков IP+портов, а потребитель услуг — это также список групповых IP+портов.

file

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

Поддерживает только запрос приложения

Подобно Spring Cloud, он поддерживает запросы приложений. После запроса конкретного приложения список ip+port включается в сведения о приложении.Каждый ip+port фактически является экземпляром приложения. Нажмите, чтобы открыть каждый экземпляр приложения, вы можете просмотреть подробную информацию о каждом приложении, включая услуги, предоставляемые экземпляром.

Интерфейс + баланс запроса приложения

На основе только поддерживающего запроса приложения добавляется дополнительный шаг: он поддерживает запрос списка приложений, соответствующего определенному интерфейсу, и большинство интерфейсов принадлежат только одному приложению.

После нажатия на конкретное приложение в списке приложений он перейдет к сведениям о приложении.

Суммировать

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

Тенденцию использования облачных технологий остановить невозможно, и еще слишком рано говорить о том, какое решение в конечном итоге победит в области RPC. Я верю, что и Service Mesh, и традиционный RPC (Dubbo/gRPC) найдут свое место, пусть время даст нам ответ.

«Официальная учетная запись Alibaba Cloud Native WeChat (идентификатор: Alicloudnative) фокусируется на микросервисах, бессерверных технологиях, контейнерах, Service Mesh и других технических областях, фокусируется на популярных тенденциях облачных технологий, практиках крупномасштабного внедрения облачных технологий и является самый знающий облачный разработчик. Технический публичный аккаунт».