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,
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.