簡體   English   中英

使用 Nginx-Ingress-Controller 在 AWS 上的 EKS 中使用 gRPC

[英]gRPC in EKS on AWS with Nginx-Ingress-Controller

我在 AWS EKS 中設置了 gRPC 服務器,並使用 Nginx-Ingress-Controller 執行負載平衡。 我嘗試通過將 gRPC 服務器入口設置為 like 來終止 NLB 的 TLS

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: my-grpc
  namespace: myspace
spec:
  rules:
    - host: my.test.com
      http:
        paths:
          - path: /
            backend:
              serviceName: grpc-server
              servicePort: 8080

另外,我使用 Amazon Certificate Manager 來管理 NLB 的 TLS,所以我必須更改 Nginx-Ingress-Controller Value.yaml 的 Helm Chart 以下字段

controller:
  service:
    enabled: true
    annotations: 
      service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:xxxxxxxxxxx
      service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
      service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443,8443"
      service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "3600"
      service.beta.kubernetes.io/aws-load-balancer-type: nlb
      service.beta.kubernetes.io/aws-load-balancer-internal: "true"

    targetPorts:
      http: http
      https: http

問題是,我無法通過 443 端口成功調用並使客戶端連接到 gRPC 服務器。

問題發生在 NLB 和 Nginx 之間,但原因和原因尚不清楚。 任何形式的幫助將不勝感激。

注意:我知道示例ingress-nginx有 TLS 字段,但是如果我使用 ACM,我應該把它放在這里。

我終於通過 AWS + NLB + EKS 得到了一些東西。 我從這個基本的 grpc 應用開始

用您的 URL(例如 example.com)交換“fortune-teller.stack.build”的任何實例

在入口中,我必須將tls -> secret Name 更改為我之前使用本指南創建的 tls-secret

kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
  name: fortune-ingress
  namespace: default
spec:
  rules:
  - host: example.com
    http:
      paths:
      - backend:
          serviceName: fortune-teller-service
          servicePort: grpc
  tls:
  - secretName: tls-secret
    hosts:
      - example.com

在 cert.yaml 中,更改

  1. 規格 -> 域到我的 URL (example.com)

在 svc.yaml 中,添加注解和“類型:LoadBalancer”

apiVersion: v1
kind: Service
metadata:
  name: fortune-teller-service
  namespace: default
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    service.beta.kubernetes.io/aws-load-balancer-internal: "false"
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:<REGION>:<MY ACCOUNT>:certificate/<CERT ID>"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
spec:
  type: LoadBalancer
  selector:
    k8s-app: fortune-teller-app
  ports:
  - port: 50051
    targetPort: 50051
    name: grpc

通過自述文件部署所有內容后,在 AWS 控制台中找到 NLB。

  1. 偵聽器選項卡 - > select 偵聽器 (50051) 並單擊“編輯”
  2. 將協議更改為 TLS,我將端口更改為 443
  3. 在 ALPN 策略下,Select "HTTP2Only"
  4. 在“默認操作 -> 轉發到”下保持相同的目標組
  5. Select 一個策略版本(我選擇了 ELBSecurityPolicy2016-08 但將升級它)和您來自 ACM 的證書,它與您的 URL
  6. 點擊“更新”
  7. 將您的 DNS 名稱指向您的 NLB

現在等待...因為偵聽器更新似乎需要幾分鍾。

grpcurl example.com:443 build.stack.fortune.FortuneTeller/Predict

通過交換圖像、端口,當然還有名稱,我還能夠讓我的應用程序成功運行。

我犯的錯誤使它對我不起作用:

  • 入口中沒有 TLS 密鑰
  • 當 AWS 文檔說您的目標組必須是“TLS 目標組”時,請相信他們。 如果您遵循此示例,則永遠不會交換 TG。 TG 保持為 TCP TG 並且仍然有效。

感謝 CrookedSmile 的回答,但事實證明我的問題在我的 Nginx-Ingress-Controller 設置中有根本原因,我最終以這種方式解決了它:

當我使用 Nginx-Ingress-Controller 時,我錯誤地認為在 NLB 終止 TLS 和在 Nginx 終止 TLS 是一回事。 但事實並非如此。

在我的情況下,我不需要在 NLB 終止 TLS,我需要在 Nginx 終止它。

所以我做了以下兩件事:

  1. 我恢復了我在本節AWS L7 ELB SSL Termination之后所做的事情。

  2. Nginx 由我的應用程序入口文件配置。 所以我必須在這里設置 gRPC 服務器入口的 TLS 字段,例如ingress.yaml 示例

然后 TLS 在 Nginx 成功終止,我可以在 NLB 后面調用我的 gRPC 服務器,並在兩者之間使用 Nginx-Ingress-Controller。

附加說明:目前,Nginx-Ingress-Controller 尚不支持 ACM(2020 年 7 月 1 日),因此您必須自己管理每個證書。

@CrookedSmile - 當您部署類型為 LoadBalancer 的服務時,它會在您的 AWS 賬戶中創建一個網絡負載均衡器。 現在,當您創建 Nginx 入口 controller 時,這是另一個正在后台創建的負載均衡器。 根據您的說明,您將通過 Loadbalancer 公開服務 - 作為服務類型的一部分創建。 當您修改目標組列表器端口時,它會中斷您的 Ingress 和此服務負載均衡器之間的通信,因為根據您的 Kubernetes 服務清單,負載均衡器偵聽器的所需狀態是 50051。

您可以按照以下順序部署示例 grpc 應用程序。

https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/grpc

  1. 部署算命應用
$ kubectl create -f app.yaml
  1. 將服務部署為類型:ClusterIP
 $ kubectl create -f svc.yaml
  1. 部署 nginx-ingress controller
 $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/do/deploy.yaml
  1. 部署入口資源
$ kubectl create -f ingress.yaml
  1. 最后,添加一個主機條目來欺騙您的域名 例如:“fortune-teller.stack.build”,帶有您的 Ingress LB 的 A 記錄。

  2. 驗證

$ grpcurl --insecure fortune-teller.stack.build:443 build.stack.fortune.FortuneTeller/Predict { "message": "Fremen add life to spice!" }

簡而言之,這是工作流程。

GRPC 請求 --> Nginx 入口 NLB --> 后端服務(集群 IP) --> 應用程序 pod

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM