翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする
キランクマール・チャンドラシェカール(AWS)とフイ・グエン(AWS)によって作成されました
grpc-traffic-on-albコードリポジトリ: | 環境:PoC またはパイロット | テクノロジー:コンテナーとマイクロサービス、コンテンツ配信、Web アプリとモバイルアプリ |
ワークロード:その他すべてのワークロード | AWS サービス:Amazon EKS、Elastic Load Balancing (ELB) |
[概要]
このパターンでは、gRPC ベースのアプリケーションを Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでホストし、Application Load Balancer を介して安全にアクセスする方法を説明します。
「gRPC
このパターンは、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 ノードのヘルスチェックを実行し、ターゲットが正常かどうかを評価して、正常なノードにのみトラフィックを転送します。
前提条件と制限
前提条件
アクティブな AWS アカウント。
Docker
、Linux、macOS、または Windows にインストールして設定します。 Linux、macOS または Windows にインストールして設定されている「AWS Command Line Interface (AWS CLI) バージョン 2」。
eksctl
、Linux、macOS、または Windows にインストールおよび設定されています。 kubectl
、Amazon EKS クラスターのリソースにアクセスするようにインストールおよび設定されています。詳細については、Amazon EKS ドキュメントの「kubectl のインストールまたは更新」を参照してください。「GrpCurl
」、インストールおよび設定。 新規または既存の Amazon EKS クラスター。詳細については、「Amazon EKS の使用開始」を参照してください。
Amazon EKS クラスターにアクセスするように設定されているコンピュータ端末。詳細については、Amazon EKS ドキュメントの「クラスターと通信するようにコンピュータを設定する」を参照してください。
Amazon EKS クラスターにプロビジョニングされた「AWS Load Balancer Controller」
有効な SSL または SSL/TLS 証明書を含む既存の DNS ホスト名。AWS Certificate Manager (ACM) を使用するか、既存の証明書を ACM にアップロードすることで、ドメインの証明書を取得できます。この 2 つのオプションの詳細については、ACM ドキュメントの 「パブリック証明書のリクエスト」 と 「AWS 認定 Manager への証明書のインポート」 を参照してください。
アーキテクチャ
次の図は、このパターンによって実装されるアーキテクチャを示しています。
![Amazon EKS での gRPC ベースのアプリケーションのアーキテクチャ](images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)
次の図は、SSL/TLS トラフィックを gRPC クライアントから受信し、Application Load Balancer にオフロードするワークフローを示しています。トラフィックは仮想プライベートクラウド (VPC) から送信されるため、gRPC サーバーにはプレーンテキストで転送されます。
![SSL/TLS トラフィックを gRPC サーバーに送信するためのワークフロー](images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)
ツール
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 コンソールを開いて 次のコマンドを実行して、AWS CLI で Amazon ECR リポジトリを作成することもできます。
| クラウド管理者 |
Docker イメージを作成します。 |
| DevOps エンジニア |
Amazon ECR にDocker イメージをプッシュします。 |
| DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
Kubernetes マニフェストファイルの値を変更します。 |
| DevOps エンジニア |
Kubernetes マニフェストファイルをデプロイします。 |
| DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
Application Load Balancerの FQDN を記録します。 |
| DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
gRPC サーバーをテストします。 | GrpCurl を使用して次のコマンドを実行して、エンドポイントをテストします。
注:DNS | DevOps エンジニア |
gRPC クライアントを使用して gRPC サーバーをテストします。 |
次のコードサンプルは、クライアントのリクエストに対する gRPC サーバーからの応答を示しています。
これは、クライアントがサーバーと通信でき、接続が成功したことを示しています。 | DevOps エンジニア |
タスク | 説明 | 必要なスキル |
---|---|---|
DNS レコードを削除します。 | 前に作成したアプリケーションロードバランサーの FQDN を指す DNS レコードを削除します。 | クラウド管理者 |
ロードバランサーを削除します。 | Amazon EC2 コンソールで | クラウド管理者 |
Amazon EKS クラスターを削除します。 |
| 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