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

KServe部署TorchServe模型遇ConnectionResetError问题排查与解决

KServe与模型服务的连接机制

KServe基于Knative Serving和Istio实现模型服务的部署与流量管控,核心流程如下:

  • 外部请求先抵达Istio Ingress Gateway,这是集群的统一流量入口。
  • Istio依据Knative Serving生成的VirtualService和路由规则,将请求转发至对应的Knative Service。
  • Knative Service负责模型Pod的生命周期管理(自动扩缩容、闲置缩容等),并把请求分发到运行中的模型Pod。
  • 模型Pod内的TorchServe必须监听0.0.0.0:8080(KServe默认推理端口),才能接收Knative转发的请求。另外,Istio Sidecar会注入到每个模型Pod中,所有进出Pod的流量都会经过它,负责流量监控、路由和策略执行。
问题排查与解决方案

1. 先验证容器内TorchServe的可用性

首先确认模型服务在Pod内部能正常响应:

  • 进入模型Pod:kubectl exec -it <模型Pod名称> -- bash
  • 在容器内发起本地请求:curl -X POST localhost:8080/predictions/<模型名称> -d @测试图片的JSON文件
    • 如果请求失败,说明TorchServe启动有问题:
      • 检查config.properties里是否设置了inference_address=http://0.0.0.0:8080——要是只监听127.0.0.1,外部根本连不上。
      • 确认Docker启动命令正确,比如:torchserve --start --model-store model_store --models <模型名称>=<模型mar文件> --ts-config config.properties。
      • 查看Pod是否因为内存不足被Kill:kubectl describe pod <Pod名称>,检查Events里有没有OOMKilled记录。

2. 检查InferenceService配置是否正确

  • 确保spec.predictor.torchserve.modelName和TorchServe加载的模型名称完全一致。
  • 确认容器端口配置正确,TorchServe的推理端口是8080,需要在InferenceService里明确指定(如果没写,KServe默认也会用8080,但显式写更稳妥):
    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: table-detector
    spec:
      predictor:
        torchserve:
          modelName: table_det
          storageUri: pvc://model-pvc/model-store
          containers:
          - name: kserve-container
            ports:
            - containerPort: 8080
              protocol: TCP
    

3. 确认Istio与Knative的路由状态

  • 查看Knative Service状态:kubectl get ksvc,确保目标服务的READY状态是True。要是为False,查看事件日志找问题:kubectl describe ksvc <KSvc名称>。
  • 查看Istio VirtualService:kubectl get vs,确认路由规则指向了正确的Knative Service,且路径匹配KServe的推理端点(默认是/v1/models/<模型名称>:predict)。
  • 检查网络策略:如果集群开了网络策略,得允许Istio Sidecar的IP段(一般是集群的Pod CIDR,比如10.244.0.0/16)访问模型Pod的8080端口。

4. 适配TransformerHandler与KServe的请求格式

KServe的推理请求格式是{"instances": [...]}, 但TorchServe默认接收原始数据,得在TransformerHandler里做格式转换:

from ts.torch_handler.base_handler import BaseHandler

class TransformerHandler(BaseHandler):
    def preprocess(self, data):
        # 把KServe的请求格式转成TorchServe能处理的格式
        return [item["data"] for item in data[0]["instances"]]
    
    def postprocess(self, data):
        # 把TorchServe的输出转成KServe的标准格式
        return {"predictions": data}

同时要确保Handler打包成mar文件时,所有依赖都包含在内。

5. 验证外部请求的路径与格式

外部请求必须通过Istio Ingress Gateway发送,正确的请求示例:

curl -X POST http://<Istio网关IP>/v1/models/table-detector:predict \
  -H "Content-Type: application/json" \
  -d '{"instances": [{"data": "<base64编码的图片数据>"}]}'

别直接访问模型Pod的IP——Istio Sidecar会拦截未经过路由的请求,直接访问大概率会出现连接重置。

内容的提问来源于stack exchange,提问作者sairanjith vankayalapati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:57:53