微服務和容器正在革新現代應用程式在雲端中的建置、部署和管理方式。然而,開發和運營微服務可能會引入相當複雜性,通常需要開發人員花費寶貴的時間處理橫跨關注點,如服務發現、狀態管理和可觀察性。
Dapr,即分散式應用程式運行時,是用於在雲端和邊緣環境中構建微服務的開源運行時。它提供跨平台的基本組件,如服務發現、狀態管理、發布/訂閱消息和可觀察性。Dapr已達到CNCF(Cloud Native Computing Foundation)的成熟等級並目前被許多企業使用。
當與亞馬遜彈性Kubernetes服務(Amazon EKS)結合使用時,這是來自AWS的受管Kubernetes服務,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 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
在您的 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的業務邏輯,並調用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
。它會返回最新生成的訂單ID,這是由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
您可以使用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