资源类型Scheme

1、介绍

当我们操作资源和 apiserver 进行通信的时候,需要根据资源对象类型的 Group、Version、Kind 以及规范定义、编解码等内容构成 Scheme 类型,然后 Clientset 对象就可以来访问和操作这些资源类型了,Scheme 的定义主要在 api 子项目之中,源码仓库地址: https://github.com/kubernetes/api ,被同步到 Kubernetes 源码的 staging/src/k8s.io/api 之下。

主要就是各种资源对象的原始结构体定义,比如查看apps/v1目录下面的定义:

$ tree staging/src/k8s.io/api/apps/v1
staging/src/k8s.io/api/apps/v1
├── doc.go
├── generated.pb.go
├── generated.proto
├── register.go
├── types.go
├── types_swagger_doc_generated.go
└── zz_generated.deepcopy.go 0 directories, 7 files

2、types.go

其中 types.go 文件里面就是 apps/v1 这个 GroupVersion 下面所有的资源对象的定义,有 Deployment、DaemonSet、StatefulSet、ReplicaSet 等几个资源对象,比如 Deployment 的结构体定义如下所示:

由 TypeMeta、ObjectMeta、DeploymentSpec 以及 DeploymentStatus 4个属性组成,和我们使用 YAML 文件定义的 Deployment 资源对象也是对应的。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: default
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

其中 apiVersionkind 就是 TypeMeta 属性,metadata 属性就是 ObjectMeta,spec 属性就是 DeploymentSpec,当资源部署过后也会包含一个 status 的属性,也就是 DeploymentStatus ,这样就完整的描述了一个资源对象的模型。

3、zz_generated.deepcopy.go

上面定义的规范在 Kubernetes 中称为资源类型 Scheme,此外zz_generated.deepcopy.go 文件是由 deepcopy-gen 工具创建的定义各资源类型 DeepCopyObject() 方法的文件,所有注册到 Scheme 的资源类型都要实现 runtime.Object 接口:

// staging/src/k8s.io/apimachinery/pkg/runtime/interface.go
type Object interface {
GetObjectKind() schema.ObjectKind
DeepCopyObject() Object
}

而所有的资源类型都包含一个 TypeMeta 类型,而该类型实现了 GetObjectKind() 方法,所以各资源类型只需要实现 DeepCopyObject() 方法即可:

// staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }

各个资源类型的 DeepCopyObject() 方法也不是手动定义,而是使用 deepcopy-gen 工具命令统一自动生成的,该工具会读取 types.go 文件中的 +k8s:deepcopy-gen 注释,以 Deployment 为例:

// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

// Deployment enables declarative updates for Pods and ReplicaSets.
type Deployment struct {
......
}

然后将自动生成的代码保存到 zz_generated.deepcopy.go 文件中。

4、register.go文件

