AWS NLB实现gRPC流量TLS终止遇阻,求可行配置示例
AWS NLB 终止gRPC TLS的最小可行实现方案
关键配置要点(解决Received RST_STREAM with error code 1核心原因)
你的错误大概率是ALPN策略未正确配置导致的——gRPC依赖HTTP/2,若NLB和客户端协商出HTTP/1.1,就会触发流重置。必须满足以下条件:
- 启用NLB的ALPN策略为
HTTP2Preferred或HTTP2Only - 使用支持TLS 1.2+的SSL策略(推荐TLS 1.3兼容版本)
- 后端服务监听HTTP/2(NLB终止TLS后会以HTTP/2转发流量)
- 使用同区域AWS ACM的有效证书
最小可行示例(基于AWS Load Balancer Controller)
1. 前提准备
- EKS集群已部署AWS Load Balancer Controller(版本≥v2.4)
- AWS ACM中存在与NLB访问域名匹配的有效证书(需与NLB同区域)
2. gRPC后端Deployment示例
apiVersion: apps/v1 kind: Deployment metadata: name: grpc-server spec: replicas: 1 selector: matchLabels: app: grpc-server template: metadata: labels: app: grpc-server spec: containers: - name: grpc-server image: docker.io/grpc/java-example-hostname:latest # 官方gRPC测试镜像 ports: - containerPort: 50051 name: grpc protocol: TCP
3. NLB TLS终止Service示例
apiVersion: v1 kind: Service metadata: name: grpc-nlb-service annotations: # 指定使用NLB service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip # 配置ACM证书ARN(替换为你的证书ARN) service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:123456789012:certificate/abcdef-1234-5678-90ab-cdef12345678" # 核心:配置ALPN策略 service.beta.kubernetes.io/aws-load-balancer-alpn-policy: "HTTP2Preferred" # 配置SSL协商策略(TLS1.3兼容版本) service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS13-1-2-2021-06" # 指定后端协议为HTTP2 service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http2 # 监听端口映射 service.beta.kubernetes.io/aws-load-balancer-ports: "443" spec: type: LoadBalancer ports: - port: 443 targetPort: 50051 protocol: TCP name: https selector: app: grpc-server
4. 验证与测试
- 获取NLB访问地址:
kubectl get service grpc-nlb-service,复制EXTERNAL-IP对应的域名 - 控制台验证:进入AWS EC2控制台,确认NLB监听器的ALPN策略、SSL策略配置正确
- 客户端测试(使用grpcurl):
grpcurl -d '{"name": "test"}' grpc-nlb.example.com:443 helloworld.Greeter/SayHello
常见问题排查
- 若仍触发RST_STREAM:检查后端Pod是否真的监听HTTP/2,可执行
curl -v --http2-prior-knowledge http://<pod-ip>:50051验证 - 证书问题:确保ACM证书域名与NLB访问域名完全匹配,且证书已完成域名验证
- 安全组:NLB安全组开放443端口给客户端,后端节点安全组开放50051端口给NLB的IP范围
内容的提问来源于stack exchange,提问作者Sezi
相关产品推荐
相关产品推荐

