gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする

キランクマール・チャンドラシェカール(AWS)とフイ・グエン(AWS)によって作成されました

grpc-traffic-on-albコードリポジトリ:-to-eks

環境:PoC またはパイロット

テクノロジー:コンテナーとマイクロサービス、コンテンツ配信、Web アプリとモバイルアプリ

ワークロード:その他すべてのワークロード

AWS サービス:Amazon EKS、Elastic Load Balancing (ELB)

[概要]

このパターンでは、gRPC ベースのアプリケーションを Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでホストし、Application Load Balancer を介して安全にアクセスする方法を説明します。

gRPC」 は、任意の環境で実行できるオープンソースのリモートプロシージャコール (RPC) フレームワークです。マイクロサービスの統合やクライアントとサーバーの通信に使用できます。gRPC の詳細については、AWS ブログ記事「 end-to-end HTTP/2 と gRPC のApplication Load Balancer サポート」を参照してください。

このパターンは、Amazon EKS の Kubernetes ポッドで実行される gRPC ベースのアプリケーションをホストする方法を示しています。gRPC クライアントは、SSL/TLS 暗号化接続を使用して HTTP/2 プロトコルを介してApplication Load Balancer に接続します。Application Load Balancer は、Amazon EKS ポッドで実行される gRPC アプリケーションにトラフィックを転送します。gRPC ポッドの数は、「Kubernetes 水平ポッドオートスケーラー」 を使用してトラフィックに基づいて自動的にスケーリングできます。Application Load Balancer のターゲットグループは Amazon EKS ノードのヘルスチェックを実行し、ターゲットが正常かどうかを評価して、正常なノードにのみトラフィックを転送します。

前提条件と制限

前提条件

アーキテクチャ

次の図は、このパターンによって実装されるアーキテクチャを示しています。

Amazon EKS での gRPC ベースのアプリケーションのアーキテクチャ

次の図は、SSL/TLS トラフィックを gRPC クライアントから受信し、Application Load Balancer にオフロードするワークフローを示しています。トラフィックは仮想プライベートクラウド (VPC) から送信されるため、gRPC サーバーにはプレーンテキストで転送されます。

SSL/TLS トラフィックを gRPC サーバーに送信するためのワークフロー

ツール

AWS サービス

  • AWS コマンドラインインターフェイス (AWS CLI) はオープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • 受信したアプリケーションまたはネットワークトラフィックを複数のターゲットに分散するには、Elastic Load Balancing を使用します。例えば、1 つまたは複数のアベイラビリティーゾーンの Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。

  • Amazon Elastic Container Registry (Amazon ECR)」 は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。 

  • Amazon Elastic Kubernetes Service (Amazon EKS) は、 で Kubernetes を実行する際に役立ちます。独自の Kubernetes コントロールプレーンまたはノードをインストールおよび維持する必要はありません。 

ツール

  • eksctl は Amazon EKS でクラスターを作成するためのシンプルな CLI ツールです。

  • kubectl」は、 Kubernetes クラスターに対してコマンドを実行するためのコマンドラインユーティリティです。

  • AWS Load Balancer Controllerは、Kubernetes クラスターの AWS Elastic Load Balancers の管理を支援します。

  • GrpCurl」 は gRPC サービスとのやり取りを支援するコマンドラインツールです。

コードリポジトリ

このパターンのコードは GitHub grpc-traffic-on-albto-eks リポジトリにあります。

エピック

タスク説明必要なスキル

Amazon ECR リポジトリを作成します。

AWS マネジメントコンソールにサインインし、Amazon ECR コンソールを開いて、Amazon ECR リポジトリを作成します。詳細については、Amazon ECR ドキュメントの「リポジトリの作成」を参照してください。Amazon ECR リポジトリの URL を必ず記録してください。

次のコマンドを実行して、AWS CLI で Amazon ECR リポジトリを作成することもできます。

aws ecr create-repository --repository-name helloworld-grpc
クラウド管理者

Docker イメージを作成します。

  1. GitHub grpc-traffic-on-albto-eks リポジトリをクローンします。

    git clone https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git
  2. リポジトリのルートディレクトリから Dockerfile が存在することを確認し、以下のコマンドを実行して Docker イメージをビルドします。 

    docker build -t <amazon_ecr_repository_url>:<Tag> .

    重要:必ず、以前に作成した Amazon ECR リポジトリの URL <amazon_ecr_repository_url> に置き換えてください。

DevOps エンジニア

Amazon ECR にDocker イメージをプッシュします。

  1. 次のコマンドを実行して、Amazon ECR リポジトリにログインします。

    aws ecr get-login-password --region us-east-1 --no-cli-auto-prompt | docker login --username AWS --password-stdin <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com
  2. 次のコマンドを実行して、Docker イメージを Amazon ECR リポジトリにプッシュします。

    docker push <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0

    重要:必ず AWS アカウント ID <your_aws_account_id> に置き換えてください。

