部署 Rest + gRPC 服务器部署到带有入口的 k8s

Posted

技术标签:

【中文标题】部署 Rest + gRPC 服务器部署到带有入口的 k8s【英文标题】:Deploy Rest + gRPC server deploy to k8s with ingress 【发布时间】:2019-08-31 21:41:49 【问题描述】:

我使用了一个示例 gRPC HelloWorld 应用程序https://github.com/grpc/grpc-go/tree/master/examples/helloworld。该示例在本地系统中运行流畅。

我想使用 Ingress 将其部署到 Kubernetes。

以下是我的配置文件。

service.yaml - 作为 NodePort

apiVersion: v1
kind: Service
metadata:
  name: grpc-scratch
  labels:
    run: grpc-scratch
  annotations:
    service.alpha.kubernetes.io/app-protocols: '"grpc":"HTTP2"'
spec:
  type: NodePort
  ports:
  - name: grpc
    port: 50051
    protocol: TCP
    targetPort: 50051
  selector:
    run: example-grpc

ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    nginx.org/grpc-services: "grpc"
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: true
spec:
  tls:
    - hosts:
        - xyz.com
      secretName: grpc-secret
  rules:
    - host: xyz.com
      http:
        paths:
          - path: /grpc
            backend:
              serviceName: grpc
              servicePort: 50051

我无法使用 url xyz.com/grpc 向服务器发出 gRPC 请求。得到错误


  "error": "14 UNAVAILABLE: Name resolution failure"

如果我向xyz.com 提出请求,则错误是


  "error": "14 UNAVAILABLE: Trying to connect an http1.x server"

任何帮助将不胜感激。

【问题讨论】:

您的服务定义了端口 8081,但您的入口需要端口 50051。为什么? @MadWombat 更新了服务。这是指向差异端口的不同服务。 @TusharSheth 你也可以分享你的部署清单吗? github.com/kubernetes/ingress-nginx/issues/2497 你用什么作为入口控制器?克? nginx的?至少有什么? 【参考方案1】:

入口对象的后端是服务和端口名称的组合

在您的情况下,您将 serviceName: grpc 作为后端,而您的服务的实际名称是 name: grpc-scratch

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: grpc-ingress
  annotations:
    nginx.org/grpc-services: "grpc"
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: true
spec:
  tls:
    - hosts:
        - xyz.com
      secretName: grpc-secret
  rules:
    - host: xyz.com
      http:
        paths:
          - path: /grpc
            backend:
              serviceName: grpc-scratch
              servicePort: grpc

【讨论】:

以上是关于部署 Rest + gRPC 服务器部署到带有入口的 k8s的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot+gRPC构建微服务并部署到Istio(详细教程)

Spring Boot+gRPC构建微服务并部署到Istio(详细教程)

如何在 Google Cloud Platform 上部署 GRPC 服务器和客户端?

带有REST和Open API的gRPC

如何将简单的 Spring Boot(带有 Gradle 构建系统)部署到 Apache Tomcat(真实服务器,而不是嵌入服务器)?

在 WildFly 上重新部署后,CDI 无法在 @Requestscoped REST 服务中将 @Singleton 设置为 @Provider