如何在Minikube中为gRPC服务设置特使代理?

时间:2019-03-05 02:04:53

标签: kubernetes envoyproxy grpc-web

我正在开发一个gRCP API,但遇到了一个小问题。我希望可以从React前端访问gRPC服务,这意味着我需要有一个转译gRPC-> HTTP1的特使代理,反之亦然。

TL; DR 我认为我可以联系特使代理,但是该代理未正确路由到我的服务。

我将在此处提供服务的信息,并在下面解释发生的情况。

我的每项服务的K8(部署和服务)yaml文件:
Simulation deployment

Envoy配置文件和Docker映像
Envoy Config
Envoy Dockerfile

这是一项快速的健全性检查,可确保我的服务正常运行,而无需考虑特使代理:

> kubectl get services
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP          37d
sim-dep           NodePort    10.105.65.65     <none>        9090:30780/TCP   3s
sim-dep-http1     NodePort    10.111.190.170   <none>        8080:30948/TCP   3s
sim-envoy-proxy   NodePort    10.110.178.132   <none>        9091:32068/TCP   17h

> curl <minikube ip>:30948/v1/todo/all
{"api":"v1","toDos":[{}]}

> ./client-grpc -server=192.168.99.100:30780
<success from server, too much to put here but it works>

因此,据我了解,此特使代理应在端口9091上接受连接,然后将其重新路由到端口9090上的地址sim-dep(正在运行K8s DNS)。
这是我在主机上的React应用(而不是在minikube中)上运行它时的代码和错误。

var todoService = new ToDoServiceClient(
   "http://192.168.99.100:32068/",
   null,
   null
);
var todo = new ToDo();
todo.setTitle("JS Created ToDo");
todo.setDescription("This todo was created with JS client");
var createRequest = new CreateRequest();
createRequest.setApi("v1");
createRequest.setTodo(todo);
var response = await todoService.create(createRequest, {}, <callback>);

日志:

upstream connect error or disconnect/reset before headers

我假设这意味着它在某种程度上无法连接,但是该错误的描述性不是很高。我也无法浏览特使代理,但是我确实尝试通过PostMan发送请求并得到了这个信息:

enter image description here

我不太确定该怎么做,但是似乎正在达到使节,但没有达到服务水平。我将不胜感激! :)让我知道是否错过了这里的任何信息。谢谢!

1 个答案:

答案 0 :(得分:2)

就想通了!

要进行调试,我在本地运行了代理容器。我能够连接到它,并收到此错误:

unknown service /v1.ToDoService

我为此讨厌自己,但是这个错误本质上是用英语说的:

I can connect to your server, but I can't find a service called /v1.ToDoService

大量盯着我的代码并进行了完整性检查之后,我意识到它正在错误的位置寻找服务...错误的确应该提供更多信息,但我要做的就是将我的JS客户端中的连接URL更改为此:

http://localhost:32068

最后没有斜杠!哎呀!

现在处理部署此代理...

因此,gRPC服务的部署上具有元数据,该元数据为该服务创建了DNS地址(?不确定其叫什么名称)。因此,就我而言,我致电了服务sim-dep。如果您遵循DNS section tutorial here,则可以为您的服务进行DNS查找,在我看来,这为我提供了

sim-dep.default.svc.cluster.local

现在我发现所有要做的就是将envoy配置的主机地址替换为该地址,并且一切正常!