Skip to main content

kind案例探究

在本节我们将通过k8s.io/api库的一个具体的kind案例——PodPodList来进一步诠释kind在实现上是如何具体需要遵循的约定的。 探究原生kind的具体实现有助于我们实现自定义资源的Go类型。

Pod

在Go语言中,如果一个类型实现了某接口,将此类型嵌入到另一个结构类型中,那么被嵌入的结构类型也等同于实现了该接口。

k8s.io/api库中定义了所有Kubernetes原生资源类型对应的kind。 这些kind正是通过类型嵌入的方式来达到之前kind与runtime.Object小节所提及的实现基础接口runtime.Object同等的效果。

例如, 我们以Pod类型为例,

k8s.io/api/core/v1/types.go
type Pod struct {
metav1.TypeMeta
metav1.ObjectMeta

Spec PodSpec
Status PodStatus
}
  1. 通过嵌入metav1.TypeMeta类型,使得Pod也实现了runtime.Object接口的第一个方法GetObjectKind() schema.ObjectKind

  2. 通过嵌入metav1.ObjectMeta类型, 使得Pod也实现了metav1.Object接口。

  3. 除此以外,Pod类型未以类型嵌入的方式实现了runtime.Object接口的第二个方法DeepCopyObject() Object

    k8s.io/api/core/v1/zz_generated.deepcopy.go
    func (in *Pod) DeepCopyObject() runtime.Object {
    if c := in.DeepCopy(); c != nil {
    return c
    }
    return nil
    }

综合以上三点,Pod类型同时实现了runtime.Object接口以及metav1.Object接口。根据定义,Pod类型应属于kind第一种类(即资源类型对应的单体种类)。

PodList

我们再以PodList为例:

k8s.io/api/core/v1/types.go
type PodList struct {
metav1.TypeMeta
metav1.ListMeta

Items []Pod
}
  1. 通过嵌入metav1.TypeMeta结构类型,使得PodList类型实现了runtime.Object接口的第一个方法GetObjectKind() schema.ObjectKind
  2. 通过嵌入metav1.ListMeta结构类型, 使得PodList类型实现了metav1.ListInterface接口。
  3. 除此以外,PodList类型未以类型嵌入的方式实现了runtime.Object接口的第二个方法DeepCopyObject() Object
    k8s.io/api/core/v1/zz_generated.deepcopy.go
    func (in *PodList) DeepCopyObject() runtime.Object {
    if c := in.DeepCopy(); c != nil {
    return c
    }
    return nil
    }
  4. PodList类型含有名为Items的slice字段。

综合以上四点,PodList类型同时实现了runtime.Object接口和metav1.ListInterface接口,并且含有名为Items的slice字段。根据定义,PodList类型应属于kind第二种类(即集合种类)。

小结

小结

本节通过对PodPodList这两个kind的探究,旨在为读者建立起一个编写自定义资源Go类型对应的模板。