Рубрики
Без рубрики

Как настроить микросервисы Java с помощью Istio servicemesh на Kubernetes

Как настроить микросервисы JHipster с помощью Istio servicemesh на Kubernetes и развернуть в AKS или GKE. Помечены микросервисами, java, kubernetes, istio.

Первоначально опубликовано по адресу deepu.tech .

Первоначально опубликовано на Medium 17 ноября 2018 года. Это сообщение было обновлено в январе 2020 года для работы с последней версией JHipster (7.0.0-beta.1) и Istio (1.8.2).

Сейчас Edition – самый крутой парень в DevOps и облачном блоке. Для тех из вас, кто недостаточно внимательно следит за Istio — это сервисная сетка для распределенных архитектур приложений, особенно тех, которые вы запускаете в облаке с помощью Kubernetes. История очень хорошо работает с Kubernetes, настолько хорошо, что вы можете подумать, что это часть платформы Kubernetes. Такие платформы, как Google Cloud, даже предоставляют его из коробки, когда вы используете движок Google Kubernetes.

Если вам все еще интересно, что, черт возьми, такое service mesh или Edition? тогда давайте сделаем обзор Sitio.

Это к

Istio предоставляет следующие функциональные возможности в архитектуре распределенных приложений:

  • Обнаружение сервисов — Традиционно предоставляется такими платформами, как Netflix Eureka или Проконсультируйтесь .

  • Автоматическая балансировка нагрузки — Возможно, вы использовали Netflix Zuul за это.

  • Маршрутизация, прерывание цепи, повторные попытки, отказы, внедрение ошибок – Подумайте о Ленте Netflix , Истрикс и так далее.

  • Применение политик для контроля доступа, ограничения скорости, A/B—тестирования, разделения трафика и квот – опять же, вы, возможно, использовали Zuul для выполнения некоторых из них.

  • Показатели, журналы и трассировки — Подумайте о ELK или Драйвер стека

  • Безопасная связь между службами

Ниже приведена архитектура Sitio.

Архитектура Istio

Его можно разделить на 2 отдельные плоскости.

Плоскость данных : Состоит из прокси-серверов Envoy , развернутых в качестве колясок для контейнеров приложений. Они контролируют весь входящий и исходящий трафик в контейнер.

Control plane : Он использует Pilot для управления и настройки прокси-серверов для маршрутизации трафика. Он также настраивает Mixer для применения политик и сбора телеметрии. В нем также есть другие компоненты, такие как Citadel для управления безопасностью и Galley для управления конфигурациями.

Вы также можете настроить Графана , Прометей , Егерь / Зипкин , и Кигали

Я надеюсь, что это дает обзор истории, теперь давайте сосредоточимся на цели этой статьи.

Подготовка кластера Kubernetes

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

Предпосылки

Мы будем использовать int ioctl для установки Visio в кластере Kubernetes и kubectl для развертывания приложений.

кубектл : Инструмент командной строки для взаимодействия с Kubernetes. Установите и настройте его.

Создание кластера в службе Azure Kubernetes(AKS)

Если вы собираетесь использовать Azure, то установите Azure CLI для взаимодействия с Azure. Установите и войдите в систему с помощью своей учетной записи Azure (вы можете создать бесплатную учетную запись если у вас его еще нет). Если нет, пропустите этот раздел.

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

$ az group create --name eCommerceCluster --location eastus

Создайте кластер Kubernetes:

$ az aks create \
  --resource-group eCommerceCluster \
  --name eCommerceCluster \
  --node-count 4 \
  --kubernetes-version 1.15 \
  --enable-addons monitoring \
  --generate-ssh-keys

Флаг node-count важен, так как для настройки требуется по крайней мере четыре узла с процессором по умолчанию для запуска всего. Вы можете попробовать использовать более высокую kubernetes-версию если он поддерживается, в противном случае придерживайтесь 1.15

