1. 手工写 CRD 的痛:字段一多就对不齐
如果你正在学云原生,或者刚接触 Kubernetes 的扩展机制,大概率绕不开 CRD(CustomResourceDefinition)。它是什么?简单说,CRD 让你不用改 Kubernetes 源码,就能往集群里注册一种全新的资源类型,比如 CronTab。它能做什么?注册完之后,你就能像操作 Pod、Deployment 一样,用 kubectl 去创建、查询、删除自定义对象。适合谁?适合想给 K8s 加“私有资源”的运维、平台开发,以及正在啃声明式 API 的同学。
但真到动手写的时候,问题就来了。声明式 API 的核心是“对象代表期望状态”,可这个期望状态得靠 YAML 描述。CRD 的 YAML 里要写 group、versions、scope、names,还要嵌一层 openAPIV3Schema,字段一多,缩进错一格、类型写错一个,kubectl apply 就给你脸色看。我试过手工维护resourcedefinition.yaml和my-crontab.yaml,光是cronSpec、image、replicas三个字段的 schema 就来回改了好几遍,更别说后面还要写验证命令。
这一条我换个视角:不纠结 CRD 字段逻辑本身,而是先把 Claude Code 的模型通道接好,让它按声明式 API 的规范,帮你把 CRD 文件、定制对象文件和验证命令一次性生成出来。TaoToken 在这里的位置很明确——给 Claude Code 配 Key,让它能稳定调用模型。你从 https://taotoken.net/ 拿到 Key 后,配通的是 Claude Code 对 Kubernetes CRD 从定义到对象创建的整条生成与验证链路。
2. 前置准备:给 Claude Code 接上 TaoToken 通道
Claude Code 本身是个命令行编码助手,它需要一个大模型后端来理解你的意图、生成代码和 YAML。TaoToken 提供的就是这个模型通道。你不需要改 CRD 的任何字段逻辑,只需要把 Base URL 和 Key 填进 Claude Code 的配置里。
先打开 https://taotoken.net/ ,注册并创建一个 API Key。创建入口在控制台的 API Keys 页面,建议给这个 Key 起个能认出来的名字,比如claude-code-crd,方便以后区分。Key 生成后只显示一次,先复制到安全的地方。
拿到 Key 之后,Claude Code 的接入方式有两种:环境变量和配置文件。环境变量适合临时用,配置文件适合长期。我实测下来,配置文件更稳,尤其是你后面要反复让 Claude Code 生成 CRD 相关文件时,不用每次开终端都 export。
TaoToken 的 API 地址是 https://taotoken.net/api ,注意这个地址不带任何查询参数,直接作为 Base URL 使用。Claude Code 的模型对话、Coding Plan 等能力都走这个入口。如果你还想在网页上先验证模型是否正常,可以打开模型对话页面试一句;长期编码和 Agent 场景,则建议了解 Coding Plan 的额度方式。
3. 可复制配置:把 Base URL 和 Key 写进 Claude Code
下面这套配置你可以直接抄。先设置环境变量,这是最直接的方式:
export ANTHROPIC_BASE_URL="https://taotoken.net/api" export ANTHROPIC_API_KEY="sk-你从TaoToken复制的Key"如果你用的是 Claude Code 的配置文件方式,可以写进~/.claude/settings.json或项目级的.claude/settings.json。注意 JSON 里不要有多余逗号:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你从TaoToken复制的Key" } }配置完成后,用一条最简单的命令验证通道是否通:
claude -p "用一句话说明 Kubernetes CRD 是什么"如果返回了正常的中文解释,说明 Claude Code 已经通过 TaoToken 拿到了模型响应。这一步很关键,因为后面生成 CRD 的 YAML 时,模型需要理解你的字段意图,通道不通就会一直转圈或报鉴权错误。
注意:Key 不要提交到 Git 仓库,也不要在团队共享的脚本里明文写死。建议用环境变量注入,或者放在本地不纳入版本管理的配置文件里。
4. 让 Claude Code 生成 CronTab 的 CRD 与定制对象
通道通了之后,就可以让 Claude Code 按声明式 API 的要求干活了。声明式 API 的对象代表期望状态,所以 CRD 的 schema 要能描述“用户期望的 CronTab 长什么样”。你可以直接在 Claude Code 里输入下面这段提示词:
请按 Kubernetes apiextensions.k8s.io/v1 规范,生成一个 CronTab 的 CustomResourceDefinition YAML。 要求: 1. group 为 stable.example.com,version 为 v1,scope 为 Namespaced; 2. kind 为 CronTab,plural 为 crontabs,singular 为 crontab,shortNames 为 ct; 3. openAPIV3Schema 中 spec 包含 cronSpec(string)、image(string)、replicas(integer)三个字段; 4. 输出完整的 resourcedefinition.yaml 内容,不要省略缩进。Claude Code 会返回一份完整的 CRD 文件。你可以把它保存为resourcedefinition.yaml,然后执行:
kubectl apply -f resourcedefinition.yaml创建成功后,Kubernetes API 服务器会为这个 CRD 生成 RESTful 路径/apis/stable.example.com/v1/namespaces/*/crontabs。你可以用 raw 请求确认端点已经注册:
kubectl get --raw /apis/stable.example.com/v1/ | python -m json.tool接下来生成定制对象。继续在 Claude Code 里输入:
请生成一个 CronTab 定制对象 YAML,文件名为 my-crontab.yaml。 apiVersion 为 stable.example.com/v1,kind 为 CronTab,metadata.name 为 my-new-cron-object; spec 中 cronSpec 为 "*/5 * * * *",image 为 my-awesome-cron-image,replicas 为 3。保存后执行:
kubectl apply -f my-crontab.yaml kubectl get crontab kubectl get ct -o yaml到这里,从 CRD 定义到定制对象创建的链路就跑通了。Claude Code 负责按规范生成 YAML,TaoToken 负责让 Claude Code 有模型可用,你负责确认字段和缩进。三者分工清晰,互不越界。
5. 本篇常见错排查
报错一:error: unable to recognize "resourcedefinition.yaml": no matches for kind "CustomResourceDefinition"
这通常不是 CRD 内容的问题,而是 kubectl 连接的集群版本太老,或者 kubeconfig 指向了错误的上下文。先确认kubectl version --short里服务端版本不低于 v1.16,因为apiextensions.k8s.io/v1是从这个版本开始稳定的。如果集群版本没问题,检查KUBECONFIG环境变量是否指向了正确的配置文件。
报错二:The CustomResourceDefinition "crontabs.stable.example.com" is invalid: spec.versions[0].schema.openAPIV3Schema.properties[spec].properties[replicas].type: Unsupported value: "int"
这是 schema 类型写错了。Kubernetes 的 openAPIV3Schema 只认integer,不认int。Claude Code 生成时一般不会犯这个错,但如果你手工改过,就要把type: int改成type: integer。同理,字符串是string,布尔是boolean,对象是object,数组是array。
报错三:error: the path "my-crontab.yaml" does not exist
确认你保存文件时没有多敲扩展名,比如my-crontab.yaml.txt。用ls -l my-crontab.yaml看一眼实际文件名。另外,kubectl apply默认在当前目录找文件,如果你在别的目录,要么cd过去,要么写绝对路径。
报错四:Claude Code 返回401 Unauthorized或一直无响应
先检查ANTHROPIC_BASE_URL是否写成了https://taotoken.net/api,不要多加斜杠或路径。再确认ANTHROPIC_API_KEY没有多余空格或换行。如果用的是配置文件,检查 JSON 格式是否合法,可以用python -m json.tool ~/.claude/settings.json验证。通道问题解决后,再重新执行生成命令。
报错五:kubectl get crontab返回No resources found
这不一定代表失败。如果你创建了 CRD 但还没创建定制对象,或者定制对象在别的 namespace,就会显示为空。先kubectl get crd | grep crontabs确认 CRD 存在,再kubectl get ct -A看所有命名空间下的 CronTab 对象。如果 CRD 本身没创建成功,回到上一步重新 apply。
6. 把生成链路固定下来
CRD 的字段逻辑本身不难,难的是 YAML 的缩进和 schema 类型对齐。与其每次手工改到眼花,不如把 Claude Code 当成一个“按规范生成 YAML 的助手”,而 TaoToken 就是让这个助手能稳定工作的模型通道。你从 https://taotoken.net/ 创建 Key,把 Base URL 填进 Claude Code,后面无论是生成 CronTab 的 CRD、定制对象,还是验证用的 kubectl 命令,都可以用自然语言描述需求,让模型输出可复制的文件内容。
如果你后面还要做更复杂的 Operator 或声明式 API 扩展,建议把常用的提示词模板存下来,比如“生成 CRD 时强制包含 shortNames 和 printerColumns”。这样每次让 Claude Code 生成时,输出会更贴近生产可用的形态。通道配置和 Key 管理可以参考接入文档,模型效果想先试的话,模型对话页面可以直接开聊;长期编码场景则看 Coding Plan 的说明。链路固定之后,你只需要关注 CRD 的字段设计本身,剩下的交给工具。