kind案例探究
在本节我们将通过k8s.io/api
库的一个具体的kind案例——Pod
及PodList
来进一步诠释kind在实现上是如何具体需要遵循的约定的。
探究原生kind的具体实现有助于我们实现自定义资源的Go类型。
Pod
在Go语言中,如果一个类型实现了某接口,将此类型嵌入到另一个结构类型中,那么被嵌入的结构类型也等同于实现了该接口。
在k8s.io/api
库中定义了所有Kubernetes原生资源类型对应的kind。
这些kind正是通过类型嵌入的方式来达到之前kind与runtime.Object小节所提及的实现基础接口runtime.Object
同等的效果。
例如, 我们以Pod
类型为例,
type Pod struct {
metav1.TypeMeta
metav1.ObjectMeta
Spec PodSpec
Status PodStatus
}
通过嵌入
metav1.TypeMeta
类型,使得Pod
也实现了runtime.Object
接口的第一个方法GetObjectKind() schema.ObjectKind
。通过嵌入
metav1.ObjectMeta
类型, 使得Pod
也实现了metav1.Object
接口。除此以外,
Pod
类型未以类型嵌入的方式实现了runtime.Object
接口的第二个方法DeepCopyObject() Object
:k8s.io/api/core/v1/zz_generated.deepcopy.gofunc (in *Pod) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
综合以上三点,Pod
类型同时实现了runtime.Object
接口以及metav1.Object
接口。根据定义,Pod
类型应属于kind第一种类(即资源类型对应的单体种类)。

PodList
我们再以PodList
为例:
type PodList struct {
metav1.TypeMeta
metav1.ListMeta
Items []Pod
}
- 通过嵌入
metav1.TypeMeta
结构类型,使得PodList
类型实现了runtime.Object
接口的第一个方法GetObjectKind() schema.ObjectKind
。 - 通过嵌入
metav1.ListMeta
结构类型, 使得PodList
类型实现了metav1.ListInterface
接口。 - 除此以外,
PodList
类型未以类型嵌入的方式实现了runtime.Object
接口的第二个方法DeepCopyObject() Object
:k8s.io/api/core/v1/zz_generated.deepcopy.gofunc (in *PodList) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
} PodList
类型含有名为Items
的slice字段。
综合以上四点,PodList
类型同时实现了runtime.Object
接口和metav1.ListInterface
接口,并且含有名为Items
的slice字段。根据定义,PodList
类型应属于kind第二种类(即集合种类)。
小结
本节通过对Pod
及PodList
这两个kind的探究,旨在为读者建立起一个编写自定义资源Go类型对应的模板。