使用unstructured包读取Deployment时spec.replicas类型不匹配如何解决?
解决unstructured.NestedInt64读取replicas报错的问题
问题根源是YAML解析器默认将整数解析为float64,而NestedInt64期望int64类型。要让读取阶段自动转换为正确类型,按以下步骤处理:
1. 确保RESTMapper包含目标资源的完整Schema
你当前使用的crClient.RESTMapper()可能未包含apps/v1/Deployment的API schema信息,导致manifestreader无法根据资源定义做类型转换。改用DiscoveryClient构建完整的RESTMapper:
import ( "k8s.io/client-go/discovery" "k8s.io/client-go/restmapper" ) // 假设你已有kubeconfig配置cfg discoveryClient, err := discovery.NewDiscoveryClientForConfig(cfg) if err != nil { // 处理错误 } groupResources, err := restmapper.GetAPIGroupResources(discoveryClient) if err != nil { // 处理错误 } restMapper := restmapper.NewDiscoveryRESTMapper(groupResources)
2. 重新配置manifestreader
用上面构建的完整RESTMapper初始化PathManifestReader,确保Validate: true,读取YAML时会自动根据K8s资源Schema转换字段类型:
reader := manifestreader.PathManifestReader{ Path: path, ReaderOptions: manifestreader.ReaderOptions{ Mapper: restMapper, Validate: true, }, } objs, err := reader.Read()
完成上述配置后,spec.replicas会被正确解析为int64类型,调用unstructured.NestedInt64就不会再报类型不匹配的错误。
如果仍有问题,检查YAML文件中replicas的值是否为纯整数(避免写1.0这类小数形式),确保符合K8s资源定义的integer类型要求。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

