【问题标题】:Expose multiple gRPC services using single ALB Ingress使用单个 ALB 入口公开多个 gRPC 服务
【发布时间】:2022-08-04 05:29:19
【问题描述】:

我正在尝试为 gRPC 服务实现入口。当我使用单一服务时,它工作正常,但一旦我集成第二个服务,我就无法调用它。

下面是这个的代码。我的两个服务都公开为 NodePort。

#### Ingress ####

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
    alb.ingress.kubernetes.io/listen-ports: \'[{\"HTTPS\":443}]\'
    alb.ingress.kubernetes.io/target-type: instance
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internal
    service.beta.kubernetes.io/aws-load-balancer-internal: \"true\"
    alb.ingress.kubernetes.io/certificate-arn: <certificate-arn>
  labels:
    app: grpcserver
  name: grpcserver
spec:
  rules:
  - host: grpc-services.dev.test.com
    http:
      paths:
      - backend:
          service:
            name: users
            port:
              number: 9090
        path: /
        pathType: Prefix  

这是结果

❯ grpcurl grpc-services.dev.test.com:443 list
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection
user.UserService

现在,当我添加电子邮件服务的代码时,如下所示

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol-version: GRPC
    alb.ingress.kubernetes.io/listen-ports: \'[{\"HTTPS\":443}]\'
    alb.ingress.kubernetes.io/target-type: instance
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internal
    service.beta.kubernetes.io/aws-load-balancer-internal: \"true\"
    alb.ingress.kubernetes.io/certificate-arn: <certificate-arn>
  labels:
    app: grpcserver
  name: grpcserver
spec:
  rules:
  - host: grpc-services.dev.test.com
    http:
      paths:
      - backend:
          service:
            name: emails
            port:
              number: 9090
        path: /emails
        pathType: Prefix
      - backend:
          service:
            name: users
            port:
              number: 9090
        path: /
        pathType: Prefix  

现在当我尝试访问这个我得到错误

❯ grpcurl grpc-services.dev.test.com:443/emails list
Failed to dial target host \"grpc-services.dev.test.com:443/emails\": dial tcp: lookup tcp/443/emails: nodename nor servname provided, or not known

also tried
❯ grpcurl grpc-services.dev.test.com/emails:443 list
Failed to dial target host \"grpc-services.dev.test.com/emails:443\": dial tcp: lookup grpc-services.dev.test.com/emails: no such host

我期待它可以作为 HTTP 工作,也许我错过了一些东西。

请帮我。

谢谢,

  • grpc-services.dev.kappapay.com 这不是规范中使用的主机。
  • @gohm\'c,错字已修复

标签: kubernetes grpc kubernetes-ingress aws-application-load-balancer


【解决方案1】:

gRPC 使用style of /the.service.Name/methodName 中的路径。所以使用path中的服务名来分隔流量。要将所有UserService 流量发送到users 服务,请使用具有正斜杠的完全限定服务名称。

  - host: grpc-services.dev.test.com
    http:
      paths:
      - backend:
          service:
            name: users
            port:
              number: 9090
        path: /user.UserService/
        pathType: Prefix

您没有提到电子邮件服务的服务名称,所以我无法提供它的示例配置。

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 2022-12-22
    • 2019-11-26
    • 2020-01-03
    • 2020-08-09
    • 2018-07-09
    • 2021-11-30
    • 2019-08-19
    相关资源
    最近更新 更多