news 2026/9/18 6:39:46

ZenML Deployers 实战指南:将 Pipeline 部署为可实时调用的 HTTP 服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ZenML Deployers 实战指南:将 Pipeline 部署为可实时调用的 HTTP 服务

ZenML Deployers 实战指南:将 Pipeline 部署为可实时调用的 HTTP 服务

【免费下载链接】zenmlZenML 🙏: One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml

本文以 ZenML 的 Deployer 栈组件(Stack Component)为核心,系统讲解如何将 ZenML 流水线部署为长期运行的容器化 HTTP 服务,实现请求-响应(Request-Response)模式的实时执行。你将掌握 Deployer 的适用场景与六种 Flavor 选型、通过 CLI 与 SDK 完成部署/调用/生命周期管理的完整操作流程、可部署 Pipeline 的编写约束,以及本地、Docker、Kubernetes、GCP Cloud Run、AWS App Runner、Hugging Face Spaces 六种部署目标的配置细节与资源/扩缩容设置。文中所有命令与配置均以当前仓库源码为据,可直接复制运行。

什么是 Deployer:从批处理到实时服务

在 ZenML 中,流水线(Pipeline)默认由 Orchestrator 按计划或批量方式执行。而Pipeline Deployment(流水线部署)则是把流水线变成长期运行的 HTTP 服务:它通过 Deployer 这一栈组件,将流水线打包成暴露 REST API 的容器化服务。

部署后的流水线成为一个可以被并发多次调用的 Web 服务:外部请求通过 HTTP 携带参数进入,流水线执行完成后以 JSON 形式返回输出。这为实时推理、交互式工作流、Web 应用集成以及响应外部事件触发执行的 AI Agent 系统提供了基础能力。

从源码看,Deployer 的职责在 base_deployer.py 中定义得非常清晰,它承担三件事:

  1. 持有栈相关配置:与远端部署平台交互所需的 hostname、URL、凭证引用、客户端配置等;
  2. 实现部署生命周期管理:包括发现、创建、删除、更新(LCM);
  3. 充当部署注册中心:每次流水线部署都会作为数据库实体(Deployment)通过 ZenML Client 持久化,便于追踪和管理所有外部运行中的部署实例。

也就是说,Deployer 不仅仅是"把流水线跑起来",它还负责把每个部署的状态、URL、连接信息记录到 ZenML 数据库中,这正是后面zenml deployment list/describe等管理命令的数据来源。

什么时候应该使用 Deployer?

Deployer 是 ZenML Stack 中的可选组件,它与 Orchestrator 是互补关系:

场景选择
按计划/批量/长时间运行的批处理工作流Orchestrator
需要即时响应的请求-响应模式Deployer

具体而言,Deployer 适用于以下场景:

  • 实时流水线执行:通过 HTTP 请求按需执行流水线,而非定时批处理;
  • 交互式工作流:构建需要立即获得流水线响应的应用;
  • API 集成:将 ML 工作流以 REST API 形式暴露给 Web 应用或微服务;
  • 实时推理:通过流水化推理工作流对外提供模型服务;
  • Agent 系统:创建响应外部事件、执行流水线的 AI Agent。

部署后的服务形态

从 utils.py 的invoke_deployment实现可以看到服务的调用语义:默认情况下,调用会阻塞等待流水线运行结束并返回输出;也可以通过submit=True(CLI 对应--no-wait)提交后台执行并立即返回 run ID。调用前会校验部署状态必须为RUNNING且具有可访问的 URL,否则抛出DeploymentProvisionError——这解释了为什么部署完成后需要等待服务就绪。

Deployer Flavors 总览

ZenML 开箱即用自带localDeployer(已包含在默认 Stack 中),其余 Flavor 由集成(Integration)提供:

