本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon EKS 集群上部署基于 gRPC 的应用程序并使用应用程序负载均衡器访问它
由 Kirankumar Chandrashekar (AWS) 和 Huy Nguyen (AWS) 创作
代码存储库:grpc-traffic-on-albto-eks | 环境:PoC 或试点 | 技术:容器和微服务;内容交付;Web 和移动应用程序 |
工作负载:所有其他工作负载 | Amazon Web Services:Amazon EKS;弹性负载均衡(ELB) |
Summary
此模式描述如何在 Amazon Elastic Kubernetes Service (Amazon EKS) 集群上托管基于 gRPC 的应用程序,并通过应用程序负载均衡器安全地访问该应用程序。
gRPC
此模式向您展示如何托管在 Amazon EKS 上的 Kubernetes 容器上运行的基于 GRPC 的应用程序。gRPC 客户端通过 HTTP/2 协议通过 SSL/TLS 加密连接连接连接到 Application Load Balancer。应用程序负载均衡器将流量转发至 Amazon EKS 容器组(pod)上运行的 gRPC 应用程序。使用 Kubernetes Horizontal Pod Autoscaler,可以根据流量自动扩缩 gRPC 容器组(pod)的数量。应用程序负载均衡器的目标组对 Amazon EKS 节点执行运行状况检查,评估目标是否正常,并仅将流量转发到运行状况良好的节点。
先决条件和限制
先决条件
一个有效的 Amazon Web Services account。
Docker
,已在 Linux、macOS 或 Windows 上安装并配置。 AWS 命令行界面(AWS CLI)版本 2,已在 Linux、macOS 或 Windows 上安装并配置。
eksctl
,在 Linux、macOS 或 Windows 上安装和配置。 kubectl
,已安装并配置为访问 Amazon EKS 集群资源。有关更多信息,请参阅 Amazon E KS 文档中的安装或更新 kubectl。gRPCurl
,已安装和配置。 新的或现有的 Amazon EKS 集群。有关更多信息,请参阅 Amazon EKS 入门。
您的计算机终端已配置为访问 Amazon EKS 集群。有关更多信息,请参阅 Amazon EKS 文档中的配置您的计算机以与集群通信。
AWS Load Balancer Controller,在 Amazon EKS 集群中配备。
带有有效 SSL 或 SSL/TLS 证书的现有 DNS 主机名。您可通过使用 AWS Certificate Manager (ACM) 或将现有证书上载到 ACM 获取域证书。有关这两个选项的更多信息,请参阅 ACM 文档中的请求公共证书和将证书导入 AWS Certificate Manager。
架构
下图显示了此模式实现的架构。
![Amazon EKS 上基于 GRPC 的应用程序架构](images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)
下图显示了一个工作流,其中从 gRPC 客户端接收 SSL/TLS 流量,然后将其卸载到应用程序负载均衡器。由于流量来自虚拟私有云(VPC),因此以明文形式转发到 gRPC 服务器。
![向 gRPC 服务器发送 SSL/TLS 流量的工作流程](images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)
工具
Amazon Web Services
AWS 命令行界面(AWS CLI)是一种开源工具,它可帮助您通过命令行 Shell 中的命令与 Amazon Web Services 交互。
弹性负载均衡在多个目标上分配传入的应用程序或网络流量。例如您可以将流量分配到一个或多个可用区中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例、容器以及 IP 地址。
Amazon Elastic Container Registry (Amazon ECR) 是一项安全、可扩展且可靠的托管容器映像注册表服务。
Amazon Elastic Kubernetes Service (Amazon EKS) 可帮助您在 AWS 上运行 Kubernetes,而无需安装或维护您自己的 Kubernetes 控制面板或节点。
工具
eksctl
是一款用于在 Amazon EKS 上创建集群的简单 CLI 工具。 kubectl
是针对 Kubernetes 集群运行命令的命令行实用程序。 AWS 负载均衡器控制器帮助管理 Kubernetes 集群的 AWS 弹性负载均衡器。
gRPCurl
是命令行工具,可帮助您与 gRPC 服务进行交互。
代码存储库
此模式的代码可在 to-e GitHub grpc-traffic-on-albks 存储库中找到
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
创建 Amazon ECR 存储库。 | 登录 AWS 管理控制台,打开 A mazon ECR 控制台 您也可以通过运行以下命令,使用 AWS CLI 创建 Amazon ECR 存储库:
| 云管理员 |
构建 Docker 映像。 |
| DevOps 工程师 |
将 Docker 映像推送到 Amazon ECR。 |
| DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
修改 Kubernetes 清单文件值。 | DevOps 工程师 | |
部署 Kubernetes 清单文件。 | 通过运行以下
| DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
应用程序负载均衡器的 FQDN 记录。 |
| DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
测试 gRPC 服务器。 | 通过运行以下命令,使用 gRPCurl 测试端点:
注意:请将 | DevOps 工程师 |
使用 gRPC 客户端测试 gRPC 服务器。 | 在 下列代码示例显示了 gRPC 服务器对客户端请求的响应:
这表明客户端可与服务器通信,并且连接成功。 | DevOps 工程师 |
任务 | 描述 | 所需技能 |
---|---|---|
删除 DNS 记录。 | 删除您之前创建的指向应用程序负载均衡器的 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