【发布时间】:2021-10-05 02:13:13
【问题描述】:
我有一个应用程序部署到 kubernetes (AKS),我在其中混合了 gRPC 和 http 服务。我最初将新 gRPC 服务的路由添加到以前仅提供 http 服务的现有入口。这不起作用并深入研究,我读到我们需要添加 nginx.ingress.kubernetes.io/backend-protocol: GRPC 注释,并且它适用于所有路由,因此我们需要两个单独的入口。我目前正在尝试使用消息nodename nor servname provided, or not known 连接到 gRPC 服务时遇到异常io.grpc.internal.ManagedChannelImpl$NameResolverListener 错误。我猜想虽然当 Ingress 中的多个路径与请求匹配时,最长的匹配路径优先,这不适用于两个入口。所以我需要使用不同的主机,或者更改/* 路径,使其不匹配/results?或者我的配置中还有其他需要更改的地方吗?
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts:
- {{ .Values.ingress.hosts.host }}
secretName: {{ .Values.ingress.tls.secretName }}
rules:
- host: {{ .Values.ingress.hosts.host }}
http:
paths:
- path: /graphql
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-{{ .Values.services.graphqlServer.host }}
port:
number: 80
- path: /graphql/*
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-{{ .Values.services.graphqlServer.host }}
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-{{ .Values.services.webUIServer.host }}
port:
number: 80
- path: /*
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-{{ .Values.services.webUIServer.host }}
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-grpc
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/backend-protocol: GRPC
nginx.ingress.kubernetes.io/ssl-redirect: "true"
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts:
- {{ .Values.ingress.hosts.host }}
secretName: {{ .Values.ingress.tls.secretName }}
rules:
- host: {{ .Values.ingress.hosts.host }}
http:
paths:
- path: /results
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-{{ .Values.services.externalResults.host }}
port:
number: 9000
【问题讨论】:
标签: nginx kubernetes grpc kubernetes-ingress nginx-ingress