DeployerFlavor集成说明
Locallocal内置默认 Deployer,以后台进程方式部署到本地机器,仅建议本地使用 ZenML 时使用
Dockerdocker内置以本地 Docker 容器方式部署流水线
Kuberneteskuberneteskubernetes部署到任意 Kubernetes 集群,对资源、网络、扩缩容有完全控制
GCP Cloud Rungcpgcp部署到 Google Cloud Run,Serverless 执行
AWS App Runnerawsaws部署到 AWS App Runner,Serverless 执行
Hugging Facehuggingfacehuggingface以 Docker Space 形式部署到 Hugging Face Spaces

查看当前环境所有可用的 Deployer Flavor:

zenml deployer flavor list

各类 Deployer 的关键差异

  • Local Deployer:无需任何云基础设施,零配置即可使用,适合入门、快速实验与调试(详见 local.md);
  • Docker Deployer:只要本机装有 Docker 即可,ZenML 会构建名为zenml:<PIPELINE_NAME>的本地镜像并以容器方式运行(详见 docker.md);
  • Kubernetes Deployer:适合已有集群(EKS/GKE/AKS 或自建)的团队,提供资源、网络、安全精细控制,支持自动扩缩容、健康探针与高可用(详见 kubernetes.md);
  • GCP Cloud Run / AWS App Runner:Serverless 方案,按用量付费、自动扩缩容,适合已有对应云厂商依赖的团队(详见 gcp-cloud-run.md 与 aws-app-runner.md);
  • Hugging Face Deployer:将流水线发布为 Hugging Face Space,便于向社区分享或托管私有 AI 应用(详见 huggingface.md)。

快速上手:从默认 Stack 到首个部署

你无需在代码中直接与 Deployer 组件交互。只要目标 Deployer 位于当前激活的 ZenML Stack中,就可以通过 ZenML CLI 或 SDK 部署流水线或快照(Snapshot),并通过 CLI/SDK 管理生成的部署。

方式一:使用默认 Stack(Local Deployer)

默认 Stack 自带 Local Deployer,会以本地后台进程的方式部署流水线:

zenml stack set default

方式二:注册新 Deployer 并创建 Stack

zenml deployer register docker --flavor=local zenml stack register docker_deployment -a default -o default -D docker --set

注:示例中以--flavor=local注册名为docker的组件,实际使用时请按需命名与选择 Flavor。

用 SDK 部署流水线

from zenml import pipeline @step def my_step(name: str) -> str: return f"Hello, {name}!" @pipeline def my_pipeline(name: str = "John") -> str: return my_step(name=name) if __name__ == "__main__": # 将流水线 my_pipeline 部署为名为 my_deployment 的部署 deployment = my_pipeline.deploy(deployment_name="my_deployment") print(f"Deployment URL: {deployment.url}")

用 CLI 部署同一流水线

zenml pipeline deploy --name my_deployment my_module.my_pipeline

调用已部署的流水线

通过 CLI 调用:

zenml deployment invoke my_deployment --name="Alice"

或使用 curl 直接请求 HTTP 端点:

curl -X POST http://localhost:8000/invoke \ -H "Content-Type: application/json" \ -d '{"parameters": {"name": "Alice"}}'

基于快照(Snapshot)的部署

除了直接部署流水线,还可以先创建流水线快照再部署,实现版本化的可复现部署:

zenml pipeline snapshot create --name my_snapshot my_module.my_pipeline zenml pipeline snapshot deploy my_snapshot --deployment my_deployment

从 base_deployer.py 的provision_deployment主流程可以看到,无论哪种方式,底层都遵循同一套流程:校验快照的输入输出 Schema → 在数据库中创建或更新Deployment实体(记录snapshot_iddeployer_idauth_key)→ 调用具体 Flavor 的do_provision_deployment创建外部基础设施 → 通过_poll_deployment轮询直到状态达到RUNNING(期间还会调用健康检查端点验证服务可用性)。

可部署 Pipeline 的编写要求

并非所有流水线都适合部署为 HTTP 服务。编写可部署流水线需遵循以下约束:

参数要求:

  • 流水线应接受带默认值的显式参数;
  • 参数类型必须是 JSON 可序列化类型(int、float、str、bool、list、dict、Pydantic 模型);
  • 参数名应与 Step 输入名保持一致。

