kubernetes - 如何配置 Helm chart 的 Ingress 文件来部署 gRPC 服务?

标签 kubernetes kubernetes-helm

我想将 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

ingress.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"

According to this snippet from the official Kubernetes nginx ingress documentation:

Backend Protocol

Using backend-protocol annotations is possible to indicate how NGINX should communicate with the backend service. (Replaces secure-backends in older versions) Valid Values: HTTP, HTTPS, GRPC, GRPCS and AJP

By default NGINX uses HTTP.

Example:

nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"

顺便说一句,您可能需要指定 GRPCS 而不是 GRPC,因为看起来您正在使用 SSL。

另一件需要指出的事情是,文档提到此注解取代了旧版本中的“secure-backends”,这可能是您找到当前正在使用的 grpc-backend 注解的地方。

关于kubernetes - 如何配置 Helm chart 的 Ingress 文件来部署 gRPC 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518809/

相关文章:

kubernetes - 在 kubernetes cronjob 中指定角色

amazon-web-services - 如何查看配置文件和真实资源之间的差异

Kubernetes Helm PVC

amazon-web-services - Kubernetes Pod 因无效卷区域不匹配而失败

kubernetes - 无法使用 k8ssandra 部署 Cassandra

kubernetes - 我们可以从 worker/minion 节点运行 kubectl 吗?

kubernetes - Helm 图表失败并显示所需值

go-templates - 如何在 helm 模板中使用带有 .Values 的变量

kubernetes-helm - Kubernetes ingress 如何设置 default-ssl-certificate?

nginx ingress Jenkins 路径重写配置不起作用