一条路径的 kubernetes nginx ingress GRPC

kubernetes nginx ingress GRPC for one path

我正在尝试设置 nginx kubernetes ingress。我现在可以在不同的路由上提供 http 和 websockets 内容。

但是我无法在同一主机上添加 GRPC 路由。添加此注释 nginx.ingress.kubernetes.io/backend-protocol: "GRPC" 会破坏现有路由。

我的 java GRPC 客户端退出 Caused by: io.grpc.netty.shaded.io.netty.handler.codec.http2.Http2Exception: First received frame was not SETTINGS. Hex dump for first 5 bytes: 485454502f 根据 https://github.com/grpc/grpc-java/issues/2905 这意味着请求被视为 HTTP

有没有办法使用 nginx kubernetes ingress 在同一主机上设置 http/websocket/grpc 路由?或者,是否有另一个入口可以使用它?

由于您希望注释 nginx.ingress.kubernetes.io/backend-protocol: "GRPC" 仅应用于主机的某些路由,因此您可以声明两个 Ingress 定义。第一个用于所有 HTTP 路由,第二个用于 GRPC 路由。

Nginx Ingress Controller 将选择所有 Ingress 定义(具有预期的 IngressClass)并将使用它们来组成 nginx.conf。这种行为非常适合具有需要在注释中进行不同调整的路径,例如重写目标,或者在您的情况下,不同的后端协议。

特别是来自 Nginx 控制器文档:

Multiple Ingresses can define different annotations. These definitions are not shared between Ingresses.

您可以在文档中查看用于构建 nginx.conf 的所有步骤:https://kubernetes.github.io/ingress-nginx/how-it-works/#building-the-nginx-model