仅了解资源种类/类型时创建空的Kubernetes资源结构(在golang中)

时间:2019-04-14 16:58:53

标签: go kubernetes

当资源种类/类型以字符串形式给出时,如何为某个Kubernetes资源创建空结构?

var object *runtime.Object

object = factory.NewResourceFromKind("pod")

object应该包含&apiv1.Pod{}吗?

2 个答案:

答案 0 :(得分:1)

没有做到这一点的漂亮方法。

这将需要两个步骤:

  1. 构建类型图:map [string] reflect.Type

您可以编写自己的代码来遍历每种k8s api类型并将其插入到地图中,如以下答案所示:is there a way to create an instance of a struct from a string?

或者,您可以使用一种极为不可移植的方法从二进制文件中提取类型,从而避免知道要添加到地图的类型: How to discover all package types at runtime?

  1. 使用地图实例化。使用地图从字符串中查找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。