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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