Kubernetes开发(2)—API 资源对象的串联过程
发布日期:2021-06-29 11:37:47 浏览次数:2 分类:技术文章

本文共 1957 字,大约阅读时间需要 6 分钟。

声明式API 与资源对象

一般我们在k8s里声明一个新的资源对象,一般会先写一个声明式的yml, 里面对该资源进行描述/声明,最后apply/create一下进行资源的创建。

apiVersion: batch/v1kind: Jobmetadata:  name: demo  namespace: default.......

比如上面那个资源文件,就包含了资源的几个基本要素:

  1. 资源类型(Resource): jobs(一般是kind的小写复数形式)
  2. 资源组(Group):这里的batch就是资源所在的组
  3. 资源版本(Version):这里的资源版本
    实际的请求url就会基于以上3个要素进行拼接,比如:

然后在请求这个url之后,会根据路由绑定到对应的handler上,处理过程类似一般的webserver,根据路由会绑定到对应的处理流程上,再基于url本身申明的几大要素,进行一系列的处理,处理分为2大块,一块是预处理,一块是对资源的实际处理, 预处理一般就是做一些初步的过滤,比如权限是否够,上下文,接口调用超时等等,实际处理就是基于请求内容对资源进行操作。

Scheme

预处理过程后面再补,主要是看实际处理,在处理资源的时候需要对资源进行一些归纳整理成所需要的"格式", 这个"格式"就是Scheme,即资源类型。

代码位置在: staging/src/k8s.io/api 下面

其中, types.go 里放的就是具体的类型, 拿最常见的deployment举例子:

// Deployment enables declarative updates for Pods and ReplicaSets.type Deployment struct {	metav1.TypeMeta `json:",inline"`	// Standard object metadata.	// +optional	metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`	// Specification of the desired behavior of the Deployment.	// +optional	Spec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`	// Most recently observed status of the Deployment.	// +optional	Status DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`}

该结构体就是deployment 类型资源的所有组成, 其实只有4个单独的结构体组成。对比一个yaml 看下

apiVersion: apps/v1kind: Deployment  metadata:  name:  app1-deploy  namespace: defaultspec:  selector:      matchLabels:      app: app1  template:      metadata:      labels:        app: app1    spec:      containers:      - name: app1        image: app1        ports:        - containerPort: 80

具体的对应关系如下:

clientset 通过解析获得的scheme对象,然后进行后续操作。

zz_generated.deepcopy.go && register.go

如果需要自己编写一个资源对象,比如叫mydeployment的新资源需要注册到k8s集群里,其实本质操作就是让一个私有的scheme 对象添加到全局的scheme上。具体的操作就是通过deepcopy-gen 工具创建的定义各资源类型 DeepCopyObject() 方法的文件,所有注册到 Scheme 的资源类型都要实现 runtime.Object 接口上,随后通过register.go 将创建好的新scheme对象注册到全局,让clientset可以识别,之后就可以自定义controller ,通过clientset 对新定义的资源进行操作了。

个人公众号, 分享一些日常开发,运维工作中的日常以及一些学习感悟,欢迎大家互相学习,交流

在这里插入图片描述

转载地址:https://blog.csdn.net/zyxpaomian/article/details/116798882 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Kubernetes开发(3)-如何感知资源的实时变化
下一篇:Kubernetes开发(1)—环境以及代码目录结构

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月30日 18时52分22秒