Микросервисы и контейнеры революционизируют способ построения, развертывания и управления современными приложениями в облаке. Однако разработка и эксплуатация микросервисов может привести к значительной сложности, зачастую требуя от разработчиков затратного времени на кросс-катинговые проблемы, такие как обнаружение сервиса, управление состоянием и наблюдаемость.
Дапр, или Распределенный исполняемый модуль приложения, является рантаймом с открытым исходным кодом для построения микросервисов в облачных и периферийных средах. Он предоставляет платформенно-независимые строительные блоки, такие как обнаружение сервиса, управление состоянием, сообщения pub/sub и наблюдаемость из коробки. Дапр перешел на уровень зрелости CNCF (Фонд компьютерных технологий облачных вычислений) и в настоящее время используется многими предприятиями.
В сочетании с Amazon Elastic Kubernetes Service (Amazon EKS), управляемым сервисом Kubernetes от AWS, Дапр может ускорить принятие микросервисов и контейнеров, позволяя разработчикам сосредоточиться на написании бизнес-логики, не беспокоясь о инфраструктурных подключениях. Amazon EKS упрощает управление кластерами Kubernetes, обеспечивая легкую масштабируемость при изменении рабочей нагрузки.
В этом блог-посте мы рассмотрим, как Дапр упрощает разработку микросервисов на Amazon EKS. Мы начнем с рассмотрения двух ключевых строительных блоков:вызов сервисаиуправление состоянием.
Вызов службы
Бесперебойное и надежное взаимодействие между микросервисами крайне важно. Однако разработчики часто сталкиваются с сложными задачами, такими как обнаружение служб, стандартизация API, обеспечение безопасности каналов связи, обработка отказов вежливым образом и внедрение возможностей наблюдаемости.
С Dapr вызов службы эти проблемы остаются в прошлом. Ваши службы могут легко обмениваться информацией друг с другом, используя стандартные протоколы отрасли, такие как gRPC и HTTP/HTTPS. Вызов службы берет на себя весь тяжелый труд, от регистрации и обнаружения служб до повторных запросов, шифрования, контроля доступа и распределенного трассирования.
Управление состоянием
Строительный блок управления состоянием Daprупрощает способ, которым разработчики работают со состоянием в своих приложениях. Он предоставляет последовательный API для хранения и извлечения данных состояния, независимо от базового хранилища состояния (например, Redis, AWS DynamoDB, Azure Cosmos DB).
Эта абстракция позволяет разработчикам создавать приложения с состоянием, не беспокоясь о сложностях управления и масштабирования хранилищ состояния.
Предпосылки
Чтобы следовать этому посту, вам понадобится:
- Учетная запись AWS. Если у вас ее нет, вы можете зарегистрироваться.
- Пользователь IAM с соответствующими разрешениями. Принцип безопасности IAM, которым вы пользуетесь, должен иметь разрешение на работу с IAM-ролями Amazon EKS, сервисными связанными ролями, AWS CloudFormation, VPC и связанными ресурсами. Дополнительную информацию смотрите в разделах Действия, ресурсы и ключи условий для Amazon Elastic Container Service for Kubernetes и Использование сервисных связанных ролей в Руководстве пользователя по идентификации и управлению доступом AWS.
Архитектура приложения
На диаграмме ниже изображены два микросервиса: приложение на Python и приложение на Node.js. Приложение на Python генерирует данные заказа и вызывает конечную точку /neworder
, предоставленную приложением на Node.js. Приложение на Node.js записывает поступающие данные заказа в хранилище состояний (в данном случае, в Amazon ElastiCache) и возвращает идентификатор заказа приложению на Python в качестве ответа.
Используя строительный блок вызова службы Dapr, приложение на Python может без проблем общаться с приложением на Node.js, не беспокоясь о обнаружении службы, стандартизации API, безопасности канала связи, обработке сбоев или наблюдаемости. Он реализует mTLS для обеспечения безопасной связи между службами.
Dapr обрабатывает эти поперечные заботы, позволяя разработчикам сосредоточиться на написании основной бизнес-логики.
Кроме того, строительный блок управления состоянием Dapr упрощает взаимодействие приложения Node.js с хранилищем состояния (Amazon ElastiCache). Dapr предоставляет согласованный API для сохранения и извлечения данных состояния, абстрагируя сложности управления и масштабирования базового хранилища состояния. Эта абстракция позволяет разработчикам создавать приложения с состоянием, не беспокоясь о тонкостях управления хранилищем состояния.
Кластер Amazon EKS содержит пространство имен под названием dapr-system
, которое содержит компоненты плоскости управления Dapr. dapr-sidecar-injector
автоматически внедряет среду выполнения Dapr в поды микросервисов, поддерживающих Dapr.
Шаги вызова службы
- Служба генерации заказов (приложение Python) вызывает метод приложения Node с именем
/neworder
. Этот запрос отправляется в локальный побочный процесс Dapr, который работает в том же поде, что и приложение Python. - Dapr определяет целевое приложение, используя поставщика DNS кластера Amazon EKS, и отправляет запрос в побочный процесс приложения Node.
- Побочный процесс приложения Node затем отправляет запрос в микросервис приложения Node.
- Приложение Node записывает полученный идентификатор заказа от приложения Python в Amazon ElasticCache.
- Приложение Node отправляет ответ в свой локальный побочный процесс Dapr.
- Побочный процесс приложения Node направляет ответ в побочный процесс приложения Python.
- Побочный процесс приложения Python возвращает ответ приложению Python, которое инициировало запрос к методу приложения Node с именем
/neworder
.
Шаги развертывания
Создание и подтверждение кластера EKS
Для настройки кластера Amazon EKS (Elastic Kubernetes Service) вам нужно выполнить несколько шагов. Вот краткий обзор процесса:
Предварительные требования
- Установите и настройте AWS CLI
- Установите
eksctl
,kubectl
и AWS IAM Authenticator
1. Создайте кластер EKS. Используйте eksctl
для создания базового кластера с помощью команды:
eksctl create cluster --name my-cluster --region us-west-2 --node-type t3.medium --nodes 3
2. Настройте kubectl. Обновите свой kubeconfig
, чтобы подключиться к новому кластеру:
aws eks update-kubeconfig --name my-cluster --region us-west-2
3. Проверьте кластер. Проверьте, готовы ли ваши узлы:
kubectl get nodes
Установка DAPR на ваш кластер EKS
1. Установите DAPR CLI:
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
2. Проверьте установку:
dapr -h
3. Установите DAPR и проверьте:
dapr init -k --dev
dapr status -k
Компоненты Dapr statestore
и pubsub
создаются в пространстве имен по умолчанию. Вы можете проверить это, используя следующую команду:
dapr components -k
Настройка Amazon ElastiCache как вашего хранилища состояния Dapr
Создайте Amazon ElastiCache для хранения состояния микросервиса. В этом примере мы используем ElastiCache без серверов, который быстро создает кэш, автоматически масштабируется для удовлетворения потребностей приложения в трафике без необходимости управления серверами.
Настройте группу безопасности ElastiCache для разрешения подключений из вашего кластера EKS. Для удобства оставьте его в той же VPC, что и ваш кластер EKS. Запомните кэш-точку, которая нам понадобится для последующих шагов.
Запуск примера приложения
1. Клонируйте репозиторий примера приложения Git:
git clone https://github.com/dapr/quickstarts.git
2. Создайте файл redis-state.yaml
и укажите конечную точку Amazon ElasticCache для redisHost
:
apiVersion dapr.io/v1alpha1
kind Component
metadata
name statestore
namespace default
spec
type state.redis
version v1
metadata
name redisHost
value redisdaprd-7rr0vd.serverless.use1.cache.amazonaws.com6379
name enableTLS
value true
Примените конфигурацию yaml
для компонента хранилища состояния с использованием kubectl
.
kubectl apply -f redis-state.yaml
3. Разверните микросервисы с побочным контейнером.
Для узла микросервиса перейдите в файл /quickstarts/tutorials/hello-kubernetes/deploy/node.yaml
и обратите внимание на аннотации ниже. Это указывает контрольной плоскости Dapr внедрить побочный контейнер и также присвоить имя приложению Dapr.
annotations
dapr.io/enabled"true"
dapr.io/app-id"nodeapp"
dapr.io/app-port"3000"
Добавьте аннотацию service.beta.kubernetes.io/aws-load-balancer-scheme: “internet-facing” в node.yaml
для создания AWS ELB.
kind Service
apiVersion v1
metadata
name nodeapp
annotations
service.beta.kubernetes.io/aws-load-balancer-scheme"internet-facing"
labels
app node
spec
selector
app node
ports
protocol TCP
port80
targetPort3000
type LoadBalancer
Разверните узел приложения с помощью kubectl
. Перейдите в каталог /quickstarts/tutorials/hello-kubernetes/deploy
и выполните следующую команду.
kubectl apply -f node.yaml
Получите AWS NLB, который появляется под External IP, в выводе следующей команды.
kubectl get svc nodeapp http://k8s-default-nodeapp-3a173e0d55-f7b14bedf0c4dd8.elb.us-east-1.amazonaws.com
Перейдите в каталог /quickstarts/tutorials/hello-kubernetes
, в котором находится файл sample.json
, чтобы выполнить следующий шаг.
curl --request POST --data "@sample.json" --header Content-Type:application/json http://k8s-default-nodeapp-3a173e0d55-f14bedff0c4dd8.elb.us-east-1.amazonaws.com/neworder
Вы можете проверить вывод, обращаясь к конечной точке /order
с помощью балансировщика нагрузки в браузере.
http://k8s-default-nodeapp-3a173e0d55-f7b14bedff0c4dd8.elb.us-east-1.amazonaws.com/order
Вы увидите вывод в виде {“OrderId”:“42”}
Затем разверните второе микросервисное приложение Python, которое имеет бизнес-логику для генерации нового идентификатора заказа каждую секунду и вызова метода приложения Node /neworder
.
Перейдите в каталог /quickstarts/tutorials/hello-kubernetes/deploy
и выполните следующую команду.
kubectl apply -f python.yaml
4. Проверка и тестирование развертывания вашего приложения.
Теперь, когда у нас есть развернуты оба микросервиса. Приложение Python генерирует заказы и вызывает /neworder
, как видно из журналов ниже.
kubectl logs --selector=app=python -c daprd --tail=-1
time"2024-03-07T12:43:11.556356346Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
time"2024-03-07T12:43:12.563193147Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
Мы видим, что приложение Node получает запросы и пишет в хранилище состояний Amazon ElasticCache в нашем примере.
kubectl logs —selector=app=node -c node —tail=-1
Got a new order Order ID: 367
Successfully persisted state for Order ID: 367
Got a new order Order ID: 368
Successfully persisted state for Order ID: 368
Got a new order Order ID: 369
Successfully persisted state for Order ID: 369
Для подтверждения того, что данные сохранены в Amazon ElasticCache, мы получаем доступ к конечной точке /order
ниже. Он возвращает последний идентификатор заказа, сгенерированный приложением Python.
http://k8s-default-nodeapp-3a173e0d55-f7b14beff0c4dd8.elb.us-east-1.amazonaws.com/order
Вы увидите вывод с последним заказом в виде {“OrderId”:“370”}
.
Очистка
Выполните следующую команду для удаления развертываний приложений Node и Python вместе с компонентом хранилища состояний.
Перейдите в каталог /quickstarts/tutorials/hello-kubernetes/deploy
, чтобы выполнить следующую команду.
kubectl delete -f node.yaml
kubectl delete -f python.yaml
Вы можете удалить свой кластер EKS, используя команду eksctl
и удалить Amazon ElastiCache.
Перейдите в каталог, в котором находится файл cluster.yaml
, использованный для создания кластера на первом шаге.
eksctl delete cluster -f cluster.yaml
Заключение
Dapr и Amazon EKS образуют мощный союз для разработки микросервисов. Dapr упрощает поперечные задачи, в то время как EKS управляет инфраструктурой Kubernetes, позволяя разработчикам сосредоточиться на основной бизнес-логике и повысить производительность.
Это сочетание ускоряет создание масштабируемых, надежных и наблюдаемых приложений, значительно снижая операционные издержки. Это идеальное основание для вашего путешествия по микросервисам. Следите за предстоящими публикациями, где будут рассмотрены возможности Dapr и EKS в области распределенного трассирования и наблюдаемости, предлагающие более глубокие инсайты и bewt практики.
Source:
https://dzone.com/articles/streamline-microservices-development-with-dapr-amazon-eks