【问题标题】:How to setup GRPC Ingress on GKE (w/ nginx-ingress)如何在 GKE 上设置 GRPC Ingress(使用 nginx-ingress)
【发布时间】:2020-05-19 11:50:42
【问题描述】:

早上好。我有一个 GRPC 服务器,我想在 Google Kubernetes Engine 上提供服务。我的集群已经安装了nginx-ingress 控制器,我目前正在使用它来提供http/https 流量。这是我尝试创建的用于托管 GRPC 服务器的入口资源:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: grpc-ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/grpc-backend: "true"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  namespace: default
spec:
  tls:
  - hosts:
    - bar.foo.com
    secretName: reploy-tls
  rules:
  - host: bar.foo.com
    http:
      paths:
      - backend:                                                                                                                                                                                                      
          serviceName: bar-backend-service
          servicePort: 50051

这是应用程序的服务/部署:

apiVersion: v1
kind: Service
metadata:
  name: bar-backend-service
  namespace: default
spec:
  selector:
    app: bar-backend-app
  ports:
  - port: 50051
    targetPort: 50051
    name: grpc
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: bar-backend
  labels:
    app: bar-backend-app
  namespace: default
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: bar-backend-app
    spec:
      containers:
      - name: bar-backend-image
        image: gcr.io/himank-jay/bar-backend-image:TAG
        ports:
        - containerPort: 50051
          name: grpc

当我运行grpc_cli ls bar.foo.com:443(使用grpc_cli)时,我收到以下错误:

{"created":"@1580833741.460274000","description":"Error received from peer ipv4:x.x.x.x:x","file":"src/core/lib/surface/call.cc","file_line":1055,"grpc_message":"Socket closed","grpc_status":14}

来自nginx-controller的错误如下:

x.x.x.x - - [04/Feb/2020:16:28:46 +0000] "PRI * HTTP/2.0" 400 157 "-" "-" 0 0.020 [] [] - - - - xxxxx

关于这里出了什么问题的任何想法?或者对如何调试有任何想法?

【问题讨论】:

    标签: kubernetes grpc kubernetes-ingress nginx-ingress grpc-go


    【解决方案1】:

    服务器提供 HTTP/1.x,而不是 gRPC 所需的 HTTP/2。

    您可以尝试在Ingress 配置中添加以下注解

    nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
    

    ...正如here 解释的那样。

    还值得检查 nginx configuration 中的 use-http2 标志(默认情况下应该启用 true)。


    编辑,关于新错误:

    PRI * HTTP/2.0 是所谓的HTTP/2 Connection Preface - 协商 HTTP/2 的一部分。似乎仍然没有为 HTTP/2 配置 nginx。

    【讨论】:

    • 我在上面编辑了我的答案;修复证书问题后,现在出现不同的错误。
    • 我添加了关于 PRI * HTTP/2.0 请求出错的解释。
    • 不幸的是,这里没有运气。决定只在默认 type: LoadBalancer 前面公开一组 pod。
    • @JayK 上仍然没有任何内容。 ?我需要 Ingress,因为我需要从 domain.com 转发到 IP(然后我不能指定端口)
    • @Emixam23 对于这个特殊的解决方案,仍然没有运气。我最近遇到的是这样的:cloud.google.com/load-balancing/docs/… 您可以在服务后面使用标准的谷歌云负载均衡器来转发 http2/grpc 流量。这个我没试过,不过好像可以设置你想要的域名规则。
    猜你喜欢
    • 2021-11-05
    • 2019-12-18
    • 2021-07-31
    • 2021-10-16
    • 2020-01-09
    • 2019-06-16
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多