我在 AWS EKS 中安装了 grpc 应用程序。 grpc 端点通过端口转发成功工作:
grpcurl -plaintext -protoset-out=reflection.protoset localhost:8080 list
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection
我已经通过 Helm Chart 安装了 nginx-ingress,并设置了以下配置:
USER-SUPPLIED VALUES:
controller:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <cert-arn>
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/aws-load-balancer-type: nlb
targetPorts:
https: 443
这已成功创建一个带有侦听器的 NLB,一个用于 HTTP,一个用于 TLS,并附加了证书。
然后我创建了一个像这样的入口:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/backend-protocol: GRPC
nginx.ingress.kubernetes.io/ssl-redirect: "true"
generation: 7
labels:
name: <app>
name: <svc-name>
namespace: <ns>
spec:
ingressClassName: nginx
rules:
- host: <app>.development.<domain>
http:
paths:
- backend:
service:
name: <svc>
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- <app>.development.<domain>
secretName: dev-tls
status:
loadBalancer:
ingress:
- hostname: <loadbalancer>
您会注意到我还在入口处使用 cert-manager/lets-encrypt 终止 TLS,因为我认为这是必需的。
外部 DNS 正在 Route53 中正确创建记录,并且正在从 Let's Encrypt 获取证书。但是,无论我做什么,grpc curl 都不起作用并抛出“上下文截止日期超出”
grpcurl -protoset-out=reflection.protoset <app>.development.<domain>:443 list
Failed to dial target host "<app>.development.<domain>:443": context deadline exceeded
我在这里缺少什么?我尝试过的其他事情:
将 TLS 侦听器上的 ALPN 策略设置为仅 HTTP/2 使用 ALB 入口控制器(是的,真的!)同样的问题
编辑:还验证了这不是示例 grpc 应用程序的应用程序问题
编辑2:使用服务
Type=LoadBalancer
并绕过nginx-ingress完全有效,所以这绝对看起来像是nginx-ingress的问题