kedacore / http-add-on

Add-on for KEDA to scale HTTP workloads
https://kedacore.github.io/http-add-on/
Apache License 2.0
373 stars 97 forks source link

GRPC does not work? #1084

Open Leonardo-Ferreira opened 4 months ago

Leonardo-Ferreira commented 4 months ago

Report

I'm trying to set the HTTP Add On for my GRPC but it's not working. When calling the service, it 'hangs' forever.

Side note: the TLS is "optional" (no forced redirect) at the ingress level and the certificate is signed by a internal CA with multiple SANs (aka common name is generic)

Expected Behavior

the service should reply

Actual Behavior

it hangs until timeout

Steps to Reproduce the Problem

  1. Create a GRPC service
  2. Publish it without keda and validate that its working
  3. Now put keda interceptor in the middle of the way to try to scale the service based on service requests

Logs from KEDA HTTP operator

example

HTTP Add-on Version

0.8.0

Kubernetes Version

< 1.28

Platform

Microsoft Azure

Anything else?

No response

JorTurFer commented 2 months ago

I'm not an expert, but I'd say that GRPC needs HTTP/2 support and ??websockets?? to work well. Am i right? Supporting GRPC'd be nice if you are willing to open a PR

Leonardo-Ferreira commented 2 months ago

I'd be happy to! Would be so kind to point me the right direction of things here? im not familiar with the code here. Something on the lines of "start by checking src/this.go and src/that.go"

JorTurFer commented 2 months ago

All the interception code is here -> https://github.com/kedacore/http-add-on/tree/main/interceptor

The interceptor works as a split component that route the traffic and exposes metrics, so you don't need to take into account anything else related :)

It has an entrypoint that creates all the deps and so on, and start serving traffic :) I guess that as gRPC keeps the connection open AFAIK, you will need to take this into account to not decrement the counter until the gRPC connection is closed

wozniakjan commented 2 months ago

but I'd say that GRPC needs HTTP/2 support and ??websockets??

gRPC does need HTTP2 but works without WebSocket. Interceptor only supports gRPC over TLS (you have to mount the certs and explicitly enable TLS), the plaintext gRPC support is not implemented and the reasons why not relate to https://github.com/golang/go/issues/14141.

Alternatively, there is Kedify HTTP Scaler that reuses parts of this http-add-on and has native gRPC support including both plaintext and TLS without any explicit configuration (mounting TLS certs). If you are interested, you can test it in one of the free tutorials https://kedify.io/tutorials/grpc

araminian commented 1 month ago

@Leonardo-Ferreira I did handle GRPC services using http-add-on with a trick. It might be useful for you.

I add another container to our GRPC services deployment. this container can be a dummy http server. So we can scale up GRPC services just by sending a request to that http server.

it might have not good UX, unless you use it in CI/CD workflows.