在 Amazon EKS 叢集上部署基於 GRPC 的應用程式,並使用 Application Load Balancer 進行存取 - AWS Prescriptive Guidance

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 Amazon EKS 叢集上部署基於 GRPC 的應用程式,並使用 Application Load Balancer 進行存取

由基蘭庫瑪 ‧ 錢德拉瑟卡 (AWS) 創作

Envronment (En PoC 或試驗

技能:容器和微服務; 內容傳遞; 網頁託管; 網站和 Web 應用程式

工作負載:所有其他工作負載

AWS 服務:Amazon EKS; Elastic Load Balancing

Summary

此模式描述如何在 Amazon Elastic Kubernetes 服務 (Amazon EKS) 叢集上託管基於 GRPC 的應用程式,並透過 Application Load Balancer 安全地存取它。

GRPC是一個可以在任何環境中運行的開源遠程程序調用(RPC)框架。您可以將其用於微服務整合和用戶端與伺服器之間的通訊。如需 GRPC 的詳細資訊,請參閱端對端 HTTP/2 和 GRPC 的 Application Load Balancer 支援在 Amazon Web Services (AWS) 部落格中的部分。

此模式說明如何託管以 Kubernetes 網格在 Amazon EKS 上執行的 GRPC 應用程式。GRPC 用戶端會透過 HTTP/2 協定與 Secure Sockets Layer/Transport Layer Security (SSL/TLS) 加密連線連接至一個 Application Load Balancer。Application Load Balancer 會將流量轉送到在 Amazon EKS 網格上執行的 GRPC 應用程式。GRPC 網莢的數量可以根據流量使用Kubernetes 水平 Pod Autoscaler。應用程式負載平衡器的目標群組會在 Amazon EKS 節點上執行運作狀況檢查、評估目標是否正常,以及僅將流量轉送到狀況良好的節點。

先決條件和限制

先決條件

  • Docker,在 Linux、macOS 或 Windows 上安裝並設定妥。

  • 作用中的 AWS 帳戶

  • AWS Command Line Interface (AWS CLI) 版本 2,在 Linux、macOS 或 Windows 上安裝並設定妥。

  • 現有 Amazon EKS 叢集,具有標籤化的私有子網路、公有子網路,並設定為託管應用程式。如需詳細資訊,請參閱「」子網路標記《Amazon EKS 文件》中的詳細資訊。 

  • kubectl,安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊,請參閱「」安裝 kubectl《Amazon EKS 文件》中的詳細資訊。 

  • Grpcurl,已安裝並設定妥。

  • AWS Load Balancer 控制器,已在 Amazon EKS 叢集中佈建。

  • 具有有效 SSL 或 SSL/TLS 憑證的現有網域名稱系統 (DNS) 主機名稱。您可以使用 AWS Certificate Manager (ACM) 或將現有憑證上傳至 ACM 來取得您網域的憑證。如需關於這兩個選項的詳細資訊,請參閱請求公有憑證將憑證匯入 AWS Certificate Manager在 ACM 說明文件中。

Architecture

下圖顯示從卸載至 Application Load Balancer 的 GRPC 用戶端接收 SSL/TLS 流量的工作流程。流量會以純文字格式轉送至 GRPC 伺服器,因為流量來自虛擬私有雲端 (VPC)。

Tools

  • AWS CLI— AWS Command Line Interface (AWS CLI) 是一種開放原始碼工具,可讓您使用命令列 shell 中的命令與 AWS 服務互動。

  • Elastic Load Balancing— Elastic Load Balancing 可在一個或多個可用區域的多個目標 (例如 Amazon Elastic Container (Amazon EC2) 執行個體、容器和 IP 地址) 間將傳入應用程式流量或網路流量分配到多個可用區域。

  • Amazon ECR— Amazon Elastic Container Registry (Amazon ECR) 是一個完整受管的 Docker 容器註冊表。

  • Amazon EKS— Amazon Elastic Kubernetes Service (Amazon EKS) 是一項受管的 Kubernetes 服務,讓您在 AWS 執行 Kubernetes,而無須安裝、操作和維護您自己的 Kubernetes 控制平面。

  • 葛貝kubectl是一種命令列公用程式,可對 Kubernetes 叢集執行命令。

  • AWS Load Balancer 控制器— AWS Load Balancer 控制器管理 Kubernetes 叢集的彈性負載平衡器。

  • Grpcurl— grpCURL 是一個命令列工具,可以幫助您與 GrPC 服務進行互動。

Epics

任務描述所需技能
創建一個 Amazon ECR 儲存庫。

登入 AWS 管理主控台,開啟 Amazon ECR 主控台,然後建立 Amazon ECR 儲存庫。如需此項目的詳細資訊,請參閱建立儲存庫在 Amazon ECR 文件中。確保您記錄了亞馬遜 ECR 存儲庫的 URL。

您也可以透過執行下列命令使用 AWS CLI 建立 Amazon ECR 存放庫:

aws ecr create-repository --repository-name helloworld-grpc

雲端管理員
建置 Docker 影像。

下載文件(附件)並打開目錄。從目錄內容的根目錄,請確定 Docker 檔存在,然後執行下列命令來建置 Docker 映像: 

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

裝置工程師
將 Docker 影像推送至 Amazon ECR。

執行下列命令來登入 Amazon ECR 儲存庫:

aws ecr get-login-password --region us-east-1 --no-cli-auto-prompt | docker login --username AWS --password-stdin 0123456789.dkr.ecr.us-east-1.amazonaws.com

透過執行以下命令,將 Docker 影像推送至 Amazon ECR 儲存庫:

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

重要:請務必將<your_aws_account_id>使用您的 AWS 帳戶 ID 來完成。

裝置工程師
任務描述所需技能
修改 Kubernetes 資訊清單檔案中的值。

根據您的需求,修改 Grpc-sample.yaml 庫伯內蒂斯資訊清單檔案。您必須修改輸入資源中的註釋和主機名稱。如需範例輸入資源,請參閱其他資訊區段。如需輸入註解的詳細資訊,請參閱輸入註解在 Kubernetes 文件中。

在 Kubernetes 部署資源中,變更部署資源的image添加到您推送 Docker 映像到的亞馬遜 ECR 存儲庫的統一資源標識符(URI)。如需部署資源範例,請參閱其他資訊區段。

裝置工程師
部署 Kubernetes 資訊清單檔案。

透過執行下列命令,將 grpc-範例 .yaml 檔案部署到 Amazon EKS 叢集kubectl命令 

kubectl apply -f ./kubernetes/grpc-sample.yaml

裝置工程師
任務描述所需技能
記錄 Application Load Balancer 的 FQDN。

執行下列命令kubectl命令來描述管理 Application Load Balancer 的 Kubernetes 入口資源:

kubectl get ingress -n grpcserver

範例輸出會在其他資訊區段。在輸出中,HOSTS欄位會顯示為其建立 SSL 憑證的 DNS 主機名稱。將應用程式負載平衡器的完整網域名稱 (FQDN) 從Address欄位。 

建立指向應用程式負載平衡器的 FQDN 的 DNS 記錄。如果您的 DNS 供應商是 Amazon Route 53,則可以建立指向應用程式負載平衡器的 FQDN 的別名記錄。如需此項目的詳細資訊,請參閱選擇別名或非別名記錄在路 Route 53 文檔中。

裝置工程師
任務描述所需技能
測試 GRPC 伺服器。

使用 grpcurl 來測試端點,方法是執行以下命令:

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

請注意:Replacegrpc.example.com使用您的 DNS 名稱。

裝置工程師
測試使用 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

這表明客戶端可以與服務器通話,並且連接成功。

裝置工程師

相關資源

其他資訊

範例入口資源:

apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}' 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 kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/subnets: subnet-XXXXXX,subnet-YYYYYY # <----- Replace with the private subnets within the VPC that hosts the Amazon EKS cluster alb.ingress.kubernetes.io/security-groups: sg-ZZZZZZZZ. # <----- Replace with a security group ID from the VPC where the Amazon EKS cluster is deployed. Make sure that this security group is allowed to access the nodes alb.ingress.kubernetes.io/healthcheck-path: / alb.ingress.kubernetes.io/healthcheck-protocol: HTTP alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxxx:certificate/xxxxxxx #<----- Replace with the ACM certificate ARN for the DNS hostname labels: app: grpcserver environment: dev name: grpcserver namespace: grpcserver spec: rules: - host: grpc.example.com # <----- Replace as required by your host name that the SSL certificate is available for in ACM http: paths: - backend: serviceName: ssl-redirect servicePort: use-annotation path: /* - backend: serviceName: grpcserver servicePort: 9000

部署資源範例:

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: 00123456789.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

Attachments

attachment.zip