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

How do I set up an envoy proxy in Minikube for a gRPC service?

我正在研究一个小的 gRCP API,我 运行 遇到了一个小问题。我希望可以从 React 前端访问 gRPC 服务,这意味着我需要有一个 envoy 代理来转换 gRPC -> HTTP1,反之亦然。

TL;DR 我想我可以访问特使代理,但代理没有正确路由到我的服务。

我将把服务的信息放在这里并解释下面发生的事情。

我的每项服务的 K8s(部署和服务)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 上的连接,然后将它们重新路由到地址 sim-dep(K8s DNS 是 运行ning)端口 9090.
这是我的代码和错误,当我 运行 在我主机上的 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

我假设这意味着它无法在某种程度上连接,但该错误的描述性不强。我也无法通过 envoy 代理卷曲,但我确实尝试使用 PostMan 发送请求并得到了这个:

我不太确定这是怎么回事,但它似乎到达了特使但没有到达服务。我将不胜感激任何帮助! :) 如果我在这里遗漏了任何信息,请告诉我。谢谢!

刚弄明白!

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

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 配置的主机地址替换为该地址,然后一切正常!