当资源种类/类型以字符串形式给出时,如何为某个Kubernetes资源创建空结构?
即
var object *runtime.Object
object = factory.NewResourceFromKind("pod")
和object
应该包含&apiv1.Pod{}
吗?
答案 0 :(得分:1)
没有做到这一点的漂亮方法。
这将需要两个步骤:
您可以编写自己的代码来遍历每种k8s api类型并将其插入到地图中,如以下答案所示:is there a way to create an instance of a struct from a string?
或者,您可以使用一种极为不可移植的方法从二进制文件中提取类型,从而避免知道要添加到地图的类型: How to discover all package types at runtime?
使用地图实例化。使用地图从字符串中查找myType,然后:
reflect.New(myType).Elem()
其中myType是reflect.Type的实例
答案 1 :(得分:1)
仅知道Kind
还是不够的,但是结合使用API组+ API版本+对象种类(GroupVersionKind
),您可以使用默认scheme.Scheme
变量中包含的信息生成一个新对象。
package main
import (
"fmt"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/kubernetes/scheme"
)
func main() {
// apiVersion's syntax is "group/version" for non-core API groups
// e.g. "apps/v1"
podGvk := schema.FromAPIVersionAndKind("v1", "Pod")
obj, err := scheme.Scheme.New(podGvk) // error handling omitted
fmt.Printf("%T", obj)
/* prints '*v1.Pod' */
}
有关func (*Scheme) New
的信息,请参见godoc。