kubernetes - 如何配置 Helm Chart 的 Ingress 文件来部署 gRPC 服务?
问题描述
我想将 gRPC 服务部署到 Azure Kubernetes 服务。我已经使用 Helm 图表部署了 RESTful 服务,但 gRPC 服务抛出“连接超时”错误。
我已经尝试了 NGINX 和 HELM 文档中所说的所有内容,但没有任何效果。证书是自签名的。我已经尝试了注释的所有排列和组合:p
服务.yaml
apiVersion: v1
kind: Service
metadata:
name: {{ template "fullname" . }}
labels:
app: {{ template "fullname" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: "{{ .Release.Name }}"
heritage: "{{ .Release.Service }}"
spec:
ports:
- port: 50051
protocol: TCP
targetPort: 50051
name: grpc
selector:
app: {{ template "fullname" . }}
type: NodePort
入口.yaml
{{ if .Values.ingress.enabled }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ template "fullname" . }}
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/grpc-backend: "true"
nginx.org/grpc-services: {{ template "fullname" . }}
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
secretName: aks-ingress-tls
rules:
- http:
proto: h2
paths:
- backend:
serviceName: {{ template "fullname" . }}
servicePort: grpc
proto: h2
path: /{servicename}-grpc(/|$)(.*)
{{ end }}
也试过了——还是不行——
{{ if .Values.ingress.enabled }}
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ template "fullname" . }}
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
tls:
- secretName: aks-ingress-tls
rules:
- http:
paths:
- backend:
serviceName: {{ template "fullname" . }}
servicePort: 50051
path: /servicename-grpc(/|$)(.*)
{{ end }}
解决方案
看起来您在入口处缺少注释。
ingress.yaml - 片段
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
# This annotation matters!
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
根据官方 Kubernetes nginx 入口文档中的这段代码:
后端协议
使用 backend-protocol annotations 可以指示 NGINX 应该如何与后端服务通信。(替换旧版本中的安全后端)有效值:HTTP、HTTPS、GRPC、GRPCS 和 AJP
默认情况下,NGINX 使用 HTTP。
例子:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
顺便说一句,您可能需要指定GRPCS
而不是GRPC
因为看起来您正在使用 SSL。
需要指出的另一件事是文档提到此注释替换旧版本中的“安全后端”,这可能是您找到grpc-backend
当前正在使用的注释的地方。
推荐阅读
- javascript - Javascript 不会绘制从 HTML 输入元素中获取值的动画
- javascript - 脚本未在 Internet Explorer 上运行
- python - 在修复错误 ResolvePackageNotFound 时遇到问题:
- python - Ruby 和 Python 之间的 ZeroMQ PAIR/PAIR 连接
- python - IndexError:索引 4 超出轴 1 的范围,大小为 4
- excel - VBA 不能通过函数调用直接保持变量值
- java - Set 的 isEmpty 方法有什么更快的替代方法吗?
- sql - 仅当列为空时插入值
- c# - 从 OpenEXR 图像文件(球形全景深度图)转换导致几何变换失败
- openlayers - 在客户端的 openlayers 中更新特征位置和方向的最佳方法是什么?