如何在AKS中正确运行gRPC服务?解决HTTP/1.x请求发往HTTP/2端点错误
问题分析与解决方案
核心问题点
- 端口监听配置冲突:Deployment中
ASPNETCORE_URLS设置为http://+,会覆盖代码内的端口配置,导致容器3042端口实际无服务监听;同时未明确配置Kestrel支持HTTP/2,gRPC服务无法兼容HTTP/1.x请求。 - YAML格式错误:Deployment的
template.metadata.labels缩进不正确,可能导致Pod标签失效,Service无法正确关联Pod。 - Postman测试配置缺失:未启用HTTP/2明文传输支持,请求无法正常到达gRPC端点。
具体修复步骤
1. 修正Deployment配置
修复YAML缩进错误,并添加Kestrel HTTP/2专属配置:
apiVersion: apps/v1 kind: Deployment metadata: name: accountqueries-api namespace: admin-backend spec: replicas: 1 selector: matchLabels: app: accountqueries-api template: metadata: labels: app: accountqueries-api spec: containers: - name: accountqueries-api image: 824/accountqueriesapi:8 ports: - containerPort: 3042 - containerPort: 80 env: - name: ASPNETCORE_ENVIRONMENT value: "Development" # 拆分端口协议:80端口用于HTTP/1(普通API),3042端口仅支持HTTP/2(gRPC) - name: ASPNETCORE_Kestrel__Endpoints__Http__Url value: "http://+:80" - name: ASPNETCORE_Kestrel__Endpoints__Http__Protocols value: "Http1" - name: ASPNETCORE_Kestrel__Endpoints__Grpc__Url value: "http://+:3042" - name: ASPNETCORE_Kestrel__Endpoints__Grpc__Protocols value: "Http2"
2. 确认Service配置(无需修改,仅验证)
你的Service配置已正确映射gRPC和HTTP端口,只需确保selector与Pod标签完全一致即可:
apiVersion: v1 kind: Service metadata: name: accountqueries-api namespace: admin-backend spec: selector: app: accountqueries-api ports: - name: grpc protocol: TCP port: 3042 targetPort: 3042 - name: http protocol: TCP port: 80 targetPort: 80 type: ClusterIP
3. 应用配置并验证Pod状态
# 应用更新后的Deployment kubectl apply -f Deployment.yaml -n admin-backend # 查看Pod是否正常运行 kubectl get pods -n admin-backend # 查看Pod日志确认服务启动成功 kubectl logs accountqueries-api-<pod-id> -n admin-backend
测试gRPC服务
方式1:使用kubectl port-forward + grpcurl
# 转发Pod的3042端口到本地 kubectl port-forward pod/accountqueries-api-<pod-id> 3042:3042 -n admin-backend # 用grpcurl列出服务(需提前安装grpcurl) grpcurl -plaintext localhost:3042 list
方式2:Postman测试
- 将你的
.proto文件导入Postman - 创建gRPC请求,设置地址为
localhost:3042 - 进入请求Settings标签,找到HTTP/2配置,勾选
Allow HTTP/2 without TLS - 配置好认证信息后发送请求
生产环境暴露gRPC服务(可选)
如果要在生产环境对外暴露gRPC服务,建议使用NGINX Ingress:
- 配置Ingress支持HTTP/2协议
- 绑定TLS证书,确保gRPC服务通过HTTPS提供(gRPC官方推荐生产环境强制使用TLS)
内容的提问来源于stack exchange,提问作者Bhanu Prakash
相关产品推荐
相关产品推荐

