Search code examples
kubernetesgrpckubernetes-ingressaws-application-load-balancer

Expose multiple gRPC services using single ALB Ingress


I am trying to implement ingress for gRPC services. When i use single service it works fine but as soon as i integrate second service i am unable to call it.

below is the code for this. My both services are exposed as 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  

This is the result

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

Now when i add the code for emails service like below

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  

Now when i try to access this i get error

❯ 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

I was expecting it to work as HTTP, maybe i am missing some thing.

Please help me.

Thanks,


Solution

  • gRPC uses paths in the style of /the.service.Name/methodName. So use the service name in the path to separate traffic. To send all UserService traffic to the users service, use the fully-qualified service name with a forward slash on either side.

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

    You didn't mention the service name for the emails service, so I can't provide the example configuration for it.