Groups、Versions 和 Kinds 之间的关系

在开始编写 API 之前,让我们讨论一些关键术语

当描述 Kubernetes 中的 API 时,我们经常用到的四个术语是:groupsversionskindsresources

Groups 和 Versions

Kubernetes 中的 API Group 只是相关功能的集合, 每个 group 包含一个或者多个 versions, 这样的关系可以让我们随着时间的推移,通过创建不同的 versions 来更改 API 的工作方式。

Kinds 和 Resources

Kinds

每个 API group-version 包含一个或者多个 API 类型, 我们称之为 Kinds. 虽然同类型 Kind 在不同的 version 之间的表现形式可能不同,但是同类型 Kind 必须能够存储其他 Kind 的全部数据,也就是说同类型 Kind 之间必须是互相兼容的(我们可以把数据存到 fields 或者 annotations),这样当你使用老版本的 API group-version 时不会造成丢失或损坏, 有关更多信息,请参见Kubernetes API指南

Resources

你应该听别人提到过 ResourcesResourceKind 在 API 中的标识,通常情况下 KindResource 是一一对应的, 但是有时候相同的 Kind 可能对应多个 Resources, 比如 Scale Kind 可能对应很多 Resources:deployments/scale 或者 replicasets/scale, 但是在 CRD 中,每个 Kind 只会对应一种 Resource

请注意,Resource 始终是小写形式,并且通常情况下是 Kind 的小写形式。 具体对应关系可以查看 resource type

那么以上类型在框架中是如何定义的呢

当我们在一个特定的 group-version中使用 Kind 时,我们称它为 GroupVersionKind, 简称 GVK, 同样的 resources 我们称它为 GVR。 稍后我们将看到每个 GVK 都对应一个 root Go type (比如:Deployment 就关联着 K8s 源码里面 k8s.io/api/apps/v1 package 中的 Deployment struct)。

现在我们已经熟悉了一些关键术语,那么我们可以开始创建我们的 API 了!

额, 但是 Scheme 是什么东东?

Scheme 提供了 GVK 与对应 Go types(struct) 之间的映射(请不要和 godocs 中的 Scheme 混淆)

也就是说给定 Go type 就可以获取到它的 GVK,给定 GVK 可以获取到它的 Go type

例如,让我们假设 tutorial.kubebuilder.io/api/v1/cronjob_types.go 中的 CronJob 结构体在 batch.tutorial.kubebuilder.io/v1 API group 中(也就是说,假设这个 API group 有一种 Kind:CronJob,并且已经注册到 Api Server 中)

那么我们可以从 Api Server 获取到数据并反序列化至 &CronJob{}中,那么结果会是如下格式:

{
    "kind": "CronJob",
    "apiVersion": "batch.tutorial.kubebuilder.io/v1",
    ...
}

ps:这里翻译的不好,请继续向后看,慢慢就理解了 :)