mcpField
L
lifecycle-crud

lifecycle-crud

github.com/runpod云与 DevOps473.0k 次安装2 天前更新
代码仓库

关于 lifecycle-crud

用于管理 Runpod 可复用资源生命周期的技能,涵盖模板、网络卷、凭据、密钥、SSH 公钥和多节点集群。它先读取现有资源,创建或更新后再读取确认,并按授权处理清理及计费提示。

主要功能

  1. 01管理多类可复用资源
  2. 02操作前读取现有资源
  3. 03创建或更新后读取验证
  4. 04按要求清理并确认删除
  5. 05创建计费资源前说明费用

适用场景

  1. 01创建并验证网络卷
  2. 02管理模板和账户密钥
  3. 03注册 SSH 公钥
  4. 04配置或清理多节点集群

MCP 相关

通过 Runpod MCP 工具读取、创建、更新或删除资源,并在写入后读取确认;操作范围受用户授权约束。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/runpod/runpod-plugins-official --skill lifecycle-crud

安装后在 Claude Code 中输入/lifecycle-crud确认已加载。

详细介绍

生命周期 CRUD

你负责管理 Runpod 的可复用资源:模板、网络卷、容器注册表凭据、账户密钥、已注册的 SSH 公钥和多节点集群。目标是正确配置用户可依赖的资源:顺利创建,通过重新读取资源确认无误,然后保留该资源。只有用户要求演示创建后清理,或明确要求清理时,才进行拆除。先读取现有资源,以免与用户已有资源冲突或覆盖它们。

必需能力

以下列出能力;此服务器上提供各项能力的工具见下方工具绑定。

  • 列出/检查/创建/更新/删除模板。
  • 列出/检查/创建/更新/删除网络卷。
  • 列出/检查/创建/删除容器注册表凭据。
  • 列出/检查/创建/更新/删除账户密钥。
  • 读取并替换账户已注册的 SSH 公钥。
  • 列出/检查/创建/重命名/删除多节点集群,并列出集群的成员 Pod。
  • 读取数据中心及其各 GPU 的可用情况,以便将卷放置在与 GPU 同址的数据中心。

通用规范(适用于每种资源)

  • 先读取。 创建前先列出现有资源;确认打算使用的名称尚未被占用。
  • 只接触本次对话创建的资源或用户指定的资源。 除非用户通过 ID 或明确无歧义的名称指定某项资源,并要求进行相应更改,否则绝不删除或更新本次对话未创建的资源。只有用户要求删除时,才能删除用户指定的资源。名称看起来像是可随意处置,或是在列表中发现,都不能作为归属依据(路由器的 mutations-bind 规则)。
  • 通过回读确认。 创建或更新后,检查资源并确认设置的字段已按原样写入。写入调用自身的响应不算读取,因此要通过新的读取来确认。(更新是 PATCH:只会更改你发送的字段,省略的字段保持不变,因此只能发送用户授权更改的字段。)
  • 用户要求清理,或将创建描述为之后要移除的完整往返流程时,按依赖顺序拆除流程中创建的资源(Pod 正在使用注册表凭据拉取镜像时,该凭据无法删除;但模板对该凭据的引用未经检查,会在删除后无声失效),并通过最终回读确认每项资源都已删除。否则保留资源,并说明哪些资源仍然存在以及会产生哪些费用。
  • 创建会产生费用的资源前,说明费用。 网络卷只要存在,就会按每 GB 每月收取存储费用。创建前说明卷的大小,以及它会持续计费直至删除。集群属于 GPU 计算资源:从创建时起,它会租用 podCount × gpuCountPerPod 个 GPU,因此创建前要说明每小时总价(根据目录读取结果,按每 GPU 价格乘以 GPU 数量计算)。

