You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AKS中正确运行gRPC服务?解决HTTP/1.x请求发往HTTP/2端点错误

问题分析与解决方案

核心问题点

  1. 端口监听配置冲突:Deployment中ASPNETCORE_URLS设置为http://+,会覆盖代码内的端口配置,导致容器3042端口实际无服务监听;同时未明确配置Kestrel支持HTTP/2,gRPC服务无法兼容HTTP/1.x请求。
  2. YAML格式错误:Deployment的template.metadata.labels缩进不正确,可能导致Pod标签失效,Service无法正确关联Pod。
  3. 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测试

  1. 将你的.proto文件导入Postman
  2. 创建gRPC请求,设置地址为localhost:3042
  3. 进入请求Settings标签,找到HTTP/2配置,勾选Allow HTTP/2 without TLS
  4. 配置好认证信息后发送请求

生产环境暴露gRPC服务(可选)

如果要在生产环境对外暴露gRPC服务,建议使用NGINX Ingress:

  • 配置Ingress支持HTTP/2协议
  • 绑定TLS证书,确保gRPC服务通过HTTPS提供(gRPC官方推荐生产环境强制使用TLS)

内容的提问来源于stack exchange,提问作者Bhanu Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:04:59