输出要求:

  • 流水线应返回有意义的返回值作为 HTTP 响应;
  • 返回值必须 JSON 可序列化;
  • 建议使用类型注解指定输出产物名称。

一个标准的可部署流水线示例:

from typing import Annotated from zenml import pipeline, step @step def process_weather(city: str, temperature: float) -> Annotated[str, "weather_analysis"]: return f"The weather in {city} is {temperature} degrees Celsius." @pipeline def weather_pipeline(city: str = "Paris", temperature: float = 20.0) -> str: """A deployable pipeline that processes weather data.""" analysis = process_weather(city=city, temperature=temperature) return analysis

为什么这些约束如此重要

源码层面给出了硬性校验:在 base_deployer.py 的_check_deployment_inputs_outputs中,部署前会强制检查快照的pipeline_spec是否已编译出input_schemaoutput_schema;若缺失(通常因为输入或输出不是 JSON 可序列化类型),会直接抛出DeploymentProvisionError。这正是"参数必须有默认值、类型必须 JSON 可序列化"约束的底层原因——ZenML 需要根据这些 Schema 动态生成 HTTP 请求的输入校验与输出包装(详见deployment describe --show-schema展示的 Input/Output Schema)。

部署生命周期管理

Deployment对象代表一个已部署到服务环境的流水线,它保存在 ZenML 数据库中,包含部署配置、状态与连接信息。部署是独立实体:即使之后切换了活动 Stack,仍可通过当初创建它的 Deployer 栈组件独立管理这些部署。

列出部署

CLI:

$ zenml deployment list ┏━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ NAME │ PIPELINE │ URL │ STATUS ┃ ┠──────────────────────┼──────────────────────────────────────┼────────────────────────────────┼──────────────────────────┨ ┃ weather_service │ weather_pipeline │ http://localhost:8001 │ ⚙ RUNNING ┃ ┠──────────────────────┼──────────────────────────────────────┼────────────────────────────────┼──────────────────────────┨ ┃ ml_inference_api │ inference_pipeline │ http://k8s-cluster/ml-api │ ⚙ RUNNING ┃ ┗━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

SDK:

from zenml.client import Client client = Client() deployments = client.list_deployments() for deployment in deployments: print(f"{deployment.name}: {deployment.status}")

查看部署详情

CLI(--show-schema可同时展示请求的输入/输出 JSON Schema):

$ zenml deployment describe my_deployment --show-schema 🚀 Deployment: my_deployment is: RUNNING ⚙ Pipeline: my_pipeline Snapshot: my_snapshot Stack: docker-deployer 📡 Connection Information: Endpoint URL: http://localhost:8002 Swagger URL: http://localhost:8002/docs CLI Command Example: zenml deployment invoke my_deployment --name="John" cURL Example: curl -X POST http://localhost:8002/invoke \ -H "Content-Type: application/json" \ -d '{ "parameters": { "name": "John" } }' 📋 Deployment JSON Schemas: Input Schema: { "additionalProperties": false, "properties": { "name": { "default": "John", "title": "Name", "type": "string" } }, "title": "PipelineInput", "type": "object" } Output Schema: { "properties": { "output": { "title": "Output", "type": "string" } }, "required": [ "output" ], "title": "PipelineOutput", "type": "object" } ⚙️ Management Commands ╭────────────────────────────────────────────┬─────────────────────────────────────────────────────╮ │ zenml deployment logs my_deployment -f │ Follow deployment logs in real-time │ │ zenml deployment describe my_deployment │ Show detailed deployment information │ │ zenml deployment deprovision my_deployment │ Deprovision this deployment and keep a record of it │ │ zenml deployment delete my_deployment │ Deprovision and delete this deployment │ ╰────────────────────────────────────────────┴─────────────────────────────────────────────────────╯

SDK:

from zenml.client import Client deployment = client.get_deployment("my_deployment") print(deployment)

删除与撤销部署

"撤销部署(Deprovision)"会销毁外部运行实例但保留数据库记录;"删除(Delete)"则同时删除两者。CLI:

$ zenml deployment delete my_deployment