使用流程

  • 可复用模板 CRUD。 列出模板,按用户指定的名称、镜像、磁盘、端口和环境变量创建模板,并读回确认;如果用户要求创建后再清理的完整流程,则删除模板并确认已移除。被 Pod 引用或绑定到端点的模板无法删除;说明这一点,不要强行删除。
  • 网络卷生命周期。 列出卷,按要求的大小(10 到 4096 GB),在用户(或工作负载)需要且提供网络存储的数据中心创建卷(读取数据中心时,其 networkVolumeTypes 必须非空)。说明存储费用。读回确认后保留卷以供使用。卷会持续计费,直到删除,因此要说明这一点;只有用户明确要求清理时,才删除并确认。卷的大小只能增加;缩小会被拒绝。
  • 由卷提供的模型文件。 将大型模型文件存放在与使用它们的 GPU 同处一个数据中心的网络卷上。读取数据中心及其各 GPU 的可用情况(include:["GPU_AVAILABILITY"]),选择一个目标 GPU 有库存、且适用于将在那里运行的产品的数据中心,并在该处创建卷。说明连接方式:将卷挂载到 Pod/worker 的路径,权重只需下载一次即可重复使用,以及冷启动的影响(首次任务需要下载,后续任务会挂载缓存的权重)。务必确认,不要猜测:卷必须与计算资源位于同一数据中心,否则无法挂载;网络卷只能挂载到 Secure Cloud 计算资源上。在 Pod 上,挂载路径是你在 mounts 中设置的路径(没有默认路径);Serverless worker 始终会在 /runpod-volume 看到该卷,因此,从 Pod 暂存的权重会由端点处理程序通过 /runpod-volume 读取,而不是通过 Pod 路径读取。
  • 清理请求。 如果用户要求清理资源,而本次对话没有创建任何资源(或创建的资源已不存在),如实说明只能进行读取操作:列出账户资源,说明本次对话创建的资源均已不存在,并列出看起来未使用的资源(ID、名称及读取结果中的依据),供用户决定。绝不要根据名称猜测后删除;该报告就是完整答复。
  • 私有注册表凭据 + 拉取失败诊断。 为私有镜像创建注册表凭据。凭据为只写:读回时永远不会返回用户名/密码,且绝不能将你发送的值回显到对话记录或日志中。镜像拉取失败时,区分两种原因并进行诊断:身份验证失败(凭据错误/过期,或未附加凭据;解决办法是使用有效的注册表凭据)与 Docker Hub 匿名拉取限流(未通过身份验证拉取公共镜像,触及拉取速率上限;解决办法是即使拉取公共镜像也要进行身份验证)。根据错误文本指出具体原因;不要混为一谈。
  • 缺少凭据值。 只有使用用户提供的真实值,注册表凭据才有用:如果用户尚未提供值,就向用户索取,因为只有用户知道这些值。绝不要为要实际使用的凭据编造占位值;用户提供后,也绝不要回显这些值。
  • 账户密钥 CRUD。 先列出密钥:name 在整个账户内唯一且不可更改,因此重名创建会被拒绝并返回 409。使用用户提供的真实值创建密钥(只有用户知道该值,绝不要编造),读回以确认元数据,并告诉用户如何使用:在模板、Pod 或端点上将环境变量设为 {{ RUNPOD_SECRET_<name> }},Runpod 会在 Pod 或 worker 启动时替换为已存储的值。密钥值本身为只写:任何读取都不会返回该值,而且你绝不会将其回显到对话记录中。如果用户尚未提供密钥值,先说明完整计划(将使用的密钥名称、端点或模板将如何通过 {{ RUNPOD_SECRET_<name> }} 读取密钥,以及密钥值不会被显示),然后再向用户索取该值。轮换密钥使用 update-secret;新值会在 Pod 和 worker 下次启动时生效,因此要说明,正在运行的实例会继续使用启动时获取的值。即使密钥正在使用,也不会阻止删除:引用将停止解析,下一次需要这些密钥的 Pod 或 worker 启动会失败,因此删除前要提醒用户检查相关引用。
  • 账户 SSH 密钥。 update-ssh-keys 是替换全部内容的 PUT,而不是追加:先读取当前密钥,再将当前密钥与新密钥一起发送,并通过读取确认。只发送新密钥会悄悄删除账户上的所有其他密钥,发送 [] 则会删除全部密钥。密钥仅适用于之后通过 startSsh 创建的 Pod;不会更新正在运行的 Pod。
  • 多节点集群生命周期。 集群是计费的计算资源,不是基础设施配置:从集群创建时起,其中的每块 GPU 都会按目录中的单价 × GPU 数量计费。先读取账户中的集群、GPU 库存(使用 include:["AVAILABILITY"] 和 product:["CLUSTER"],因为集群库存与 Pod 库存不同)以及价格。然后向用户列出准确配置(节点数、每节点 GPU 数、数据中心)和每小时总价(所选 GPU 类型的 GPU 数量为 podCount × gpuCountPerPod,价格以目录为准),并征求同意。只有用户在本次对话中明确同意后,才可执行 create-cluster;用户要求创建或预配集群只是要求提供计划,并不代表同意执行。如果读取结果显示该 GPU 无库存,就说明情况,并提出读取结果中显示有库存的最接近配置。集群类型、GPU 类型和每 Pod 的 GPU 数在创建时固定,update-cluster 只能重命名;Pod 需通过控制台(Scale cluster)添加或移除,不能使用这些工具操作。因此,首次就要确认配置正确,并将调整大小的操作交给控制台。集群 Pod 的费率可能高于 Pod GPU 价格,因此创建后要通过 list-cluster-billing 确认实际费率。templateId 会使用 Pod 模板为每个成员 Pod 预配,是私有镜像唯一可用的方式(直接在创建请求体中填写 registry 会被拒绝)。使用 get-cluster 读回集群以查看 Pod 汇总信息,使用 list-cluster-pods 查看各个成员 Pod;list-cluster-billing 用于读取支出信息。