register.go 文件的主要作用是定义AddToScheme函数,将各种资源类型注册到 ``Clientset 使用的 Scheme 对象中去,由于每个资源自动生成了 DeepCopyObject() 方法,这样资源就实现了 runtime.Object `接口,所以可以注册到 Scheme 中去了。

// staging/src/k8s.io/api/apps/v1/register.go

var (
// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api.
// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes.
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
localSchemeBuilder = &SchemeBuilder
// 对外暴露的 AddToScheme 方法用于注册该 Group/Version 下所有资源类型
AddToScheme = localSchemeBuilder.AddToScheme
) // staging/src/k8s.io/client-go/kubernetes/scheme/register.go // 定义一个 Scheme,将各类资源对象都添加到该Scheme
var Scheme = runtime.NewScheme()
// 为 Scheme 中的所有类型创建一个编解码工厂
var Codecs = serializer.NewCodecFactory(Scheme)
// 为 Scheme 中的所有类型创建一个参数编解码工厂
var ParameterCodec = runtime.NewParameterCodec(Scheme)
// 将各 k8s.io/api/<Group>/<Version> 目录下资源类型的 AddToScheme() 方法注册到 SchemeBuilder 中
var localSchemeBuilder = runtime.SchemeBuilder{
admissionregistrationv1.AddToScheme,
admissionregistrationv1beta1.AddToScheme,
internalv1alpha1.AddToScheme,
appsv1.AddToScheme,
appsv1beta1.AddToScheme,
appsv1beta2.AddToScheme,
authenticationv1.AddToScheme,
authenticationv1beta1.AddToScheme,
authorizationv1.AddToScheme,
authorizationv1beta1.AddToScheme,
autoscalingv1.AddToScheme,
autoscalingv2.AddToScheme,
autoscalingv2beta1.AddToScheme,
autoscalingv2beta2.AddToScheme,
batchv1.AddToScheme,
batchv1beta1.AddToScheme,
certificatesv1.AddToScheme,
certificatesv1beta1.AddToScheme,
coordinationv1beta1.AddToScheme,
coordinationv1.AddToScheme,
corev1.AddToScheme,
discoveryv1.AddToScheme,
discoveryv1beta1.AddToScheme,
eventsv1.AddToScheme,
eventsv1beta1.AddToScheme,
extensionsv1beta1.AddToScheme,
flowcontrolv1alpha1.AddToScheme,
flowcontrolv1beta1.AddToScheme,
flowcontrolv1beta2.AddToScheme,
networkingv1.AddToScheme,
networkingv1beta1.AddToScheme,
nodev1.AddToScheme,
nodev1alpha1.AddToScheme,
nodev1beta1.AddToScheme,
policyv1.AddToScheme,
policyv1beta1.AddToScheme,
rbacv1.AddToScheme,
rbacv1beta1.AddToScheme,
rbacv1alpha1.AddToScheme,
schedulingv1alpha1.AddToScheme,
schedulingv1beta1.AddToScheme,
schedulingv1.AddToScheme,
storagev1beta1.AddToScheme,
storagev1.AddToScheme,
storagev1alpha1.AddToScheme,
} var AddToScheme = localSchemeBuilder.AddToScheme func init() {
v1.AddToGroupVersion(Scheme, schema.GroupVersion{Version: "v1"})
// 调用 SchemeBuilder 中各资源对象的 AddToScheme() 方法,将它们注册到到 Scheme 对象
utilruntime.Must(AddToScheme(Scheme))
}

将各类资源类型注册到全局的 Scheme 对象中,这样 Clientset 就可以识别和使用它们了。

apimachinery 子项目主要是 Kubernetes 服务端和客户端项目都共同依赖的一些公共方法、struct、工具类的定义,主要服务于 kubernetes、client-go、apiserver 这三个项目。

资源类型Scheme的更多相关文章

  1. PHP资源类型

    在PHP中,我们经常使用到资源类型变量.例如:mysql连接.文件句柄等. 这些变量无法使用标量来表示,那么在Zend内核中是如何将PHP中的资源变量与C语言中的资源衔接的呢? 一.资源变量在PHP中 ...

  2. php扩展开发-资源类型

    资源类型在内核中的结构 //zend_list.h typedef struct _zend_rsrc_list_entry { void *ptr; int type; int refcount; ...

  3. [置顶] kubernetes资源类型--PetSets/StatefulSet

    PetSet首次在K8S1.4版本中,在1.5更名为StatefulSet.除了改了名字之外,这一API对象并没有太大变化. 注意:以下内容的验证环境为CentOS7.K8S版本1.5.2,并部署Sk ...

  4. [置顶] kubernetes资源类型--持久化存储Persistent Volume和Persistent Volume Claim

    概念 存储管理跟计算管理是两个不同的问题.理解每个存储系统是一件复杂的事情,特别是对于普通用户来说,有时并不需要关心各种存储实现,只希望能够安全可靠地存储数据. 为了简化对存储调度,K8S对存储的供应 ...

  5. PHP-Manual的学习----【语言参考】----【类型】-----【Resource 资源类型】

    2017年8月24日11:29:361.资源 resource 是一种特殊变量,保存了到外部资源的一个引用.资源是通过专门的函数来建立和使用的.2.由于资源类型变量保存有为打开文件.数据库连接.图形画 ...

  6. PHP的资源类型

    PHP的资源类型 php的资源类型 常见的有:打开文件.数据库连接.图形画布等. 常用操作:创建.使用.释放. 以文件操作为示例: //文件路径 $file_url = './data.txt'; / ...

  7. 关于k8s资源类型和缩写

    资源类型 缩写 描述 clusters     componentstatuses cs   configmaps cm   daemonsets ds   deployments deploy   ...

  8. Kubernetes--Ingress资源类型

    Ingress资源类型 基于HTTP暴露的每个Service资源均可发布于一个独立的FQDN主机名之上,如 " www.ik8s.io " :也可发布于某主机上的URL路径之上,从 ...

  9. [置顶] kubernetes资源类型--ingress

    Ingress在K8S1.1之前还没有. 概念 Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端. Ingress是一个允许入 ...

  10. 现代Web的资源/类型/元素--发展趋势

    5月6日,谷歌开发者中心推出了一个 Web 开发最佳实践手册.伯乐在线资源频道摘编该资源后,已邀请一些关注 Web 开发的朋友参与翻译手册. 由于译者朋友几乎都是已在职,都是在工作之余参与,每位的翻译 ...

随机推荐

  1. mdn拾遗-- 纯html+css实现的input的验证

    关于input的验证,其实从很古老的前端时代开始就一直采用一种比较可靠的方式,就是js操作dom,今天浏览mdn时发现了h5的验证方法,很是兴奋.感觉值得一记. 说在前面的话,着重就是配合h5 + c ...

  2. Ubuntu下如何管理多个ssh密钥

    Ubuntu下如何管理多个ssh密钥 前言 ‍ 我一直在逃避这个问题,误以为我能够单纯地用一个 ssh 走天下. 好吧,现实是我不得不管理多个 ssh 做,那就写个博客总结一下吧. 查阅后发现前人已经 ...

  3. mysql查询指定表所有的字段信息 columns

    show columns from 表名: desc 表名;(全写:describe 表名) show create table 表名;

  4. 入门Dify平台:如何根据需求选择与创建最合适的应用

    今天我们将继续深入讲解Dify,重点介绍如何创建应用.具体来说,我们将探讨如何根据不同的需求来决定选择什么类型的应用最为合适,帮助大家更好地理解在Dify平台上构建应用的最佳实践. 创建空白应用 首先 ...

  5. 手把手教你安装TrueNas(基础篇)

            玩过蜗牛星际,体验过黑群晖系统崩掉导致里面珍藏12t大姐姐全没了(此处有哭声),我技术又菜,自己恢复是不可能恢复的,装的盗版系统,又不可能联系群晖官方售后恢复.于是乎就想要一个稳定.开 ...

  6. 网络编程-关闭连接(2)-Java的NIO在关闭socket时,究竟用了哪个系统调用函数?

    背景 在上一讲网络编程-关闭连接-C/C++相关系统调用中,提到过,目前项目使用Netty框架来实现的网络编程,查看netty源码可以得知,netty最终是调用了java Nio的close接口做的关 ...

  7. github release 下载文件慢、或者失败的解决方法

    Free Download Manager 下载工具可以解决Github 下载缓慢或失败问题. 扫描下方二维码,关注公众号 回复github,即可获取下载链接.

  8. STM32_RTOS_V2编程模板1-消息队列

    #pragma region QUEUE1 // 1DEFINE osMessageQueueId_t queueDemo1 = NULL; // 2INIT queueDemo1 = osMessa ...

  9. Asp.net mvc基础(十)判断是否是ajax请求

    通过Request.IsAjaxRequest()方法进行判断是否是ajax的请求,true是ajax的请求,false不是ajax的请求 后端: 前端: 效果: 使用Request.IsAjaxRe ...

  10. python,循环中加入等待时间,使每一次循环后随机等待一段时间

    爬虫爬取网页数据的时候,有时候因访问频率太过于规律导致被服务器发现,出现访问超时或者被封ip的情况.所以,每一轮爬取,后面加一个随时等待时间,可以减少被发现的概率 主要用到random和time库 实 ...