使用NGINX Ingress Controller为gRPC应用启用TLS透传遇错求助
问题解决:gRPC TLS透传时出现
tls: unrecognized name错误 错误原因
这个错误是TLS握手阶段SNI(Server Name Indication)不匹配或传递异常导致的。结合你的配置和测试情况,核心问题出在Ingress资源配置不当,以及NGINX Ingress Controller可能未启用SSL透传功能。
解决方案
1. 修正Ingress资源配置
当前配置存在重复注解、冗余TLS配置的问题,调整后的配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: lh-server namespace: default annotations: # 仅保留NGINX Ingress专属的SSL透传注解 nginx.ingress.kubernetes.io/ssl-passthrough: "true" # 指定后端为gRPC协议(若后端是HTTPS也可设为HTTPS,但gRPC更精准) nginx.ingress.kubernetes.io/backend-protocol: GRPC spec: ingressClassName: nginx rules: - host: lh.demo.littlehorse.cloud http: paths: - backend: service: name: lh-server port: number: 5000 path: / pathType: Prefix
- 移除了重复的
ingress.kubernetes.io/ssl-passthrough注解(旧版注解已被NGINX专属注解替代) - 删除了
spec.tls块:SSL透传模式下,NGINX不处理证书,完全由后端服务接管,无需在此配置证书信息
2. 确保NGINX Ingress Controller启用SSL透传功能
SSL透传默认是禁用的,需要在控制器启动参数中开启:
- 编辑控制器的Deployment(假设控制器部署在
ingress-nginx命名空间):
kubectl edit deployment nginx-ingress-controller -n ingress-nginx
- 在容器的
args列表中添加--enable-ssl-passthrough:
containers: - name: controller args: - /nginx-ingress-controller - --enable-ssl-passthrough # 其他原有参数...
- 保存退出后,控制器会自动重启,使配置生效。
3. 验证客户端访问逻辑
确保客户端访问时正确传递SNI信息,比如使用grpcurl测试:
grpcurl -v -cacert ./client-ca.crt lh.demo.littlehorse.cloud:443 your.grpc.package.Service/Method
- 必须指定目标主机名
lh.demo.littlehorse.cloud,否则SNI不匹配会触发同样错误
内容的提问来源于stack exchange,提问作者cmcnealy
相关产品推荐
相关产品推荐