SDK:

from zenml.client import Client client = Client() client.delete_deployment("my_deployment")

底层实现在 base_deployer.py:deprovision_deployment调用do_deprovision_deployment销毁外部资源后轮询直到状态变为ABSENTdelete_deployment支持force=True在撤销失败时强制清除数据库记录。

调用部署并获取响应

CLI:

$ zenml deployment invoke my_deployment --name="John" Invoked deployment 'my_deployment' with response: { "success": true, "outputs": { "output": "Hello, John!" }, "execution_time": 3.2781872749328613, "metadata": { "deployment_id": "95d60dcf-7c37-4e62-a923-a341601903e5", "deployment_name": "my_deployment", "snapshot_id": "f3122ed4-aa13-4113-9f60-a80545f56244", "snapshot_name": "my_snapshot", "pipeline_name": "my_pipeline", "run_id": "ea448522-d5bf-411e-971e-d4550fdbe713", "run_name": "my_pipeline-2025_09_30-12_52_01_012491", "parameters_used": {} }, "error": null }

SDK:

from zenml.deployers.utils import invoke_deployment response = invoke_deployment( deployment_name_or_id="my_deployment", name="John", ) print(response)

阻塞等待 vs 后台提交

默认情况下,invoke阻塞直到流水线运行结束并返回输出。若希望提交后台执行并立即拿到 run ID,使用--no-wait(CLI)或submit=True(SDK):

$ zenml deployment invoke my_deployment --name="John" --no-wait
response = invoke_deployment( deployment_name_or_id="my_deployment", name="John", submit=True, )

对应源码见 utils.py:invoke_deploymentsubmit参数控制同步/异步语义,timeout默认 300 秒(5 分钟),**kwargs会被序列化进 HTTP 请求参数。

为部署指定资源与扩缩容

如果 Step 需要额外硬件资源,可在 Step 上通过ResourceSettings声明。所有 Deployer 共用的基础设置(定义于 base_deployer.py 的BaseDeployerSettings):

  • auth_key:调用部署 API 时使用的自定义认证密钥;
  • generate_auth_key:是否生成并使用随机认证密钥(而非用户自定义);
  • lcm_timeout:等待部署生命周期管理(LCM)完成的最大秒数,默认 600 秒。

在流水线级指定资源的方式如下(以 Cloud Run 为例):

from zenml import step, pipeline from zenml.config import ResourceSettings resource_settings = ResourceSettings( cpu_count=2, memory="32GB", min_replicas=0, max_replicas=10, max_concurrency=50 ) @pipeline(settings={"resources": resource_settings}) def greet_pipeline(name: str = "John"): greet(name=name)

资源默认值与平台约束

不同云平台的资源规格有各自限制,ZenML 会在部署时自动对齐合法取值:

GCP Cloud Run(未显式设置时的默认值):cpu_count=1memory=2GiBmin_replicas=1max_replicas=100max_concurrency=80。Cloud Run 的 CPU/内存组合有硬性规则(如 0.08 到 1.0 之间的分数 CPU 按 0.01 递增,整数 CPU 仅支持 1/2/4/6/8;<=1 CPU最低 128 MiB、4 CPU最低 2 GiB 等)。配置不合法不会报错,而是被自动调整到最近的合法组合,例如cpu_count=0.25+memory="100MiB"会被调整为0.25CPU +128MiB

AWS App Runner(截至文档记录支持的组合):0.25 vCPU 支持 0.5/1 GB,0.5 vCPU 支持 1 GB,1 vCPU 支持 2/3/4 GB,2 vCPU 支持 4/6 GB,4 vCPU 支持 8/10/12 GB。默认情况下非法组合会被自动调整为"优先满足 CPU、最小化浪费"的最近组合;可通过strict_resource_matching=True强制精确匹配(不匹配即报错),也可通过resource_combinations配置自定义允许组合。

按需配置各 Flavor 的设置

每个 Deployer Flavor 都提供专属设置类,可在注册组件时或定义/部署流水线时通过settings={"deployer": ...}传入。以下为各 Flavor 的关键设置要点。

