本文共 1957 字,大约阅读时间需要 6 分钟。
声明式API 与资源对象
一般我们在k8s里声明一个新的资源对象,一般会先写一个声明式的yml, 里面对该资源进行描述/声明,最后apply/create一下进行资源的创建。
apiVersion: batch/v1kind: Jobmetadata: name: demo namespace: default.......
比如上面那个资源文件,就包含了资源的几个基本要素:
- 资源类型(Resource): jobs(一般是kind的小写复数形式)
- 资源组(Group):这里的batch就是资源所在的组
- 资源版本(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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!