翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする
作成者: Kirankumar Chandrashekar (AWS) と Huy Nguyen (AWS)
コードリポジトリ: grpc-traffic-on-alb-to-eks | 環境:PoC またはパイロット | テクノロジー: コンテナとマイクロサービス、コンテンツ配信、ウェブサイトとウェブアプリ |
ワークロード:その他すべてのワークロード | 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 への証明書のインポート」 を参照してください。
アーキテクチャ
次の図は、このパターンによって実装されるアーキテクチャを示しています。
次の図は、SSL/TLS トラフィックを gRPC クライアントから受信し、Application Load Balancer にオフロードするワークフローを示しています。トラフィックは仮想プライベートクラウド (VPC) から送信されるため、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-alb-to-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 レコードを削除します。 | 前に作成した Application Load Balancer の FQDN を指す DNS レコードを削除します。 | クラウド管理者 |
ロードバランサーを削除します。 | Amazon EC2 コンソール | クラウド管理者 |
Amazon EKS クラスターを削除します。 | を使用して 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