Local Deployer 专属设置

定义于zenml.deployers.local.local_deployer模块(详见 local.md):

  • port:部署服务监听的端口,默认不设置;
  • allocate_port_if_busy:若配置的端口被占用或未设置,自动分配空闲端口,默认True
  • port_range:搜索空闲端口的范围,默认(8000, 65535)
  • address:部署服务监听地址,默认127.0.0.1
  • blocking:是否在当前进程运行而非守护进程,默认False,调试 ASGI 应用本身时使用;
  • auto_reload:是否启用 uvicorn 自动重载,便于本地开发时热更新,默认False(注意:对流水线/Step/Stack 配置变更无效)。

示例——指定部署端口:

from zenml import step, pipeline from zenml.deployers.local.local_deployer import LocalDeployerSettings @step def greet(name: str) -> str: return f"Hello {name}!" settings = { "deployer": LocalDeployerSettings( port=8000 ) } @pipeline(settings=settings) def greet_pipeline(name: str = "John"): greet(name=name)

Docker Deployer 专属设置

定义于zenml.deployers.docker.docker_deployer模块(详见 docker.md):

  • port:暴露部署服务的端口;
  • allocate_port_if_busy/port_range:端口占用时的自动分配策略;
  • run_args:透传给docker run的参数,可参考 docker-py 的 Containers API 文档。

Kubernetes Deployer 设置与进阶用法

Kubernetes Deployer 采用渐进式复杂度模型(详见 kubernetes.md),完整设置参考KubernetesDeployerSettings

基础设置(Level 1,覆盖约 80% 场景)namespaceservice_typeLoadBalancer/NodePort/ClusterIP,默认LoadBalancer)、service_port(默认 8000)、image_pull_policy(默认IfNotPresent)、labelsannotations

生产级设置(Level 2):健康探针(readiness_probe_path默认/api/healthreadiness_probe_initial_delay默认 10s、readiness_probe_period默认 10s、readiness_probe_timeout默认 5s、readiness_probe_failure_threshold默认 3;liveness 探针同理但initial_delay默认 30s)、容器配置(commandargsservice_account_nameimage_pull_secrets)。

附加资源(Level 3):通过additional_resources指向 YAML 文件,可随主 Deployment/Service 一起下发 Ingress、HorizontalPodAutoscaler、PodDisruptionBudget、NetworkPolicy 等资源;strict_additional_resources(默认True)控制任一资源失败时是否整体失败。YAML 中可使用模板变量:{{name}}{{namespace}}{{labels}}(含managed-by: zenmlzenml-deployment-idzenml-deployment-name)、{{replicas}}{{image}}{{command}}{{args}}{{env}}{{resources}}{{pod_settings}}等。

自定义模板(Level 4):通过custom_deployment_template_file/custom_service_template_file指定自定义 Jinja2 模板,可完全覆盖内置的 Deployment/Service 资源定义(例如注入 initContainer、sidecar 等)。注意自行维护模板时需保证标签选择器(zenml-deployment-idmanaged-by: zenml)、容器端口({{settings.service_port}})、健康探针与环境变量透传的正确性。

Kubernetes 集群访问支持三种方式:本地kubectl上下文(--kubernetes_context)、Service Connector(生产推荐)、集群内认证(--incluster=True,适用于 ZenML Server 与部署目标同集群的场景)。

GCP Cloud Run 专属设置

定义于zenml.integrations.gcp.flavors.gcp_deployer_flavor模块(详见 gcp-cloud-run.md),要点包括:

  • location(默认europe-west3):部署目标 GCP 区域;
  • service_name_prefix(默认zenml-):Cloud Run 服务名前缀,避免命名冲突;
  • timeout_seconds(默认 300):请求超时,范围 1–3600 秒;
  • ingress(默认all):可选allinternalinternal-and-cloud-load-balancing
  • vpc_connector:私有网络的 VPC 连接器(格式projects/PROJECT_ID/locations/LOCATION/connectors/CONNECTOR_NAME);
  • service_account:运行服务用的 SA 邮箱,默认使用 Compute Engine 默认 SA;
  • environment_variables/labels/annotations:环境变量、标签与注解;
  • execution_environment(默认gen2):可选gen1/gen2
  • traffic_allocation(默认{"LATEST": 100}):修订版本流量分配;
  • allow_unauthenticated(默认True):是否允许未认证请求;
  • use_secret_manager(默认True):敏感环境变量是否存入 GCP Secret Manager,secret_name_prefix(默认zenml-)控制密钥名前缀。