Создание кластера может занять некоторое время, так что расслабьтесь и расслабьтесь. 🍹

Как только кластер будет создан, извлеките его учетные данные для использования из kubectl, выполнив приведенную ниже команду. Он автоматически вводит учетные данные в вашу конфигурацию kubectl в разделе ~/.kube/config

$ az aks get-credentials \
  --resource-group eCommerceCluster \
  --name eCommerceCluster

Вы можете просмотреть созданный кластер на портале Azure:

Кластер Kubernetes в AKS

Запустите kubectl get nodes , чтобы увидеть его в командной строке и убедиться, что kubectl может подключаться к вашему кластеру.

Узлы кластера

Перейдите к разделу Установка и настройка в .

Создание кластера на движке Google Kubernetes Engine(GKE)

Если вы собираетесь использовать Google Cloud Platform(GCP), то установите Cloud CLI для взаимодействия с GCP. Установите и войдите в систему с помощью своей учетной записи GCP (вы можете создать бесплатную учетную запись если у вас его еще нет).

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

$ gcloud config set compute/region europe-west1
$ gcloud config set compute/zone europe-west1-b

Во-первых, нам нужен проект GCP, вы можете либо использовать существующий проект, который у вас есть, либо создать новый, используя GCloud CLI с помощью приведенной ниже команды:

$ gcloud projects create jhipster-demo-deepu

Установите проект, который вы хотите использовать в качестве проекта по умолчанию, и включите API контейнера. Вам также необходимо включить выставление счетов за проект через Google Cloud Console

$ gcloud config set project jhipster-demo-deepu
$ gcloud services enable container.googleapis.com

Теперь давайте создадим кластер для нашего приложения с помощью приведенной ниже команды:

$ gcloud container clusters create hello-hipster \
    --cluster-version latest \
    --num-nodes 4 \
    --machine-type n1-standard-2

Флаги num-nodes и machine-type важны, поскольку для настройки требуется по крайней мере четыре узла с большим процессором для запуска всего. Вы можете попробовать использовать последнюю версию cluster-version если он поддерживается, в противном случае придерживайтесь 1.17.

Создание кластера может занять некоторое время, так что расслабьтесь и расслабьтесь. 🍹

Как только кластер будет создан, извлеките его учетные данные для использования из kubectl, выполнив приведенную ниже команду. Он автоматически вводит учетные данные в вашу конфигурацию kubectl в разделе ~/.kube/config

$ gcloud container clusters get-credentials hello-hipster

Вы можете просмотреть созданный кластер в графическом интерфейсе GCP.

Кластер Kubernetes на GCE

Запустите kubectl get nodes , чтобы увидеть его в командной строке и убедиться, что kubectl может подключаться к вашему кластеру.

Узлы кластера

Установка и настройка Заключается в

Установите Istio на свой локальный компьютер, выполнив следующие действия:

$ cd ~/

$ export ISTIO_VERSION=1.8.2

$ curl -L https://istio.io/downloadIstio | sh -

$ ln -sf istio-$ISTIO_VERSION istio

$ export PATH=~/istio/bin:$PATH

Теперь давайте установим Visio на ваш кластер Kubernetes, используя предоставленные диаграммы от Istio.

# Install the Istio CRDs and components from the Demo profile
$ istioctl install --set profile=demo -y

# Install Addons like Grfana, Prometheus, Kiali and Zipkin
$ cd ~/istio
$ kubectl apply -f samples/addons/grafana.yaml
$ kubectl apply -f samples/addons/prometheus.yaml
$ kubectl apply -f samples/addons/kiali.yaml
$ kubectl apply -f samples/addons/extras/zipkin.yaml

Дождитесь запуска модулей, они будут развернуты в пространстве имен istio-system .

$ watch kubectl get pods -n istio-system

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

$ kubectl get svc istio-ingressgateway -n istio-system

NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP
istio-ingressgateway   LoadBalancer   10.27.249.83   35.195.81.130

Если шлюз istio-ingress показывает внешний IP как , подождите несколько минут, пока не будет назначен IP-адрес.

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

$ export \
  INGRESS_IP=$(kubectl -n istio-system get svc \
  istio-ingressgateway \
  -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

Есть дополнительный шаг, который вам нужно сделать здесь для Istio. Автоматически созданное правило брандмауэра не открывает порт 15017. Этот веб-хук проверки пилотного обнаружения нуждается в этом, поэтому нам нужно добавить это. Сначала извлеките правила брандмауэра, добавленные Istio для проекта, выполнив приведенную ниже команду. Если их больше одного, просто выберите любого. Если вы не можете найти ни одного, запустите команду без фильтра и найдите правило с Isis в описании.

$ gcloud compute firewall-rules list --filter="name~k8s-fw-[0-9a-z]*" --format=json

Теперь обновите это правило, чтобы добавить необходимый порт, используя приведенную ниже команду, замените имя на фактическое имя правила, которое вы выбрали выше, и добавьте все исходные порты в список

gcloud compute firewall-rules update  --allow tcp:15017,tcp:80,tcp:443,

Теперь наш кластер Kubernetes готов к Istio. 🎉

Дополнительные параметры настройки Istio см. в разделе Дополнительные параметры настройки Istio см. в разделе

Создание стека микросервисных приложений

В одном из моих предыдущих постов я продемонстрировал, как создать микросервисную архитектуру с полным стеком, используя Хипстер и JDL . Вы можете прочитать сообщение здесь если вы хотите узнать об этом более подробно. Для этого упражнения мы будем использовать то же приложение, но не будем использовать опцию обнаружения службы Eureka, которую мы использовали ранее. Также обратите внимание, что приложение магазина дополнительно разделено на приложения шлюза и продукта.

Архитектура

Вот архитектура микросервиса, который мы собираемся создать и развернуть сегодня.

Микросервисная архитектура с Istio

Он имеет приложение шлюза и три приложения микросервиса. У каждого из них есть своя собственная база данных. Вы можете видеть, что у каждого приложения есть прокси-сервер Envoy, подключенный к модулю в качестве коляски. Компоненты Edition control plane также развертываются в том же кластере вместе с Prometheus, Grafana и Jaeger.

Входной шлюз от Istio является единственной точкой входа для трафика, и он соответствующим образом направляет трафик ко всем микросервисам. Телеметрия собирается со всех контейнеров, запущенных в кластере, включая приложения, базы данных и компоненты Istio.

По сравнению с архитектурой исходного приложения здесь вы можете ясно видеть, что мы заменили компоненты реестра Hipster и Netflix OSS на Istio. Стек мониторинга ELK заменен на Prometheus, Grafana и Jaeger, настроенные Istio. Вот оригинальная схема архитектуры без Istio для быстрого визуального сравнения.

Микросервисная архитектура с ОС Netflix

Приложение JDL

Давайте взглянем на измененное объявление JDL. Вы можете видеть, что мы объявили Тип обнаружения службы здесь нет , так как для этого мы будем использовать Istio.

Развертывание JDL

В JHipster версии 5.7.0 добавлена поддержка объявления развертывания непосредственно в JDL

Ошибка жидкости: внутренняя

У нас есть ниже в нашем JDL, который объявляет о нашем развертывании Kubernetes:

deployment {
  deploymentType kubernetes
  appsFolders [store, invoice, notification, product]
  dockerRepositoryName "deepu105"
  serviceDiscoveryType no
  istio true
  kubernetesServiceType Ingress
  kubernetesNamespace jhipster
  ingressDomain "35.195.81.130.nip.io"
}

Тип обнаружения службы отключен, и мы включили Istio support — коляски Envoy вводятся автоматически для выбранных приложений. Маршруты Istio также генерируются для приложений автоматически.

Тип службы kubernetes задается как Ingress , что очень важно, поскольку история может работать только с типом службы контроллера входа. Для входа нам нужно установить DNS домена, и именно здесь необходим IP-адрес шлюза входа на сайт. Теперь нам нужен DNS для нашего IP-адреса. Для реальных случаев использования вы должны сопоставить DNS с IP, но для тестирования и демонстрационных целей мы можем использовать службу DNS с подстановочными знаками, например nip.io чтобы разрешить наш IP-адрес. Просто добавьте nip.io к нашему IP-адресу и использовать его в качестве входящий домен .

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

Создайте манифесты приложений и развертывания

Теперь, когда наш JDL готов, давайте создадим каркас наших приложений и манифестов Kubernetes. Создайте новый каталог и сохраните вышеупомянутый JDL в каталоге. Давайте назовем его app-это файл.jdl , а затем запустите команду jsl.

$ mkdir istio-demo && cd istio-demo
$ jhipster jdl app-istio.jdl --fork

Это позволит сгенерировать все приложения и установить необходимые зависимости NPM в каждом из них. Как только приложения будут сгенерированы, будут сгенерированы манифесты развертывания и некоторые полезные инструкции будут выведены на консоль.

Выходная мощность генерации

Откройте сгенерированный код в вашем любимом IDE/редакторе и изучите код.

Временные проблемы с сгенерированным кодом

В последней версии Hipster была ошибка , которая создавала некоторые неправильные URL-адреса для истории, она была исправлена с версии JHipster 6.3.0 вот PR для этого вопроса.

Развертывание в кластере Kubernetes с помощью Kubectl

Теперь давайте создадим и развернем наши приложения. Запустите ./gradlew bootJar -Pprod jibDockerBuild команда в папках store, product, invoice и notification для создания образов docker. Как только образы будут созданы, отправьте их в свой репозиторий docker с помощью этих команд. Обратите внимание, чтобы изменить идентификатор Docker hub с deepu105 на ваш идентификатор.

$ docker image tag store deepu105/store
$ docker push deepu105/store

$ docker image tag invoice deepu105/invoice
$ docker push deepu105/invoice

$ docker image tag notification deepu105/notification
$ docker push deepu105/notification

$ docker image tag product deepu105/product
$ docker push deepu105/product

Как только изображения будут загружены, перейдите в созданный каталог Kubernetes и запустите предоставленный сценарий запуска. (Если вы используете Windows, вы можете выполнить действия в kubectl-apply.sh вручную один за другим.)

$ cd kubernetes
$ ./kubectl-apply.sh -f

Запустите watch kubectl get pods -n jhipster , чтобы отслеживать состояние.

Развернутые приложения

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

Шлюз приложений

Приложение store gateway является точкой входа для наших микросервисов. Получите URL-адрес приложения store, запустив echo store.jhipster.$INGRESS_IP.nip.io , , мы уже сохранили INGRESS_IP в переменные среды при создании установки Istio. URL-адреса также выводятся на консоль с помощью kubectl-apply.sh

Приложение шлюза хранилища

Мониторинг

Заключается в настройке включает в себя Grafana и Prometheus, настроенные для сбора и отображения метрик из наших контейнеров. Давайте взглянем.

Давайте посмотрим на Grafana, посетив указанный URL-адрес. Получите его, запустив istioctl dashboard grafana :

Панель управления Grafana для приложения магазина

Графана использует метрики, наскобленные Прометеем. Вы можете просмотреть экземпляр Prometheus, запустив istioctl dashboard prometheus

Приборная панель Prometheus

Наблюдаемость

Издание настраивает Zipkin для распределенной трассировки и Kiali для возможности наблюдения за сервисом. Давайте взглянем на них.

Получите URL-адрес Zipkin, запустив istioctl dashboard zipkin :

Панель отслеживания Zipkin

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

Давайте теперь посмотрим на Кигали. Получите URL-адрес, запустив istioctl dashboard kigali , используйте учетные данные пользователя: admin , пароль: admin для входа в систему:

График обслуживания в Кигали

Вывод

Издание предоставляет строительные блоки для создания распределенных микросервисов более естественным для Kubernetes способом и снимает с вас сложность и ответственность за поддержание этих блоков. Это означает, что вам не нужно беспокоиться о поддержании кода или развертываниях для обнаружения служб, отслеживания и так далее.

В документации Istio говорится

Развертывание приложения на основе микросервиса в сетке служб Edition позволяет осуществлять внешнее управление мониторингом и отслеживанием служб, маршрутизацией запросов (версий), тестированием отказоустойчивости, обеспечением безопасности и политик и т.д. Согласованным образом для всех служб, для приложения в целом.

Вернер Фогельс (технический директор AWS) цитируется в AWS Re:Invent

“В будущем весь код, который вы когда-либо напишете, будет представлять собой бизнес-логику”.

Is to Service mesh помогает приблизить эту реальность. Это позволяет вам беспокоиться только о приложениях, которые вы разрабатываете, а с JHipster это будущее действительно здесь, и вам просто нужно беспокоиться о написании своей бизнес-логики.

Хотя это здорово, это не серебряная пуля. Имейте в виду, что история довольно новая по сравнению с другими стабильными и проверенными в боях решениями, такими как JHipster Registry (Eureka) или Consul, и в целом такие архитектуры подходят только для сложных распределенных приложений.

Кроме того, еще одна вещь, которую следует иметь в виду, – это требования к ресурсам. Те же микросервисы с JHipster Registry или Consul могут быть развернуты в 2-узловом кластере с 1 vCPU и 3,75 ГБ памяти на узел в GCP, в то время как для развертывания с поддержкой Istio требуется 4-узловой кластер с 2 vCPU и 7,5 ГБ памяти на узел. Демо-профиль от Isis, который мы использовали, не накладывает никаких ограничений на запросы к ресурсам, и, добавив и настроив их, можно было бы снизить минимальные требования. Но все же, я не думаю, что вы можете получить его так низко, как это необходимо для параметра реестра JHipster.

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

Громкий крик, обращенный к Рэй Цанг за то, что помог мне изначально определить оптимальный размер кластера для этого приложения. Также огромное спасибо от себя и сообщества Рэю и Шринивасану Васу за добавление поддержки Istio в JHipster.

Hipster предоставляет отличную настройку Kubernetes для начала, которую вы можете дополнительно настроить в соответствии с вашими потребностями и платформой. Поддержка редактора будет улучшаться со временем, но это все равно отличная отправная точка, особенно для обучения.

Чтобы узнать больше о разработке Hipster и Full stack, ознакомьтесь с моей книгой ” Разработка полного стека с помощью JHipster ” на Amazon и Пакет .

Есть отличный учебник Istio от Рэя Цанга здесь .

Если вам понравилась эта статья, возможно, вам также понравится моя книга . Вы можете получить его из Упаковка и Amazon .

Devoxx 2018

Я выступил с докладом на Devoxx 2018 вместе с Жюльеном Дю Буа , делая ту же демонстрацию, и пообещал, что напишу об этом подробный блог. Этот блог изначально был основан на этом.

Ошибка жидкости: внутренняя

Вы можете посмотреть это видео, чтобы увидеть JHipster + Istio в действии.

Вот слайды на панели громкоговорителей.

Если вам нравится хипстер, не забудьте поставить ему звездочку на Github .

Если вам понравилась эта статья, пожалуйста, оставляйте лайки/комментарии. Я надеюсь скоро написать больше об Istio.

Вы можете следить за мной на Twitter и LinkedIn .

Оригинал: “https://dev.to/deepu105/how-to-set-up-java-microservices-with-istio-service-mesh-on-kubernetes-5bkn”