DevOps エンジニア
タスク説明必要なスキル

Kubernetes マニフェストファイルの値を変更します。

  1. リポジトリの grpc-sample.yaml Kubernetes フォルダにある Kubernetes マニフェストファイルを要件に応じて変更します。Ingress リソースのアノテーションとホスト名を変更する必要があります。Ingress リソースのサンプルについては、追加情報セクションを参照してください。イングレスアノテーションの詳細について、Kubernetes ドキュメントの「イングレスアノテーション」 を参照してください。

  2. Kubernetes デプロイリソースで、image デプロイリソースを Docker イメージをプッシュした Amazon ECR リポジトリのユニフォームリソース識別子 (URI) に変更します。デプロイリソースについては、追加情報セクションを参照してください。

DevOps エンジニア

Kubernetes マニフェストファイルをデプロイします。

kubectl以下のコマンドを実行して、grpc-sample.yamlファイルを Amazon EKS クラスターにデプロイします。 

kubectl apply -f ./kubernetes/grpc-sample.yaml
DevOps エンジニア
タスク説明必要なスキル

Application Load Balancerの FQDN を記録します。

  1. 次の kubectl コマンドを実行して、Application Load Balancer を管理する Kubernetes 入力リソースを記述します。

    kubectl get ingress -n grpcserver

    サンプル出力は「追加情報」セクションにあります。HOSTS 出力のフィールドには、SSL 証明書が作成された DNS ホスト名が表示されます。

  2. Address出力のフィールドから、アプリケーションロードバランサーの完全修飾ドメイン名 (FQDN) を記録します。 

  3. アプリケーションロードバランサーの FQDN を指す DNS レコードを作成します。DNS プロバイダーが Amazon Route 53 の場合は、アプリケーションロードバランサーの FQDN をポイントするエイリアスレコードを作成できます。このオプションの詳細については、Route 53 ドキュメントの「エイリアスレコードと非エイリアスレコードの選択」を参照してください。

DevOps エンジニア
タスク説明必要なスキル

gRPC サーバーをテストします。

GrpCurl を使用して次のコマンドを実行して、エンドポイントをテストします。

grpcurl grpc.example.com:443 list grpc.reflection.v1alpha.ServerReflection helloworld.helloworld

注:DNS grpc.example.com 名に置き換えてください。

DevOps エンジニア

gRPC クライアントを使用して gRPC サーバーをテストします。

helloworld_client_ssl.pyサンプルの gRPC クライアントでは、grpc.example.comからのホスト名を gRPC サーバーに使用されているホスト名に置き換えます。 

次のコードサンプルは、クライアントのリクエストに対する gRPC サーバーからの応答を示しています。

python ./app/helloworld_client_ssl.py message: "Hello to gRPC server from Client" message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\"" received: true

これは、クライアントがサーバーと通信でき、接続が成功したことを示しています。

DevOps エンジニア
タスク説明必要なスキル

DNS レコードを削除します。

前に作成したアプリケーションロードバランサーの FQDN を指す DNS レコードを削除します。

クラウド管理者

ロードバランサーを削除します。

Amazon EC2 コンソールで [ロードバランサー] を選択し、Kubernetes コントローラーが入力リソース用に作成したロードバランサーを削除します。

クラウド管理者

Amazon EKS クラスターを削除します。

eksctl以下を使用して Amazon EKS クラスターを削除します。

eksctl delete cluster -f ./eks.yaml
AWS DevOps

関連リソース

追加情報

サンプル入力リソース:

--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/ssl-redirect: "443" alb.ingress.kubernetes.io/backend-protocol-version: "GRPC" alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]' alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<AWS-Region>:<AccountId>:certificate/<certificate_ID> alb.ingress.kubernetes.io/healthcheck-protocol: HTTP labels: app: grpcserver environment: dev name: grpcserver namespace: grpcserver spec: ingressClassName: alb rules: - host: grpc.example.com # <----- replace this as per your host name for which the SSL certtficate is available in ACM http: paths: - backend: service: name: grpcserver port: number: 9000 path: / pathType: Prefix

サンプルデプロイリソース:

apiVersion: apps/v1 kind: Deployment metadata: name: grpcserver namespace: grpcserver spec: selector: matchLabels: app: grpcserver replicas: 1 template: metadata: labels: app: grpcserver spec: containers: - name: grpc-demo image: <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0 #<------- Change to the URI that the Docker image is pushed to imagePullPolicy: Always ports: - name: grpc-api containerPort: 9000 env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP restartPolicy: Always

サンプル出力:

NAME CLASS HOSTS Address PORTS AGE grpcserver <none> <DNS-HostName> <ELB-address> 80 27d