如何在 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 配置的主机地址替换为该地址,然后一切正常!
我正在研究一个小的 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 配置的主机地址替换为该地址,然后一切正常!