![](/img/trans.png)
[英]HTTPS redirect not working for default backend of nginx-ingress-controller
[英]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 中,更改
在 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。
現在等待...因為偵聽器更新似乎需要幾分鍾。
grpcurl example.com:443 build.stack.fortune.FortuneTeller/Predict
通過交換圖像、端口,當然還有名稱,我還能夠讓我的應用程序成功運行。
我犯的錯誤使它對我不起作用:
感謝 CrookedSmile 的回答,但事實證明我的問題在我的 Nginx-Ingress-Controller 設置中有根本原因,我最終以這種方式解決了它:
當我使用 Nginx-Ingress-Controller 時,我錯誤地認為在 NLB 終止 TLS 和在 Nginx 終止 TLS 是一回事。 但事實並非如此。
在我的情況下,我不需要在 NLB 終止 TLS,我需要在 Nginx 終止它。
所以我做了以下兩件事:
我恢復了我在本節AWS L7 ELB SSL Termination之后所做的事情。
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
$ kubectl create -f app.yaml
$ kubectl create -f svc.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/do/deploy.yaml
$ kubectl create -f ingress.yaml
最后,添加一個主機條目來欺騙您的域名 例如:“fortune-teller.stack.build”,帶有您的 Ingress LB 的 A 記錄。
驗證
$ 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.