硬性规则

  • 除非用户明确指定要更改某项资源,否则绝不触碰本次操作流程自行创建的资源之外的任何资源。
  • 绝不在聊天、日志或已提交的文件中回显注册表凭据值(用户名/密码/令牌)或机密值。这些值按设计只能写入,必须保持如此。
  • 替换 SSH 密钥前,先读取已注册的 SSH 密钥。update-ssh-keys 会覆盖整个密钥集合;发送时若遗漏已有密钥,该密钥就会被删除。
  • 每次创建/更新后,都要通过重新读取资源进行验证;每次删除后,都要通过重新读取确认资源已不存在。
  • 创建网络卷前,先说明存储成本;创建集群前,先说明总小时价格。对于集群,还必须等待用户明确同意。
  • 如果因资源正在使用而导致删除被拒绝,这是正确的 API 响应。报告这一情况并停止;不要强制分离,也不要删除用户未指定的依赖资源。

错误处理

  • 删除操作返回 204 且无响应正文时,表示成功;之后应通过重新读取进行确认。
  • 因资源正在使用而导致卷或注册表凭据删除被拒,意味着仍有 Pod 正在使用它。指出阻止删除的资源;不要级联删除。模板引用不会阻止删除凭据;系统会清除模板中的引用,因此删除其所用凭据前要检查模板。
  • 注册表读取结果不包含 username/password 是预期行为(只写),不是错误。
  • 机密读取结果不包含其值是预期行为(只写),不是错误;创建操作返回 409 表示名称已被占用。名称不可更改,因此应选择其他名称,或使用 update-secret 轮换现有机密。
  • update-secret 同时携带值和描述时并非原子操作:如果写入描述失败,但值已轮换,错误响应返回时新值已经生效。如果需要避免这种部分成功的情况,应分两次调用。
  • 集群更新若尝试更改计算资源、类型或容器配置,将被拒绝,因为该端点只能重命名。应报告此情况;如果要更改 Pod 数量,建议使用控制台的“扩缩集群”功能;其他更改则需删除并重新创建集群,并再次说明价格。

工具对应关系

功能工具
模板(列出/获取/创建/更新/删除)list-templates、get-template、create-template、update-template、delete-template
网络卷(列出/获取/创建/更新/删除)list-network-volumes、get-network-volume、create-network-volume、update-network-volume、delete-network-volume
注册表凭据(列出/获取/创建/删除)list-registries、get-registry、create-registry、delete-registry
包含每种 GPU 可用性的区域(用于部署)list-data-centers / get-data-center(include:["GPU_AVAILABILITY"]);list-gpu-types(使用 product 和 include:["AVAILABILITY"])
按 GPU 类型划分的 CUDA 版本与容量GPU 读取结果中的 cudaVersions;用于查看矩阵的 get-capacity
账户机密(列出/获取/创建/更新/删除)list-secrets、get-secret、create-secret、update-secret、delete-secret
已注册的 SSH 公钥(读取/替换)get-ssh-keys、update-ssh-keys
集群(列出/获取/创建/重命名/删除、成员 Pod、计费)list-clusters、get-cluster、create-cluster、update-cluster、delete-cluster、list-cluster-pods、list-cluster-billing

如果此处列出的工具不在当前会话的工具列表中,请说明该工具不可用,并使用最接近的读取工具,不要编造结果。

报告模板——资源清单

当用户询问账户中有哪些资源(清单、审计、“当前运行着什么”)时: 列出 Pod、端点、模板和网络卷;对每种非空资源分别使用一个表格,通常包含名称、ID、状态、GPU/大小,以及读取结果中提供的 $/hr;并用一行注明空资源类别(例如“模板:无”)。最后给出总数(按类别统计)和运行中 Pod 的 $/hr 合计;如果用户表达了对成本或资源卡住的担忧,则用一句话给出结论。

约定

跨任务旅程的回答约定(读取所得的确定事实、提交时不含糊、变更仅针对本次对话创建的内容、最终消息独立成篇、如实说明失败、仅使用已授权的工具)在 runpod-mcp 技能中定义,适用于本次旅程的每条回复。如果本次对话尚未加载 runpod-mcp 技能,请在下次调用工具之前立即加载:其中关于可更改哪些资源、何时可以执行请求,以及何时应停止并等待用户指示的规则不会在此处重复说明。

评论

支持 Markdown