
模型推理服务云原生后端微服务MLOps人工智能【免费下载链接】kserveStandardized Distributed Generative and Predictive AI Inference Platform for Scalable, Multi-Framework Deployment on Kubernetes项目地址https://gitcode.com/gh_mirrors/ks/kserve点击查看免费下载本文围绕 KServe v1beta1 API 中的V1beta1RolloutSpec模型展开系统讲解它在推理服务滚动发布RollingUpdate中所扮演的角色两个核心字段maxSurge、maxUnavailable如何决定模型版本更新时 Pod 的增减节奏如何在inferenceservice-configConfigMap 中配置全局默认回滚策略以及如何通过InferenceService的deploymentStrategy按服务覆盖。读完本文你将能够独立配置零停机Availability或资源节省ResourceAware两种发布模式并理解 KServe 控制器从 ConfigMap 解析到 Deployment 落地的完整链路。V1beta1RolloutSpec 是什么V1beta1RolloutSpec是 KServe 中用于描述部署回滚/发布策略的模型其官方定义为 RolloutSpec defines the rollout strategy configuration using Kubernetes deployment strategy即直接复用 Kubernetes Deployment 的原生发布策略语义而不是另起一套抽象。在 KServe 的 v1beta1 体系中V1beta1RolloutSpec处于如下嵌套关系的最底层DeployConfigConfigMap deploy 键 └── DeploymentRolloutStrategy └── defaultRollout: V1beta1RolloutSpec ├── maxSurge └── maxUnavailable对应到 Go 侧源码pkg/apis/serving/v1beta1/configmap.goDeployConfig包含DefaultDeploymentMode与DeploymentRolloutStrategy两个字段DeploymentRolloutStrategy仅有一个可选字段DefaultRollout *RolloutSpecRolloutSpec由MaxSurge、MaxUnavailable两个字符串字段组成。字段详解maxSurge 与 maxUnavailable依据 python/kserve/docs/V1beta1RolloutSpec.md 及 pkg/openapi/swagger.jsonV1beta1RolloutSpec的属性定义如下字段类型说明默认值maxSurgestr允许在期望副本数之上额外创建的最大 Pod 数量用于加速滚动更新。可以是绝对数如5也可以是期望 Pod 数的百分比如10%maxUnavailablestr更新期间允许处于不可用状态的最大 Pod 数量。可以是绝对数如5也可以是期望 Pod 数的百分比如10%maxSurge决定先扩容多少maxSurge控制的是滚动更新向上的余量允许超出期望副本数临时创建多少个新 Pod。典型取值绝对数1、2、5百分比10%、25%、100%。在 Swagger 定义中maxSurge与maxUnavailable都被标记为required说明完整配置一份 RolloutSpec 时两者都应显式给出而default值均为空字符串表示未配置这一状态。KServe 控制器只有在字段非空时才会覆盖 Deployment 的对应配置见下文源码分析。maxUnavailable决定允许多少不可用maxUnavailable控制滚动更新向下的收缩更新过程中最多允许多少个旧 Pod 同时处于不可用状态直接决定了发布期间服务可用容量被削弱的程度。将两个字段组合使用可以构造出两种截然不同的发布行为发布模式maxSurgemaxUnavailable效果Availability零停机优先1或100%0先建新 Pod、再销毁旧 Pod更新期间容量始终 ≥ 期望值请求几乎无中断ResourceAware资源节省优先01或25%先销毁旧 Pod、再建新 Pod峰值资源占用最小但会短暂损失部分容量这两种模式的完整说明与示例见 docs/apis/v1beta1/ROLLOUT_STRATEGY_API.md下文会给出可直接复制的 YAML。在 KServe 中配置 RolloutSpec 的三条路径V1beta1RolloutSpec本身不直接出现在InferenceService的 spec 中它通过ConfigMap 全局默认值这一条路径生效而按服务级别的覆盖则走 Kubernetes 原生的deploymentStrategy字段。整体优先级从高到低多节点multinode自动覆盖对带RAY_NODE_COUNT环境变量的 Ray 多节点工作负载KServe 强制覆盖为maxUnavailable: 0%、maxSurge: 100%以保证旧 Pod 存活到新 Pod 就绪用户自定义deploymentStrategyInferenceService组件扩展中显式指定的策略最高用户优先级ConfigMap 回滚策略仅当defaultDeploymentMode为Standard时作为回退生效KServe 内置默认值maxUnavailable: 25%、maxSurge: 25%。路径一通过 ConfigMap 配置全局默认 RolloutSpec编辑 KServe 命名空间下的inferenceservice-configConfigMap在其deploy键中写入 JSON。参照 config/configmap/inferenceservice.yaml 中给出的完整示例apiVersion: v1 kind: ConfigMap metadata: name: inferenceservice-config namespace: kserve data: deploy: |- { defaultDeploymentMode: Standard, deploymentRolloutStrategy: { defaultRollout: { maxSurge: 1, maxUnavailable: 1 } } }配置要点defaultDeploymentMode必须为Standard即 RawDeployment 的演进形态ConfigMap 回滚策略才会被应用Serverless或Knative模式下该配置会被忽略defaultRollout即V1beta1RolloutSpecmaxSurge、maxUnavailable的取值格式与 Kubernetes Deployment 完全一致想要零停机发布可改配为maxUnavailable: 0, maxSurge: 1Availability 模式想要资源节省可改配为maxSurge: 0, maxUnavailable: 1ResourceAware 模式。路径二通过 deploymentStrategy 按服务覆盖KServe 的ComponentExtensionSpec暴露了原生 Kubernetes 字段DeploymentStrategy *appsv1.DeploymentStrategy定义见 pkg/apis/serving/v1beta1/component.go它直接接管生成 Deployment 的spec.strategy优先级高于 ConfigMap 默认值。注意其校验规则deploymentStrategy仅支持 Raw/Standard 部署模式Serverless 模式会报错见 pkg/apis/serving/v1beta1/inference_service_validation.go。Availability 模式示例零停机apiVersion: serving.kserve.io/v1beta1 kind: InferenceService metadata: name: availability-mode-example annotations: serving.kserve.io/deploymentMode: Standard spec: predictor: model: modelFormat: name: sklearn storageUri: s3://my-bucket/model deploymentStrategy: type: RollingUpdate rollingUpdate: maxUnavailable: 0 # 零停机不允许旧 Pod 提前不可用 maxSurge: 1 # 先额外拉起一个新 PodResourceAware 模式示例资源节省apiVersion: serving.kserve.io/v1beta1 kind: InferenceService metadata: name: resource-aware-example annotations: serving.kserve.io/deploymentMode: Standard spec: predictor: model: modelFormat: name: sklearn storageUri: s3://my-bucket/model deploymentStrategy: type: RollingUpdate rollingUpdate: maxSurge: 0 # 不额外占用资源 maxUnavailable: 1 # 允许一次少一个 Pod路径三多节点工作负载的自动覆盖从 pkg/controller/v1beta1/inferenceservice/reconcilers/deployment/deployment_reconciler.go 可以看到对于多节点Ray 工作负载的 worker DeploymentKServe 会无条件将maxUnavailable覆盖为0%、maxSurge覆盖为100%注释明确说明这是为了保证旧 Pod 保留到新 Pod 就绪。该覆盖优先于用户自定义策略与 ConfigMap 配置属于发布安全兜底。源码级原理控制器如何消费 RolloutSpec理解了三条配置路径后再看 KServe 控制器侧的落地逻辑。核心函数是createRawDefaultDeployment与applyRolloutStrategyFromConfigmapdeployment_reconciler.go 与 L407-L438处理流程为若componentExt.DeploymentStrategy ! nil直接使用用户指定的策略最高优先级否则调用setDefaultDeploymentSpec写入 KServe 默认值RollingUpdate类型 maxUnavailable: 25%、maxSurge: 25%外加revisionHistoryLimit: 10、progressDeadlineSeconds: 600见 L387-L405再调用applyRolloutStrategyFromConfigmap做 ConfigMap 覆盖其关键逻辑只有deployConfig.DefaultDeploymentMode Standard时才继续只有deploymentRolloutStrategy.defaultRollout存在时才继续若rollout.MaxSurge/rollout.MaxUnavailable非空则将其作为字符串类型的IntOrString写入spec.Strategy.RollingUpdate若 ConfigMap 只配置了其中一个字段另一个保持步骤 2 的默认值不变。也就是说V1beta1RolloutSpec最终被翻译为原生appsv1.RollingUpdateDeployment.MaxSurge / MaxUnavailableintstr.IntOrString由 Kubernetes Deployment 控制器执行真正的滚动发布——KServe 只负责策略下发发布行为本身完全遵循 K8s 原生语义。上述优先级与默认值行为均有单元测试覆盖见 deployment_reconciler_test.goApply rollout strategy with RawDeployment modeConfigMap 配置maxSurge: 1、maxUnavailable: 1时Deployment 的RollingUpdate精确落到1No rollout strategy applied for Serverless modedefaultDeploymentMode: Serverless时即使配置了50%/25%也不生效回落为默认25%/25%No rollout strategy configureddeployConfig为 nil 时同样回落默认值。另一个测试TestCreateRawDeploymentWithPrecedenceL1535 起则验证了用户 deploymentStrategy 优先于 ConfigMap这一优先级规则。Python SDK 中的 V1beta1RolloutSpecKServe Python SDK 提供了与 Go 侧一一对应的客户端模型由 OpenAPI Generator 生成源码见 python/kserve/kserve/models/v1beta1_rollout_spec.py类名V1beta1RolloutSpec构造参数max_surge、max_unavailable均要求非None默认openapi_types将 Python 属性映射到字符串类型attribute_map将 snake_case 属性映射为 JSON 键maxSurge/maxUnavailable提供to_dict()/to_str()等序列化方法便于在客户端代码中构造或回读配置。其上层模型V1beta1DeploymentRolloutStrategypython/kserve/kserve/models/v1beta1_deployment_rollout_strategy.py仅有可选字段default_rollout类型为V1beta1RolloutSpec对应 Go 侧DeploymentRolloutStrategy.DefaultRollout。SDK 侧的单元测试见 python/kserve/test/test_v1beta1_rollout_spec.py 与 python/kserve/test/test_v1beta1_deployment_rollout_strategy.py测试样例覆盖了必填最小实例max_surge0、max_unavailable1与完整实例max_surge1、max_unavailable1两种构造方式。Python 侧构造示例from kserve.models.v1beta1_rollout_spec import V1beta1RolloutSpec from kserve.models.v1beta1_deployment_rollout_strategy import V1beta1DeploymentRolloutStrategy # 零停机Availability模式 rollout V1beta1RolloutSpec(max_surge1, max_unavailable0) strategy V1beta1DeploymentRolloutStrategy(default_rolloutrollout) print(strategy.to_dict()) # {default_rollout: {max_surge: 1, max_unavailable: 0}}注意max_unavailable0是 Availability 模式的关键旧 Pod 不允许提前不可用max_surge0则是 ResourceAware 模式的关键不额外扩容。校验规则与取值规范依据 docs/apis/v1beta1/ROLLOUT_STRATEGY_API.md 的 Validation Rules 章节ConfigMap 配置maxSurge必须是合法的数字或百分比字符串——合法百分比如25%、50%、100%合法数字如1、2、5maxUnavailable格式要求相同deploymentStrategy 配置type必须为RollingUpdaterollingUpdate.maxSurge、rollingUpdate.maxUnavailable与 ConfigMap 路径共用同一套格式校验Serverless 限制自定义deploymentStrategy仅限 Raw/Standard 部署模式在 KPAKnative场景会被校验拒绝。从源码看Go 侧RolloutSpec字段本身是string类型未在结构体层面做格式强校验格式合法性最终由 Kubernetes apiserver 对生成的 Deployment 进行校验兜底这一点从applyRolloutStrategyFromConfigmap直接以StrVal形式写入IntOrString可以印证deployment_reconciler.go#L432-L437。总结RolloutSpec 的取值速查场景maxSurgemaxUnavailable说明未配置任何策略KServe 默认25%25%由setDefaultDeploymentSpec写入Availability零停机1/100%0先建后删容量不下降ResourceAware资源节省01/25%先删后建峰值资源最小多节点 Ray 工作负载100%0%控制器强制覆盖优先级最高用户 deploymentStrategy自定义自定义优先级高于 ConfigMap 默认值ConfigMap defaultRollout自定义自定义仅Standard模式生效V1beta1RolloutSpec的价值在于它把 Kubernetes 原生的滚动发布能力接入 KServe 的配置体系让运维团队既能通过inferenceservice-config全局统一发布策略也能为单个InferenceService精细化定制发布节奏且全程无需修改 KServe 控制器代码。理解maxSurge/maxUnavailable的语义与优先级是做好模型服务无感升级与资源调度的基础。赞分享模型推理服务云原生后端微服务MLOps人工智能【免费下载链接】kserveStandardized Distributed Generative and Predictive AI Inference Platform for Scalable, Multi-Framework Deployment on Kubernetes项目地址https://gitcode.com/gh_mirrors/ks/kserve点击查看免费下载相关推荐Kubernetes Python客户端滚动更新终极指南掌握maxUnavailable与maxSurge配置技巧Kubernetes Python客户端滚动更新终极指南掌握maxUnavailable与maxSurge配置技巧 想要实现Kubernetes应用的无缝滚动后端云原生容器编排UI-Router视图滚动控制viewScroll服务深度解析UI Router视图滚动控制viewScroll服务深度解析 你是否遇到过页面切换后内容定位混乱的问题在单页应用Single Page Applicat前端路由KServe 滚动发布实战指南基于 Canary 策略的 InferenceService 流量灰度与回滚KServe 滚动发布实战指南基于 Canary 策略的 InferenceService 流量灰度与回滚 本文围绕 KServe v1beta1 API 的模型推理服务云原生后端微服务MLOps人工智能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考