1、runtime.Object

Kubernetes 上的所有资源对象都有一个共同的结构叫 runtime.Object,其被设计为 Interface 接口类型,作为资源对象的通用资源对象。runtime.Object 提供了两个方法:

type Object interface {
    GetObjectKind() schema.ObjectKind // 用于设置并返回GroupVersionKind
    DeepCopyObject() Object // 用于深复制当前资源对象并返回
}

深复制相对于浅复制区别是,引用对象地址分离,拥有相同的数据,但是不是一个相等对象。

在 Go 中,一个结构是否可以转换为一个接口,需要实现接口的所有方法,例如需要实现上面的两个方法。在 kubernetes 中每个资源都嵌入 metav1.TypeMeta 类型,而该类型实现了 GetObjectKind 方法,并且在代码自动生成阶段会给资源生成复制文件,里面包含了 DeepCopyObject 方法。因此,可以认为内置资源对象能够转换成通用资源对象。

2、Unstructured

Kubernetes 内部会经常处理两种数据,一是结构化数据(Structured Data),二是非结构化数据(Unstructured Data)。

2.1 结构化数据

预先知道数据结构的数据类型是结构化数据。例如数据来源是 json 格式,只需要创建相同字段的对象去反序列化即可。

2.2 非结构化数据

无法预知数据结构的数据类型或属性名称不确定的数据类型是非结构化数据,其无法通过构建预定的 struct 数据结构来序列化或反序列化数据。

Go 语言是强类型语言,它需要预先知道数据类型,在处理 JSON 数据时不如动态语言那样便捷。当无法预知数据结构的数据类型或属性名称不确定时,可以通过 map[string]interface{} 类型去接收,在实际处理的逻辑中进行类型的转换。

2.3 Kubernetes 非结构化数据

// 方法能力
type Unstructured interface {
    Object
    NewEmptyInstance() Unstructured
    UnstructuredContent() map[string]interface{}
    SetUnstructuredContent(map[string]interface{})
    IsList() bool
    EachListItem(func(Object) error) error
}
​
// 结构定义
type Unstructured struct {
    Object map[string]interface{}
}