kubernetes基础-GVR和GVK
初步认识 kubernetes 的 api 基础结构,GVR 和 GVK.
理解 GVK 和 GVR
-
GVK 就是 group、verison、kind
-
GVR 就是 group、version、resource
Group
在 kubernetes 对资源进行分组时,对应的数据结构就是 Group,源码路径:k8s.io/apimachinery/pkg/apis/meta/v1/types.go ,如下,可见 Group 有自己的名称和版本:
|
|
在 kubernetes 中有两种资源组:有组名资源组和无组名资源组(也叫核心资源组Core Groups),它们都很常见
deployment 有组名,pod 没有组名,咱们把它俩的 OpenAPI 放在一起对比就一目了然了
有组名资源组
有组名资源组 api 是复数的 apis,紧跟着后面的 apps 是组名, v1 是版本, deployments 是资源
create a Deployment
HTTP Request
POST /apis/apps/v1/namespaces/{namespace}/deployments
无组名资源组
有组名资源组 api 是单数的 api,后面没有组名, v1 是版本, pods 是资源
create create a Pod
HTTP Request
POST /api/v1/namespaces/{namespace}/pods
Version
这个好理解,kubernetes 的版本分为三种:
-
Alpha:内部测试版本,如 v1alpha1
-
Beta:经历了官方和社区测试的相对稳定版,如 v1beta1
-
Stable:正式发布版,如 v1、v2
在 Kubernetes 中,一个资源可能对应多个 Version,也可能对应多个 Group,因此通常使用GVK或GVR来区别特定的 Kubernetes 资源。
Resource
-
Resource资源在kubernetes中的重要性是不言而喻的,常见的资源如:pods、services、deployments -
在
kubernetes环境被实例化的资源即资源对象(ResourceObject) -
资源被分为持久性(Persistent Entity)和非持久性(Ephemeral Entity),持久性如
deployment,创建后会在etcd保存,非持久性如pod.
Kind
Kind 是 API 顶级资源对象的类型,每个资源对象都需要 Kind 来区分它自身代表的资源类型
一般来说,在 kubernetes API 中有三种不同的 Kind:
-
单个资源对象的类型,最典型的就是刚才例子中提到的
Pod -
资源对象的列表类型,例如
PodList以及NodeList等 -
特殊类型以及非持久化操作的类型,很多这种类型的资源是
subresource, 例如用于绑定资源的 /binding、更新资源状态的 /status 以及读写资源实例数量的 /scale
Kind 不止可以出现在同一分组的不同版本中,如 apps/v1beta1 与 apps/v1,它还可能出现在不同的分组中,例如 Deployment 开始以 alpha 的特性出现在 extensions 分组,GA 之后被推进到 apps 组,所以为了严格区分不同的 Kind,需要组合 API Group、API Version 与 Kind 成为 GVK。GVK 和 GVR 的区别
简单通俗点来讲:
Kind就是我们的资源种类,如Pod、Deployment等,Resource是Kind资源种类的资源子类,如:pods、services、deployments
二者有如下区别与联系:
-
GVR与HTTP请求里的PATH对应,查询Pod的请求GET /api/v1/namespaces/{namespace}/pods就是一个GVR。GVK与存储在ETCD中的Object类型对应。 -
GVR与GVK通过REST映射可进行转化。
使用客户端工具如 kubectl、clientSet、curl 时,首先会根据 GVR 生成请求,然后 Kubernetes API Server 会查询 HTTP PATH 对应的 Resource 是否支持,并与 ETCD 进行交互。
当 API Server 不支持该 Resource 时,Kubernetes 会报错the server doesn’t have a resource type “…”,使用 kubectl api-resources 命令可查看支持的 Resource。
官方 API 文档
在实际学习和开发中,对指定资源做增删改查操作时,官方文档是我们最可靠的依赖.
访问官方文档