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类型对应的模板。