Asjdf

一只在杭电摸鱼的小火鸡

Nginx Ingress & Grpc 端口复用配置

2023-12-08 大约529字 预计阅读2分钟

# 前言

书接上回Caddy & GRPC 端口复用配置,新在集群上部署了一个带端口复用的服务,除了 Caddy 换成了 Nginx 之外,其他还是一样的配方。

看到有些教程给出的解决方案是写两个 Ingress 配置文件,其中一个文件配置nginx.ingress.kubernetes.io/backend-protocol为 GRPC ,不免有些不太优雅了。

# 正文

本专案的具体细节:

层级 软件 / 包
1 Nginx
2 cmux
3 GPRC & Getaway

后端先启动 GPRC 服务,随后 Gateway 连接 GRPC 提供 json 格式的接口,由程序内 cmux 包将流入的流量根据类型进行分流,分别传给 GRPC 和 Gateway,最后由 Nginx 作为 Ingress 根据连接类型进行反向代理。

Ingress 配置:(请自行调整serviceName.namespace.svc.cluster.local为你自己服务的地址,我在这里使用集群内部的 DNS 解析)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-ingress-name
  annotations:
+    nginx.ingress.kubernetes.io/configuration-snippet: |
+      if ($http_content_type ~ "grpc") { grpc_pass grpc://serviceName.namespace.svc.cluster.local:8080; }

Service 配置:(实例,仅为补充说明场景)

apiVersion: v1
kind: Service
metadata:
  name: serviceName
  namespace: namespace
spec:
  ports:
    - port: 8080
      name: http
      protocol: TCP
  selector:
    app: backendName

在 Ingress 的配置文件中,我直接匹配请求头中Content-Type字段的grpc关键字,当命中关键字时,使用 GRPC 反代而不是 HTTP 反代,当然你也可以细化匹配规则,目前我看到的相关的Content-Type有以下几种,欢迎有相关经验的大佬补充:

  • application/grpc
  • application/grpc+proto
  • application/grpc+json
  • application/grpc-web+proto
  • application/grpc-web+json
  • application/grpc-web-text+proto

8小时劳动,8小时休闲,8个小时休息,下班!

闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme