kubernetes-资源类型scheme(三)
文章目录1.介绍2.types.go文件3.zz_generated.deepcopy.go:使用deepcopy-gen工具生成的文件4.register.go文件:1.介绍当我们操作资源类型和apiserver进行通信的时候,需要根据资源对象类型的Group、Version、kind以及规范定义、编解码等内容构成Schema类型,然后Clientset对象就可以来访问和操作这些资源了,Sche
1.介绍
当我们操作资源类型和apiserver进行通信的时候,需要根据资源对象类型的Group、Version、kind以及规范定义、编解码等内容构成Schema类型,然后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
├── BUILD
├── doc.go
├── generated.pb.go
├── generated.proto
├── register.go
├── types.go
├── types_swagger_doc_generated.go
└── zz_generated.deepcopy.go
0 directories, 8 files
- BUILD:kubernetes项目构建使用
- doc.go: 文本说明和代码生成工具标记
- generated.pb.go、generated.proto:grpc通信的定义
- register.go:定义AddToScheme()的函数,该函数作用注册各种资源类型对象到clientSet使用的scheme中
具体注册过程查看下面文件中runtime.SchemeBuilder()注册流程,
var Scheme = runtime.NewScheme() //全局的Schemed
staging/src/k8s.io/client-go/kubernetes/scheme/register.go
- generated.pb.go
- types_swagger_doc_generated.goZ:产生api文档
- types.go:定义资源对象的结构体,对应我们k8中编写的yaml文件
所有
staging/src/k8s.io/api/apps/v1/types.go
其中每结构体的完整定义都可以称为一个资源对象的模型
staging/src/k8s.io/api/apps/v1/zz_generated.deepcopy.go
func (in *Deployment) DeepCopyObject() runtime.Object {
if c := in.DeepCopy(); c != nil {
return c
}
return nil
}
DeepCopyObject是一个自动生成的deepcopy函数,会拷贝资源对象,创建一个runtime对象,因此所有的资源对象都需要实现该函数
deepcope-gen工具自动生成zz_generated.deepcopy.go文件,为什么要自动生成DeepCopyObject这些函数?
object
staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go
type Object interface {
GetObjectKind() schema.ObjectKind
DeepCopyObject() Object
}
所有的资源对象只要注册到schema当中的,都需要实现Object上面的接口,而GetObjectKind()接口已经被TypeMeta对象被实现,DeepCopyObject()需要自动生成:
func (obj *TypeMeta) GetObjectKind() schema.ObjectKind { return obj }
object->Deployment->GetObjectKind()->DeepCopyObject->实现了Object接口
2.types.go文件
其中types.go文件里面就是apps/v1这个GroupVersion下面的所有资源对象的定义, 有Deployment、DaemonSet、StatefulSet、ReplicaSet等几种资源对象,下面以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
// 对应deployment中spec中的信息
Spec DeploymentSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`
// Most recently observed status of the Deployment.
// +optional
// 对应deployment中status信息
Status DeploymentStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
}
type TypeMeta struct {
// Kind is a string value representing the REST resource this object represents.
// Servers may infer this from the endpoint the client submits requests to.
// Cannot be updated.
// In CamelCase.
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
// +optional
// 类型
Kind string `json:"kind,omitempty" protobuf:"bytes,1,opt,name=kind"`
// APIVersion defines the versioned schema of this representation of an object.
// Servers should convert recognized schemas to the latest internal value, and
// may reject unrecognized values.
// More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
// +optional
// api版本
APIVersion string `json:"apiVersion,omitempty" protobuf:"bytes,2,opt,name=apiVersion"`
}



根据上面的结构体信息 对照deployment配置以及状态进行对比理解即可
3.zz_generated.deepcopy.go:使用deepcopy-gen工具生成的文件
4.register.go文件:
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
// 注册所有apps/v1下面的对象到clienset所使用的schema当中去
AddToScheme = localSchemeBuilder.AddToScheme
)
// Adds the list of known types to the given scheme. 添加当前的资源对象添加到schema当中去
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(SchemeGroupVersion,
&Deployment{},
&DeploymentList{},
&StatefulSet{},
&StatefulSetList{},
&DaemonSet{},
&DaemonSetList{},
&ReplicaSet{},
&ReplicaSetList{},
&ControllerRevision{},
&ControllerRevisionList{},
)
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
return nil
}
staging/src/k8s.io/client-go/kubernetes/scheme/register.go


client-go进而就可以识别Scheme
更多推荐
所有评论(0)