如何从Kubernetes YAML CRD生成Go结构体?
针对你想从CRD的Unstructured对象生成Go结构体(类似oapi-codegen处理OpenAPI的效果)的需求,有几个现成的Go语言工具和方案可以直接用,不用自己从头实现:
crd2go:专门做CRD到Go结构体的转换工具,支持从CRD YAML或者内存里的Unstructured对象生成代码,生成的结构体自带Kubernetes标准的
json/yaml标签和kubebuilder注解,格式和kubebuilder生成的完全一致,直接满足你的需求。你可以把Unstructured序列化为YAML后传给工具,也能通过它的Go包在代码里直接调用生成逻辑。controller-gen:就是kubebuilder配套的代码生成工具,虽然平时主打从Go结构体生成CRD,但它也支持反向解析CRD生成Go代码。你可以传入CRD文件或者内存中的Unstructured对象,配置好生成参数后,就能得到对应的结构体,还能顺便生成配套的client代码(如果需要的话)。
Kubernetes官方code-generator套件:这套工具里的部分组件支持反向解析CRD的OpenAPI Schema生成Go结构体。你可以从Unstructured对象里提取
spec.openAPIV3Schema字段(这是标准的OpenAPIv3定义),用套件里的基础包快速生成结构体,省得自己写解析逻辑。
另外还有个变通方法:既然你已经拿到了Unstructured对象,直接提取里面的spec.openAPIV3Schema,用你熟悉的oapi-codegen生成基础Go结构体,之后手动补上Kubernetes特有的嵌入字段(比如metav1.TypeMeta和metav1.ObjectMeta),这种方式适合需要自定义生成细节的场景。
内容的提问来源于stack exchange,提问作者Stef