AWS App Runner 专属设置

定义于zenml.integrations.aws.flavors.aws_deployer_flavor模块(详见 aws-app-runner.md),要点包括:

  • region:部署区域(未指定则取自认证会话);
  • service_name_prefix(默认zenml-)、port(默认 8080,容器监听端口);
  • 健康检查系列:health_check_grace_period_seconds(默认 20)、health_check_interval_seconds(默认 10)、health_check_path(默认/health)、health_check_protocol(默认TCP)、health_check_timeout_seconds(默认 2)、health_check_healthy_threshold(默认 1)、health_check_unhealthy_threshold(默认 5);
  • is_publicly_accessible(默认True)、ingress_vpc_configuration(私有服务的 VPC 配置);
  • use_secrets_manager(默认True):敏感信息存入 AWS Secrets Manager,需配置 App Runner instance role;secret_name_prefix(默认zenml-);
  • instance_role_arn(实例角色,use_secrets_manager=True时必需)、access_role_arn(ECR 拉取角色,私有 ECR 必需);
  • strict_resource_matching(默认False):CPU/内存组合严格匹配开关;
  • observability_configuration_arnencryption_kms_keytagsenvironment_variables

Hugging Face Deployer 专属设置

定义于zenml.integrations.huggingface.flavors.huggingface_deployer_flavor模块(详见 huggingface.md):

  • space_hardware:Space 硬件档位(如cpu-basiccpu-upgradet4-smallt4-mediuma10g-smalla10g-large),未指定则用免费 CPU 档;
  • space_storage:持久存储档位(small/medium/large),未指定则无持久存储;
  • private(默认True):是否创建私有 Space;
  • app_port(默认 8000):部署服务监听端口,Hugging Face 会将流量路由到该端口。

Hugging Face 部署特别强调凭据安全:环境变量通过HfApi.add_space_variable()、密钥通过HfApi.add_space_secret()设置,永不写入 Dockerfile,因此即使是公开 Space 也不会泄露凭据。同时该 Flavor 要求 Stack 中包含公开可访问的容器镜像仓库(如 Docker Hub 公开仓库、GHCR 公开镜像),因为 HF Spaces 构建时需要拉取镜像。

环境与前提条件速查

Deployer前置条件凭证方式
Local无需凭证
Docker本机安装并运行 Docker无需凭证
Kuberneteszenml integration install kubernetes、Docker、远端 Artifact Store 与 Container Registry、K8s 集群(建议 ≥1.21)本地kubectl/ Kubernetes Service Connector / in-cluster
GCP Cloud Runzenml integration install gcp、Docker、远端 Artifact Store 与 Container Registry、已部署远端 ZenML本地gcloud/ GCP Service Connector
AWS App Runnerzenml integration install aws、Docker、远端 Artifact Store、ECR/ECR Public 镜像仓库、已部署远端 ZenML本地 AWS CLI / AWS Service Connector
Hugging Facezenml integration install huggingface、Docker、远端 Artifact Store、公开 Container Registry、已部署远端 ZenMLHF Access Token(建议存 ZenML Secret 后以{{secret_name.key}}引用)

注意:Kubernetes、GCP Cloud Run、AWS App Runner、Hugging Face 四种远端 Deployer 均要求配合远端 ZenML 安装使用,仅用本地 ZenML 环境部署可能导致意外行为。

排错与最佳实践

针对 Kubernetes 部署,kubernetes.md 给出了系统性的排错指南,其中通用方法同样适用于其他 Flavor:

  • 部署卡在 Pending:用zenml deployment describe my-deployment查看状态、zenml deployment logs my-deployment -f跟进日志,再用kubectl get pods/kubectl describe pod检查底层资源;常见原因包括集群资源不足、镜像拉取失败(检查image_pull_secrets)、节点选择器/亲和性约束不满足、PVC 未就绪;
  • LoadBalancer 拿不到外部 IP:确认集群是否支持 LoadBalancer(云厂商通常支持、本地集群通常不支持);本地集群改用NodePort,无 LoadBalancer 支持的生产环境用ClusterIP+ Ingress;
  • 附加资源下发失败:用kubectl apply --dry-run=client -f k8s-resources.yaml先行校验,检查 CRD、metrics-server、ingress controller 等集群组件是否安装;
  • 镜像拉取失败docker pull <image>验证镜像存在,核对image_pull_secrets与 SA 的仓库访问权限,检查镜像拉取策略。

通用最佳实践:

  1. 生产环境优先使用 Service Connector,凭证可移植、可管理;
  2. 生产部署务必配置健康探针;
  3. 用 Ingress + ClusterIP 替代 LoadBalancer,兼顾成本与灵活性;
  4. 使用 labels/annotations 辅助组织、监控与成本追踪;
  5. 配置资源限额防止资源耗尽,用 HPA 按真实负载自动扩缩容;
  6. 配置 PodDisruptionBudget 保证集群更新期间的高可用;
  7. 将附加 K8s 资源文件与流水线代码一同纳入版本控制。

关键源码路径一览

想深入了解 Deployer 的底层实现,可重点关注以下仓库文件:

  • BaseDeployer 与 BaseDeployerSettings:Deployer 抽象基类、生命周期管理主流程、轮询与健康检查、认证密钥生成;
  • ContainerizedDeployer 基类:容器化部署器的镜像获取与 Docker 构建配置(DEPLOYER_DOCKER_IMAGE_KEY);
  • invoke_deployment 实现:HTTP 调用部署、输入 Schema 解析(基于jsonref解析引用)、同步/异步调用语义;
  • Local Deployer 实现:本地后台进程/守护进程部署与LocalDeployerSettings
  • Docker Deployer 实现:Docker 容器部署与DockerDeployerSettings
  • 部署 CLI 命令:zenml deployment list/describe/invoke/logs/deprovision/delete的入口实现;
  • 流水线部署 CLI 命令:zenml pipeline deploy的入口实现;
  • 各云端 Flavor 的部署器与设置类位于 src/zenml/integrations/ 下的kubernetesgcpawshuggingface集成目录中。

至此,你已掌握从选择 Deployer Flavor、编写可部署流水线、执行部署与调用,到生命周期管理、资源调优与排错的全链路能力,可以在本地或云端把 ZenML 流水线快速变成可对外服务的实时 API。

【免费下载链接】zenmlZenML 🙏: One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 6:39:07

MCU开发四阶实战路线:硬件认知→裸机→RTOS→工程化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 6:38:38

Echarts中国地图可视化实战:从GeoJSON到交互下钻全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 6:37:04

移动端轻量引擎开发:从图形渲染到性能优化

1. 移动端简易引擎开发入门指南在移动应用开发领域&#xff0c;引擎作为底层核心框架往往决定着应用性能的上限。不同于直接使用现成的游戏引擎或UI框架&#xff0c;从零构建一个轻量级引擎能让你深入理解移动设备的图形渲染管线、输入事件处理机制和资源管理策略。本文将带你用…

作者头像 李华
网站建设 2026/9/18 6:36:02

2026论文降AI率实战:三大核心方法把AI率稳定降到15%以下

每年一到毕业季&#xff0c;论文降AI率就成了大家最头疼的事。2026年了&#xff0c;学校的AI检测系统只会越来越严&#xff0c;很多学校已经明确把AI率作为论文盲审和答辩前的硬性门槛&#xff0c;超过30%直接打回修改&#xff0c;超过40%甚至会影响最终答辩资格。我之前带过不…

作者头像 李华