マイクロサービスとコンテナは、現代のアプリケーションの構築、展開、およびクラウドでの管理方法を革新しています。ただし、マイクロサービスの開発と運用には複雑さが伴う場合があり、しばしば開発者がサービス検出、状態管理、および可観測性などの横断的関心事に貴重な時間を費やす必要があります。
Dapr、または分散アプリケーションランタイムは、クラウドおよびエッジ環境でマイクロサービスを構築するためのオープンソースのランタイムです。サービス検出、状態管理、パブサブメッセージング、および可観測性などのプラットフォームに依存しないビルディングブロックを提供します。Daprは、CNCF(Cloud Native Computing Foundation)の卒業レベルに移行し、現在多くの企業によって使用されています。
Amazon Elastic Kubernetes Service(Amazon EKS)と組み合わせると、AWSからのマネージドKubernetesサービスであるDaprがマイクロサービスとコンテナの採用を加速し、開発者がインフラストラクチャのプラムビングを気にすることなくビジネスロジックの記述に集中できるようになります。Amazon EKSにより、Kubernetesクラスターの管理が容易になり、ワークロードが変化するにつれてスケーリングが容易になります。
このブログ投稿では、DaprがAmazon EKS上でのマイクロサービス開発を簡素化する方法を探っていきます。まず、サービス呼び出しと状態管理という2つの重要なビルディングブロックについて詳しく調べていきます。
サービスの呼び出し
マイクロサービス間のシームレスで信頼性の高い通信は重要です。しかし、開発者はしばしばサービスの検出、APIの標準化、通信チャネルのセキュリティ確保、障害の適切な処理、および観測性の実装などの複雑なタスクに苦労します。
Daprのサービス呼び出しを使用すると、これらの問題は過去のものとなります。 gRPCやHTTP/HTTPSなどの業界標準のプロトコルを使用して、サービスは簡単にお互いと通信できます。サービス呼び出しは、サービスの登録と検出からリクエストの再試行、暗号化、アクセス制御、分散トレーシングまで、すべてを処理します。
状態管理
Daprの状態管理ビルディングブロックは、開発者がアプリケーション内で状態を操作する方法を簡素化します。これは、基礎となる状態ストア(例:Redis、AWS DynamoDB、Azure Cosmos DB)に関係なく、状態データの保存と取得のための一貫したAPIを提供します。
この抽象化により、開発者は状態ストアの管理やスケーリングの複雑さを気にすることなく、状態を持つアプリケーションを構築することができます。
前提条件
この投稿に従うためには、以下が必要です:
- AWSアカウント。アカウントがない場合は、サインアップしてください。
- 適切な権限を持つIAMユーザー。使用しているIAMセキュリティプリンシパルには、Amazon EKS IAMロール、サービスリンクロール、AWS CloudFormation、VPC、および関連リソースと連携する権限が必要です。詳細については、Amazon Elastic Container Service for Kubernetesのアクション、リソース、および条件キーとAWS Identity and Access Managementユーザーガイドのサービスリンクロールの使用を参照してください。
アプリケーションアーキテクチャ
以下の図では、2つのマイクロサービスがあります:PythonアプリとNode.jsアプリ。Pythonアプリは注文データを生成し、Node.jsアプリが公開している/neworder
エンドポイントを呼び出します。Node.jsアプリは受信した注文データを状態ストア(この場合はAmazon ElastiCache)に書き込み、注文IDをPythonアプリに応答として返します。
Daprのサービス呼び出しビルディングブロックを活用することで、Pythonアプリはサービスディスカバリ、API標準化、通信チャネルセキュリティ、障害処理、および可観測性を気にすることなくNode.jsアプリとシームレスに通信できます。安全なサービス間通信を提供するために、mTLSを実装しています。
Daprはこれらの横断的な関心事を処理し、開発者がコアビジネスロジックの記述に集中できるようにします。
さらに、Daprの状態管理ビルディングブロックは、Node.jsアプリケーションが状態ストア(Amazon ElastiCache)とやり取りする方法を簡素化します。Daprは、一貫したAPIを提供し、状態データの格納と取得を抽象化することで、基礎となる状態ストアの管理とスケーリングの複雑さを隠蔽します。この抽象化により、開発者は状態を持つアプリケーションを構築する際に、状態ストアの管理の詳細について心配する必要がありません。
Amazon EKSクラスターには、Daprコントロールプレーンコンポーネントが含まれるdapr-system
という名前空間がホストされています。 dapr-sidecar-injector
は、Daprが有効になっているマイクロサービスのポッドに自動的にDaprランタイムをインジェクトします。
サービス呼び出しステップ
- 注文ジェネレーターサービス(Pythonアプリ)は、Nodeアプリのメソッド
/neworder
を呼び出します。このリクエストは、Pythonアプリと同じポッドで実行されているローカルのDaprサイドカーに送信されます。 - Daprは、Amazon EKSクラスターのDNSプロバイダーを使用してターゲットアプリを解決し、リクエストをNodeアプリのサイドカーに送信します。
- Nodeアプリのサイドカーは、その後、リクエストをNodeアプリのマイクロサービスに送信します。
- Nodeアプリは、Pythonアプリから受け取った注文IDをAmazon ElasticCacheに書き込みます。
- Nodeアプリは、レスポンスをローカルのDaprサイドカーに送信します。
- Nodeアプリのサイドカーは、レスポンスをPythonアプリのDaprサイドカーに転送します。
- Pythonアプリサイドカーは、Nodeアプリのメソッド
/neworder
にリクエストを開始したPythonアプリにレスポンスを返します。
デプロイメント手順
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
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
以下のコマンドの出力に表示されるExternal IPの下に表示されるAWS NLBを取得します。
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”}
を見ることができます。
次に、ビジネスロジックを持つ2番目のマイクロサービス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
にアクセスします。これにより、Pythonアプリによって生成された最新の注文IDが返されます。
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