Kubernetes编程——client-go基础—— TypeMeta

TypeMeta

https://github.com/kubernetes/apimachinery/blob/release-1.27/pkg/runtime/types.go

我理解意思是说: TypeMeta 是所有顶级对象共享的类型。你可以通过嵌入 runtime.TypeMeta 的方式在你自己的类型中使用它。

TypeMeta 结构体的字段都使用了 json、yaml 和 protobuf 标签,这是为了方便对象在序列化和反序列化时的处理。

omitempty 是一个选项,用于告诉序列化器在生成的 JSON 或 YAML 中省略该字段的空值。如果字段的值为空,那么在序列化时将不会包含该字段。只有当字段的值非空时,才会在序列化时包含该字段。

此外,注释中还提到了一些标记,如 +k8s:deepcopy-gen、+protobuf、+k8s:openapi-gen。这些标记用于指示代码生成工具在处理该结构体时的行为。

  代码如下:

…… 前面是 Kubernetes 项目中的标准版权声明,我就省略了,如果有人想看,可以访问上面的链接
package runtime

// Note that the types provided in this file are not versioned and are intended to be
// safe to use from within all versions of every API object.

// TypeMeta is shared by all top level objects. The proper way to use it is to inline it in your type,
// like this:
//
//	type MyAwesomeAPIObject struct {
//	     runtime.TypeMeta    `json:",inline"`
//	     ... // other fields
//	}
//
// func (obj *MyAwesomeAPIObject) SetGroupVersionKind(gvk *metav1.GroupVersionKind) { metav1.UpdateTypeMeta(obj,gvk) }; GroupVersionKind() *GroupVersionKind
//
// TypeMeta is provided here for convenience. You may use it directly from this package or define
// your own with the same fields.
//
// +k8s:deepcopy-gen=false
// +protobuf=true
// +k8s:openapi-gen=true
type TypeMeta struct {
	// +optional
	APIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty" protobuf:"bytes,1,opt,name=apiVersion"`   //表示对象所属的 API 版本。
	// +optional
	Kind string `json:"kind,omitempty" yaml:"kind,omitempty" protobuf:"bytes,2,opt,name=kind"`  //表示对象的类型。
}
…… 后面省略了

我理解意思是说:举个在 Kubernetes 集群中创建或管理 Pod 对象时的例子,你可以使用 runtime.TypeMeta 结构体来设置 Pod 的 API 版本和类型信息。

首先,导入所需的包:

import (
    "fmt"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"
)

然后,创建一个 Pod 结构体,并嵌入 runtime.TypeMeta:

type Pod struct {
    runtime.TypeMeta `json:",inline"`
    // 其他 Pod 相关的字段
} 

接下来,我们可以实例化 Pod 对象并设置其 API 版本和类型信息:

func main() {
    pod := &Pod{
        TypeMeta: runtime.TypeMeta{
            APIVersion: "v1",
            Kind:       "Pod",
        },
        // 设置其他 Pod 相关字段的值
    }

    // 打印 API 版本和类型信息
    fmt.Println("API Version:", pod.APIVersion)
    fmt.Println("Kind:", pod.Kind)

    // 更新 API 版本和类型信息
    gv := schema.GroupVersion{Group: "", Version: "v1"}
    gvk := schema.GroupVersionKind{GroupVersion: gv, Kind: "Pod"}
    pod.SetGroupVersionKind(&gvk)

    // 打印更新后的 API 版本和类型信息
    fmt.Println("Updated API Version:", pod.APIVersion)
    fmt.Println("Updated Kind:", pod.Kind)
}

在上述示例中,我们创建了一个 Pod 对象,并将其 API 版本设置为"v1",类型设置为"Pod"。然后我们通过调用SetGroupVersionKind方法来更新 API 版本和类型信息。

通过打印输出,你可以看到该 Pod 对象的 API 版本和类型信息的值。

  其次,为啥pod.SetGroupVersionKind(&gvk)?

我理解意思是说:在 Kubernetes 中,runtime.TypeMeta 结构体有一个方法叫做 SetGroupVersionKind,该方法用于设置对象的 API 版本和类型信息。在示例代码中,我们使用 pod.SetGroupVersionKind(&gvk) 来更新 Pod 对象的 API 版本和类型信息。

首先,我们定义了一个 GroupVersionKind 结构体变量 gvk,它表示一个对象的组(Group)、版本(Version)和类型(Kind)的组合。然后,我们调用 pod.SetGroupVersionKind(&gvk) 以将这个 GroupVersionKind 设置到 Pod 对象中。

这个方法的内部实现逻辑如下:

func (t *TypeMeta) SetGroupVersionKind(gvk *schema.GroupVersionKind) {
    t.APIVersion = gvk.GroupVersion().String()
    t.Kind = gvk.Kind
}

在 SetGroupVersionKind 方法中,我们首先调用 GroupVersion() 方法获取 GroupVersion,并将其转换为字符串形式作为 API 版本。然后,我们将 Kind 设置为 GroupVersionKind 的 Kind 值。

通过调用 SetGroupVersionKind 方法,我们可以方便地更新 Pod 对象的 API 版本和类型信息。

posted @ 2023-06-28 14:32  左扬  阅读(108)  评论(0编辑  收藏  举报
levels of contents