- 人工智能
- 大模型
- MLOps
- LLMOps
- 模型推理服务
- 云原生
- 后端
【免费下载链接】seldon-core
An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models
seldon server status是 Seldon Core 2 命令行工具(CLI)中用于查询单个推理服务器(Server)运行状态的子命令。它以 gRPC 客户端身份连接 Seldon Core 的调度器(Scheduler)控制面,拉取指定 Server 的副本数、已加载模型数量与资源分布等信息。读完本文,你将掌握该命令的完整参数用法、两种输出模式的差异、底层 gRPC 调用链与协议定义,以及如何通过环境变量、配置文件和 TLS 证书在本地与 Kubernetes 集群之间灵活切换连接目标。
一、命令定位:它查询的是什么
在 Seldon Core 2 中,Server是一种描述推理服务器(如 mlserver、triton 等)的资源,由 Operator 的控制器协调 Kubernetes 上的部署。官方示例 mlserver1.yaml 展示了最简形态:
apiVersion: mlops.seldon.io/v1alpha1 kind: Server metadata: name: mlserver1 spec: serverConfig: mlserver从源码结构看,Server 的部署状态并不直接保存在 Server CR 的 status 字段里,而是由 Scheduler 维护并向订阅者广播(参见 server.go 中的ServerNotify与SubscribeServerEvents,Operator 通过StatusUpdate事件把NumLoadedModelReplicas回写到server.Status.LoadedModelReplicas)。因此,seldon server status本质上是让 CLI 作为另一个订阅者(订阅者名称固定为seldon CLI)直接向 Scheduler 请求某个 Server 的实时状态。
命令在 cobra 命令树中的注册位置见 root.go:cmdServer子命令组下挂载了status与list两个子命令(cmdServer.AddCommand(cmdServerStatus, cmdServerList)),对应 seldon server(manage servers)文档页中列出的两个入口。
二、用法与参数说明
根据 CLI 参考文档 seldon_server_status.md,命令形式与参数如下:
seldon server status [flags]| 参数 | 短选项 | 默认值 | 说明 |
|---|---|---|---|
--authority string | — | 空 | HTTP/2 的 authority(即 virtual host),用于 gRPC 连接的 SNI/vhost 路由 |
--help | -h | — | 显示帮助 |
--scheduler-host string | — | 0.0.0.0:9004 | Seldon 调度器(Scheduler)地址 |
--show-request | -r | false | 打印发送给调度器的请求内容 |
--show-response | -o | true | 打印完整的响应内容(proto 转 JSON) |
--verbose | -v | false | 详细输出(在请求打印逻辑中与-r等效) |
需要注意两点细节:
命令要求至少一个位置参数——服务器名称。server_status.go 中
Args: cobra.MinimumNArgs(1)且serverName := args[0],即第一个参数就是目标 Server 名:seldon server status mlserver1--show-request与--verbose在请求打印上是同一条路径:ServerStatus方法内部以showRequest判断是否printProto(req),而verbose在客户端构造时已注入连接层(见 server_status.go 中cli.NewSchedulerClient(schedulerHost, schedulerHostIsSet, authority, verbose))。
三、两种输出模式:摘要行与完整 JSON
这是该命令最有实战价值的一点。在 scheduler.go 的ServerStatus方法中,响应处理逻辑为:
if !showResponse { fmt.Printf("%s loaded models %d available replicas %d\n", res.ServerName, res.NumLoadedModelReplicas, res.AvailableReplicas) } else { printProto(res) }- 默认(
-o):把整个ServerStatusResponse通过protojson.Marshal序列化为 JSON 打印,字段最完整; -o=false:打印一行紧凑摘要,例如mlserver1 loaded models 2 available replicas 2,适合脚本轮询或快速巡检。
printProto的实现(scheduler.go)就是对 proto 消息做protojson编码后输出,序列化失败时打印Failed to print proto: ...而不是报错退出。
四、底层调用链与协议定义
server status的执行路径可以完整拆解为四步,全部有源码可查:
1. 构造 gRPC 客户端。NewSchedulerClient 先加载 CLI 配置文件(LoadSeldonCLIConfig),若用户没有显式传--scheduler-host且配置文件的controlplane.schedulerHost非空,则用配置值覆盖默认 host。客户端同时设置grpc.MaxCallSendMsgSize / MaxCallRecvMsgSize为math.MaxInt32,以允许较大的控制面消息。
2. 建立连接。newConnection 决定传输凭证:若配置中controlplane.keyPath为空则使用insecure.NewCredentials();否则调用loadKeyPair(scheduler.go)加载客户端证书/私钥与 CA,构造 mTLS 的credentials.NewTLS。连接层还挂了grpc_retry指数退避拦截器(起始 100ms)与grpc.WithAuthority(sc.authority),后者正是--authority参数生效的位置。
3. 发起请求。CLI 构造ServerStatusRequest并调用流式 RPCServerStatus,只取第一条消息(getServerStatus):
req := &scheduler.ServerStatusRequest{ SubscriberName: subscriberName, // "seldon CLI" Name: &serverName, }4. 协议层定义。请求/响应消息在 scheduler.proto 中定义,RPC 声明为rpc ServerStatus(ServerStatusRequest) returns (stream ServerStatusResponse)(scheduler.proto):
message ServerStatusRequest { string subscriberName = 1; optional string name = 2; // Leave empty for all servers } message ServerStatusResponse { enum Type { StatusResponseTypeUnknown = 0; StatusUpdate = 1; NonAuthoritativeReplicaInfo = 2; ScalingRequest = 4; } Type type = 7; string serverName = 1; repeated ServerReplicaResources resources = 2; int32 expectedReplicas = 3; int32 availableReplicas = 4; int32 numLoadedModelReplicas = 5; optional KubernetesMeta kubernetesMeta = 6; } message ServerReplicaResources { uint32 replicaIdx = 1; uint64 totalMemoryBytes = 2; uint64 availableMemoryBytes = 3; int32 numLoadedModels = 4; uint32 overCommitPercentage = 5; }从该定义可以读出默认 JSON 输出里各字段的含义:serverName是服务器名;expectedReplicas / availableReplicas分别是期望与可用副本数;numLoadedModelReplicas是已加载模型的副本数;resources是逐副本的资源明细(总内存、可用内存、已加载模型数、超卖比例overCommitPercentage)。注意name字段留空时表示“所有服务器”——这正是姊妹命令seldon server list的做法(ListServers 用同一 RPC 但省略Name,遍历全部流式结果,以表格输出server / replicas / models三列)。
Type枚举的注释也值得注意:值按 2 的幂设计,可以按位或组合,为“同一响应携带多种更新类型”保留了前向兼容空间。
五、连接目标:环境变量、配置文件与 TLS
CLI 连接 Scheduler 的地址解析遵循“显式参数 > 配置文件 > 环境变量 > 默认值”的优先级,规则集中在 flags.go 与 config.go:
| 来源 | 内容 |
|---|---|
| 环境变量 | SELDON_SCHEDULE_HOST(默认值0.0.0.0:9004,即本地安装场景直接可用) |
| 配置文件 | ~/.config/seldon/cli/config.json中controlplane.schedulerHost;另可配tls/keyPath/crtPath/caPath |
| CLI 参数 | --scheduler-host(显式设置后配置文件不再覆盖) |
CLI 总览文档 给出了一份通过 TLS 连接集群内 Scheduler 的配置示例(对应 config.go 的ControlPlane结构):
{ "controlplane": { "schedulerHost": "seldon-scheduler.svc:9044", "tls": true, "keyPath": "/home/certs/seldon-scheduler-client/tls.key", "crtPath": "/home/certs/seldon-scheduler-client/tls.crt", "caPath": "/home/certs/seldon-scheduler-client/ca.crt" } }配置文件的日常管理可用seldon config子命令(list / add / remove / activate / deactivate)完成。在 Kubernetes 上运行该命令时,需要先把 Scheduler Service 暴露为 LoadBalancer 并导出地址:
kubectl get svc seldon-scheduler -n seldon-mesh -o jsonpath='{.status.loadBalancer.ingress[0].ip}' export SELDON_SCHEDULE_HOST=<ip>:9004若使用集群 TLS,仓库提供了 download-k8s-certs.sh 脚本把 K8s secret 中的证书下载到本地目录:
./hack/download-k8s-certs.sh seldon-mesh seldon-scheduler-client六、server status与server list的取舍
同一个ServerStatus流式 RPC 支撑了两个子命令,选择依据是查询范围:
| 场景 | 命令 | 行为 |
|---|---|---|
只看某一个 Server(name指定) | seldon server status <name> | 取流的第一条消息,输出完整 JSON 或一行摘要 |
| 巡检全部 Server | seldon server list | 不传name,遍历流到 EOF,表格输出server / replicas / models |
从 ListServers 的表格实现看,list输出的models列即numLoadedModelReplicas,replicas列即availableReplicas——与status的摘要行字段一一对应,可以互相印证。
七、这些状态数据在 Operator 侧的用途
理解server status的返回值时,把视角切到 Operator 一侧会更清晰。server.go 的SubscribeServerEvents长期订阅同一类ServerStatusResponse流,并按Type分派:
StatusUpdate:把event.NumLoadedModelReplicas写入 Server CR 的server.Status.LoadedModelReplicas并更新 K8s 状态;ScalingRequest:在合法区间(minReplicas~maxReplicas,见 isValidScalingEvent)内把event.ExpectedReplicaspatch 回server.Spec.Replicas,实现调度器驱动的服务器副本伸缩。
也就是说,seldon server status让你看到的,正是 Operator 用来回写 CR 状态和触发伸缩的那份数据本身;当 Server 副本数异常时,用-o=false对比expectedReplicas与availableReplicas,再用默认 JSON 模式检查resources里各副本的availableMemoryBytes与numLoadedModels,可以快速判断是副本起不来还是内存/模型加载问题。
八、快速上手示例
综合以上信息,一条典型排查流程如下(本地安装场景,默认地址直接可用):
# 完整 JSON 状态(默认 -o) seldon server status mlserver1 # 一行摘要,适合脚本轮询 seldon server status mlserver1 -o=false # 查看发送给调度器的 gRPC 请求 seldon server status mlserver1 -r # 指定调度器地址(K8s LoadBalancer 暴露场景) seldon server status mlserver1 --scheduler-host <ip>:9004Kubernetes 场景下若使用 TLS,则通过seldon config add / activate激活包含controlplane证书路径的配置文件(见 CLI 总览文档 的 Config file 一节),命令本身无需再传地址参数。
小结
seldon server status虽然参数简单,但它是观察 Seldon Core 2 控制面状态的直接窗口:请求经 server_status.go 进入 scheduler.go 的 gRPC 客户端,最终落在 scheduler.proto 定义的ServerStatus流式接口上;返回的副本数、已加载模型数与逐副本资源信息,与 Operator 回写 CR、驱动 Server 伸缩所消费的是同一数据源。掌握了它的两种输出模式、地址解析优先级与 TLS 配置方式,就能在本地与集群环境中对推理服务器做可脚本化的状态巡检。
- 人工智能
- 大模型
- MLOps
- LLMOps
- 模型推理服务
- 云原生
- 后端
【免费下载链接】seldon-core
An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models
相关推荐
Seldon Core v2 `seldon pipeline status` 命令详解:查询与等待 Pipeline 运行状态
Seldon Core v2 seldon pipeline status 命令详解:查询与等待 Pipeline 运行状态 本篇技术指南围绕 Seldon C
人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 2 CLI 之 `seldon server` 命令实战:服务器列表查询与状态诊断
Seldon Core 2 CLI 之 seldon server 命令实战:服务器列表查询与状态诊断 本篇技术指南聚焦 Seldon Core 2 官方 CL
人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 2 CLI 实战:使用 `seldon experiment status` 查询与等待实验(Experiment)状态
Seldon Core 2 CLI 实战:使用 seldon experiment status 查询与等待实验(Experiment)状态 本文聚焦 Seld
人工智能大模型MLOpsLLMOps模型推理服务云原生后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考