微服务和容器正在彻底改变现代应用程序在云中的构建、部署和管理方式。然而,开发和运行微服务可能会引入显著的复杂性,通常需要开发人员花费宝贵的时间处理诸如服务发现、状态管理和可观察性等跨领域关注点。
Dapr,或分布式应用运行时,是一个用于在云和边缘环境构建微服务的开源运行时。它提供了跨平台的构建模块,如服务发现、状态管理、发布/订阅消息传递和可观察性。Dapr已经进入了CNCF(Cloud Native Computing Foundation)的毕业成熟级别,并目前被许多企业使用。
与亚马逊弹性Kubernetes服务(Amazon EKS)结合使用时,Dapr可以加速微服务和容器的采用,使开发人员能够专注于编写业务逻辑,而不必担心基础设施的繁琐。Amazon EKS使管理Kubernetes集群变得简单,能够轻松实现根据工作负载变化进行扩展。
在本博客文章中,我们将探讨Dapr如何简化在Amazon EKS上的微服务开发。我们将首先深入探讨两个基本构建模块:服务调用和状态管理。
服务调用
微服务之间无缝可靠的通信至关重要。然而,开发人员经常在诸如服务发现、标准化API、确保通信通道安全、优雅地处理故障以及实现可观测性等复杂任务上遇到困难。
通过Dapr的服务调用,这些问题将成为历史。您的服务可以轻松使用诸如gRPC和HTTP/HTTPS等行业标准协议相互通信。服务调用处理所有繁重的工作,从服务注册和发现到请求重试、加密、访问控制和分布式跟踪。
状态管理
Dapr的状态管理构建模块简化了开发人员处理应用程序状态的方式。它提供了一个一致的API,用于存储和检索状态数据,而不考虑底层状态存储(例如Redis,AWS DynamoDB,Azure Cosmos DB)。
这种抽象使开发人员能够构建有状态的应用程序,而不必担心管理和扩展状态存储的复杂性。
先决条件
为了跟随本文,您应该具备以下条件:
- 一个AWS账号。如果您还没有,可以注册一个。
- 具有适当权限的IAM用户。您正在使用的IAM安全主体必须具有权限与Amazon EKS IAM角色、服务链接角色、AWS CloudFormation、VPC和相关资源一起工作。有关更多信息,请参阅Amazon Elastic Container Service for Kubernetes的操作、资源和条件键和使用服务链接角色中的AWS身份和访问管理用户指南。
应用程序架构
在下面的图表中,我们有两个微服务:一个Python应用和一个Node.js应用。Python应用生成订单数据并调用Node.js应用公开的/neworder
端点。Node.js应用将传入的订单数据写入状态存储(在本例中为Amazon ElastiCache),并将订单ID作为响应返回给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 的微服务的 pod 中。
服务调用步骤
- 订单生成器服务(Python 应用程序)调用 Node 应用程序的方法
/neworder
。该请求发送到本地 Dapr sidecar,该 sidecar 与 Python 应用程序在同一个 pod 中运行。 - Dapr 使用 Amazon EKS 集群的 DNS 提供程序解析目标应用程序,并将请求发送到 Node 应用程序的 sidecar。
- Node 应用程序的 sidecar 然后将请求发送到 Node 应用程序的微服务。
- Node 应用程序随后将从 Python 应用程序接收的订单 ID 写入 Amazon ElasticCache。
- Node 应用程序将响应发送到其本地 Dapr sidecar。
- Node 应用程序的 sidecar 将响应转发到 Python 应用程序的 Dapr sidecar。
- Python 应用程序 sidecar 将响应返回给发起对 Node 应用程序方法
/neworder
的 Python 应用程序。
部署步骤
创建并确认EKS集群
要设置一个Amazon EKS(弹性Kubernetes服务)集群,您需要按照几个步骤进行操作。以下是该过程的高级概述:
先决条件
- 安装和配置AWS CLI
- 安装
eksctl
、kubectl
和AWS IAM认证器
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
在您的EKS集群上安装DAPR
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 StateStore
创建Amazon ElastiCache以存储微服务的状态。在此示例中,我们使用ElastiCache无服务器,它快速创建一个缓存,自动按需扩展以满足应用程序流量需求,无需管理服务器。
将ElastiCache的安全组配置为允许来自您的EKS集群的连接。为简单起见,保持在与您的EKS集群相同的VPC中。记录缓存端点,我们将在随后的步骤中需要。
运行示例应用程序
1. 克隆示例应用程序的Git仓库:
git clone https://github.com/dapr/quickstarts.git
2. 创建redis-state.yaml
并为redisHost
提供Amazon ElasticCache端点:
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
使用kubectl
应用yaml
配置以用于状态存储组件。
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"
在node.yaml
中添加一个注释service.beta.kubernetes.io/aws-load-balancer-scheme: “internet-facing”以创建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应用程序,该应用程序具有每秒生成新订单ID并调用节点应用程序方法/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
我们可以看到节点应用程序正在接收请求并将数据写入我们示例中的状态存储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应用生成的最新订单ID。
http://k8s-default-nodeapp-3a173e0d55-f7b14beff0c4dd8.elb.us-east-1.amazonaws.com/order
您将看到最新订单的输出为{"OrderId":"370"}
。
清理
运行以下命令以删除部署的节点应用和Python应用以及状态存储组件。
导航至/quickstarts/tutorials/hello-kubernetes/deploy
目录以执行以下命令。
kubectl delete -f node.yaml
kubectl delete -f python.yaml
您可以使用eksctl
命令拆除您的EKS集群并删除Amazon ElastiCache。
导航至包含用于在第一步创建集群的cluster.yaml
文件的目录。
eksctl delete cluster -f cluster.yaml
结论
Dapr 和 Amazon EKS 结成强大联盟,为微服务开发提供支持。Dapr 简化横切关注点,而 EKS 管理 Kubernetes 基础设施,使开发人员能够专注于核心业务逻辑并提高生产力。
这种组合加速了可伸缩、弹性和可观察应用程序的创建,显著减少运营开销。这是您微服务之旅的理想基础。敬请关注即将发布的帖子,探讨 Dapr 和 EKS 在分布式跟踪和可观察性方面的能力,提供更深入的见解和最佳实践。
Source:
https://dzone.com/articles/streamline-microservices-development-with-dapr-amazon-eks