GVK和GVR
一、GVK与GVR
在Kubernetes体系中,资源是最重要的概念。Kubernetes使用Group、Version、Resource、Kind来描述

Group即资源组,在kubernetes中有两种Group:有组名资源组和无组名资源组(也叫核心资源组Core Groups)。如deployment有组名,pod没有组名。核心资源组API为api/v1,非核心资源组API为/apis/group/version。
Version即版本,kubernetes的版本分为三种:
1)Alpha:内部测试版本,如v1alpha1
2)Beta:经历了官方和社区测试的相对稳定版,如v1beta1
3)Stable:正式发布版,如v1、v2
在Kubernetes中,一个资源可能对应多个Version,也可能对应多个Group,因此通常使用GVK或GVR来区别特定的Kubernetes资源。二者有如下区别与联系:
1)GVR与HTTP请求里的PATH对应,查询Pod的请求GET /api/v1/namespaces/{namespace}/pods就是一个GVR。GVK与存储在ETCD中的Object类型对应。
2)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。
二、GVR详细说明
从上一篇中的 CRD 定义中,可以发现在 Kubernetes 中要想完成一个 CRD,需要指定 group/kind 和 version,这个在 Kubernetes 的 API Server 中简称为 GVK。GVK 是定位一种类型的方式,例如,daemonsets 就是 Kubernetes 中的一种资源,当我们跟 Kubernetes 说我想要创建一个 daemonsets 的时候,kubectl 是如何知道该怎么向 API Server 发送呢?是所有的不同资源都发向同一个 URL,还是每种资源都是不同的?
这就得看回我定义 daemonsets 的描述文件了
[root@liqiang.io]# head -4 00-sample-daemonsets.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
这里我就声明了 apiVersion 是 apps/v1,其实就是隐含了 Group 是 apps,Version 是 v1,Kind 就是定义的 DaemonSet,而 kubectl 接收到这个声明之后,就可以根据这个声明去调用 API Server 对应的 URL 去获取信息,例如这个就是 /api/apps/v1/daemonset(kubetl 怎么知道 DaemonSet 对应的就是 daemonset?第一篇有说到)
可能到这里你已经猜到了,Kubernetes 组织资源的方式是以 REST 的 URI 的形式来的,而组织的路径就是:

