本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EKS 叢集上部署以 gRPC 為基礎的應用程式,並使 Application Load Balancer 存取
由基蘭庫馬爾·錢德拉什卡(AWS)和 Huy 阮(AWS)創建
代碼存儲庫:grpc-traffic-on-alb到 eks | 環境:PoC 或試點 | 技術:容器和微服務;內容傳遞;虛擬主機;網站和 Web 應用程式 |
工作負載:所有其他工作 | AWS 服務:Amazon EKS;Elastic Load Balancing (ELB) |
Summary
此模式說明如何在 Amazon 彈性 Kubernetes 服務 (Amazon EKS) 叢集上託管以 gRPC 為基礎的應用程式,並透過應用程式負載平衡器安全地存取該應用程式。
GrPC
此模式說明如何託管在 Amazon EKS 上 Kubernetes 網繭上執行的基於 gRPC 的應用程式。gRPC 用戶端透過具有 SSL/TLS 加密連線的 HTTP/2 通訊協定連線到 Application Load Balancer。應用程式負載平衡器會將流量轉送至在 Amazon EKS 網繭上執行的 gRPC 應用程式。您可以使用 Kubernetes 水平網繭自動配置器,根據流量自動調整 gRPC 網繭的數目。應用程式負載平衡器的目標群組會在 Amazon EKS 節點上執行運作狀態檢查、評估目標是否運作良好,以及僅將流量轉送至運作良好的節點。
先決條件和限制
先決條件
作用中的 AWS 帳戶
碼頭
, 安裝和配置在 Linux 上, macOS, 或視窗. AWS Command Line Interface (AWS CLI) (AWS CLI) 第 2 版,已在 Linux、macOS 或視窗上安裝和設定。
例
如, 在 Linux 上安裝和配置, macOS 系統, 或視窗. kubectl
、已安裝並設定為存取 Amazon EKS 叢集上的資源。如需詳細資訊,請參閱 Amazon EKS 文件中的安裝或更新 kubectl。安裝和配置的 GrPCurl
。 全新或現有的 Amazon EKS 叢集。如需詳細資訊,請參閱開始使用 Amazon EKS。
設定為存取 Amazon EKS 叢集的電腦終端機。如需詳細資訊,請參閱 Amazon EKS 文件中的設定電腦與叢集通訊。
AWS Load Balancer 控制器,佈建於 Amazon EKS 叢集中。
具有有效 SSL 或 SSL/TLS 憑證的現有 DNS 主機名稱。您可以使用 AWS Certificate Manager (ACM) 或將現有憑證上傳至 ACM 來取得網域的憑證。如需這兩個選項的詳細資訊,請參閱 ACM 文件中的要求公用憑證和將憑證匯入 AWS Certificate Manager。
架構
下圖顯示了這種模式實現的體系結構。
下圖顯示了從將負載卸載到應用程式負載平衡器的 GrPC 用戶端接收 SSL/TLS 流量的工作流程。流量是以明文形式轉送到 GrPC 伺服器,因為它來自虛擬私有雲 (VPC)。
工具
AWS 服務
AWS Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可協助您透過命令列殼層中的命令與 AWS 服務互動。
E@@ lastic Load Balancing 可將傳入的應用程式或網路流量分配到多個目標。例如,您可以在一個或多個可用區域中將流量分配到 Amazon 彈性運算雲端 (Amazon EC2) 執行個體、容器和 IP 地址。
Amazon Elastic Container Registry (Amazon ECR) 是一種安全、可擴展且可靠的受管容器映像登錄服務。
Amazon Elastic Kubernetes Service (Amazon EKS) 可協助您在 AWS 上執行 Kubernetes,而無需安裝或維護自己的 Kubernetes 控制平面或節點。
工具
eksctl
是一個簡單的 CLI 工具,用於在 Amazon EKS 上創建集群。 kubectl
是一個命令列公用程式,可針對 Kubernetes 叢集執行命令。 AWS Load Balancer 控制器可協助您管理 Kubernetes 叢集的 AWS 彈性負載平衡器。
GrPCurl
是一個命令列工具,可協助您與 GrPC 服務互動。
代碼存儲庫
此模式的代碼可在 GitHub grpc-traffic-on-alb-to-eks
史诗
任務 | 描述 | 所需技能 |
---|---|---|
建立 Amazon ECR 儲存庫。 | 登入 AWS 管理主控台,開啟 Amazon ECR 主控台 您也可以透過執行下列命令,使用 AWS CLI 建立 Amazon ECR 儲存庫:
| 雲端管理員 |
建置 Docker 影像。 |
| DevOps 工程師 |
將碼頭圖像推送到 Amazon ECR。 |
| DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
修改 Kubernetes 資訊清單檔案中的值。 | DevOps 工程師 | |
部署 Kubernetes 資訊清單檔案。 | 執行下列
| DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
記錄應 Application Load Balancer 的 FQDN。 |
| DevOps 工程師 |
任務 | 描述 | 所需技能 |
---|---|---|
測試 gRPC 伺服器。 | 透過執行下列命令,使用 GrPCurl 來測試端點:
注意:請 | 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