kubernetes 无法访问nginx-ingress和nlb后面的grpc应用程序

dgenwo3n  于 2023-08-03  发布在  Kubernetes
关注(0)|答案(1)|浏览(125)

bounty还有6天到期。回答此问题可获得+500声望奖励。jaxxstorm正在寻找一个规范答案:这仍然是一个问题,开始一个新的赏金

我在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在route 53中正确创建了一条记录,并且正在从let's encrypt获取证书。但是,无论我做什么,grpc curl都不起作用,并抛出“context deadline exceed”

grpcurl -protoset-out=reflection.protoset <app>.development.<domain>:443 list
Failed to dial target host "<app>.development.<domain>:443": context deadline exceeded


我错过了什么?我尝试过的其他方法:
将TLS侦听器上的ALPN策略设置为仅使用ALB入口控制器的HTTP/2(是的,真的!)同一问题
编辑:我还验证了这不是一个示例grpc应用程序的应用程序问题
编辑2:使用服务Type=LoadBalancer并完全绕过nginx-ingress可以工作,所以这绝对看起来像是nginx-ingress的问题

r55awzrz

r55awzrz1#

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无法从您的网络访问,除非是有意的,请尝试添加以下注解:
第一个月
在控制台上检查NLB是否已联机(例如通过健康检查)并重试。

相关问题