额,不对,不是说是 G(roup)V(ersion)K(ind) 的吗,怎么这里又是 G(roup)V(ersion)R(ource) ?嘿,是的,这就是 API Server 中的第二个概念,GVR
三、REST Mapping
当我们要定义一个 GVR 的时候,那么怎么知道这个 GVR 是属于哪个 GVK 的呢?也就是前面说的,kubectl 是如何从 YAML 描述文件中知道该请求的是哪个 GVR URL?这就是 REST Mapping 的功能,REST Mapping 可以指定一个 GVR(例如 daemonset 的这个例子),然后它返回对应的 GVK 以及支持的操作等。
在代码中,其实就对应于这个接口
这样,就把 GVK 和 GVR 联系起来了
四、scheme
Scheme 存储了 GVK 和 Go type 的映射关系
五、API Server
既然,前面都说了,API Server 可以通过 URI 的形式访问到资源,那么这里我就来实战一下,一般来说,如果是正常安装的 Kubernetes 集群,那么肯定会有 http 证书以及认证证书,这会让我的尝试很麻烦,所以,为了去掉这重麻烦,我会通过 kubectl proxy 来代理一个本地的 API Server 端口,这样就可以绕过认证了,直接可以以 http 的形式进行
[root@liqiang.io]# kubectl proxy --port=9090
Starting to serve on 127.0.0.1:9090
然后直接访问 API Server:
[root@liqiang.io]# GET http://127.0.0.1:9090/apis/apps/v1/daemonsets/
{
"kind": "DaemonSetList",
"apiVersion": "apps/v1",
"metadata": {
"selfLink": "/apis/apps/v1/daemonsets/",
"resourceVersion": "209282"
},
"items": [
{
"metadata": {
"name": "svclb-traefik",
"namespace": "kube-system",
"selfLink": "/apis/apps/v1/namespaces/kube-system/daemonsets/svclb-traefik",
"uid": "bd42f48c-42de-4df6-96bd-15e56bdfaec7",
"resourceVersion": "176921",
"generation": 2,
... ...
六、核心资源
如果想看系统支持哪些 GVK,那么可以通过 kubectl 的命令查看
[root@liqiang.io]# k api-resources

GVK和GVR的更多相关文章
- Gvr SDK for Unity 分析(二)
前言 关于google vr sdk的具体使用,传送门 Gvr SDK for Unity 分析(一) Google Daydream平台已经整合进Google VR SDK 本文环境:Unity5. ...
- Gvr SDK for Unity 分析(一)
Gvr SDK概述 通过谷歌VR SDK for unity 为Android和iOS 构建虚拟现实应用程序 unity SDK在Android上支持构建应用程序for daydream 和 card ...
- Unity3D 接完GVR SDk后如何插入自己的java代码
1.用Eclipse创建一个Android Application Project 2.用压缩软件打开gvr_android_common.aar和unitygvractivity.aar,分别把里面 ...
- AR , VR, GVR ...
虚拟现实与增强现实(眼镜或头盔)的现状与未来-简介http://blog.csdn.net/yanzhanyi/article/details/41982033 Google VR | Googl ...
- The Honeynet ProjectThe Honeynet Project
catalogue . 蜜罐基本概念 . Kippo: SSH低交互蜜罐安装.使用 . Dionaea: 低交互式蜜罐框架部署 . Thug . Amun malware honeypots . Gl ...
- 资深专家深度剖析Kubernetes API Server第1章(共3章)
欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现.如果你对Kubernetes的内部实现机制比较 ...
- 深入解析 Kubebuilder:让编写 CRD 变得更简单
作者 | 刘洋(炎寻) 阿里云高级开发工程师 导读:自定义资源 CRD(Custom Resource Definition)可以扩展 Kubernetes API,掌握 CRD 是成为 Kubern ...
- 深度剖析Kubernetes API Server三部曲 - part 1
欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现.如果你对Kubernetes 的内部实现机制比 ...
- operator 之旅(一)
环境准备 依赖版本 MAC M1 kubernetes: 1.18.3 go: 1.17.6 kubebuilder:3.1.0 知识必备 Kubernetes的Group.Version.Resou ...
- Kubernetes API 基础
APIServer 在kubernetes架构概念层面上,Kubernetes由一些具有不同角色的服务节点组成.而master的控制平面由 Apiserver Controller-manager 和 ...
随机推荐
- Visual Studio 2017(vs2017)绿色便携版-北桃特供
原版的VisualStudio2017有几十G,安装起来特别慢,不少用户叫苦连天.该版本是精简过的vs2017,且简化了原来的安装程序,特别适用于教学.个人开发者.某些要求不高的企业. 该绿色便携版是 ...
- VUE学习-监听事件
监听事件 事件处理方法可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码. <div id="app"> <button v ...
- iOS设备和模块解耦-方案对比
问题: 第一点,我们的设备之间,通过设备类型进行区分,然后分别跳转到不同的界面.导致不同设备会对同一个类别进行操作. 就会造成代码耦合,后续对类别进行增删改就会导致并行开发中容易出现代码冲突或者代码 ...
- vue中aciton使用的自我总结
一.需求: 我需要从后台中获取菜单列表在路由守卫中进行限制. 二.遇到的问题: action中setMenuData的方法如下: actions: { setMenuData(context){ ge ...
- 2022年了!还在用定时器实现动画?赶紧试试requestAnimationFrame吧!
前言 作为一名前端开发者,相信你一定接触过动画.还记得最开始学习前端时,我们曾尝试使用 JS 实现各种动画效果,比如轮播图等等.随着前端技术的不断更新,我们实现动画的方式变得多种多样了,比如使用JS. ...
- C 数值类型与字节数组相互转化
C 数据类型与字节数组相互转化 uint16_t -> bytes uint8_t uint16_t2bytes(uint8_t* buffer, uint16_t data) { if(buf ...
- Kubernetes--管理Pod对象的容器(3)
共享节点的网络名称空间 同一个Pod对象的各容器均运行于一个独立的.隔离的Network名称空间中,共享同一个网络协议栈及相关的网络设备.也有一些特殊的Pod对象需要运行于所在节点的名称空间中,执行系 ...
- mac使用expect登录跳板机后的机器
两个文档 #!/usr/bin/expect -f #连接文件名字记录 set ip [lindex $argv 0] catch {spawn ssh 1.1.1.1}## ip地址换成自己的 ex ...
- Java笔记_成员方法传参机制
成员方法传参机制(非常重要) Parameter(参数).Method(方法).Exercise(练习) 基本数据类型的传参机制 看一下案例,将main中的值传递给类中对象 /** * @ClassN ...
- 剑指 Offer II 动态规划
088. 爬楼梯的最少成本 class Solution { public: int minCostClimbingStairs(vector<int>& cost) { int ...