有關(guān)做美食的網(wǎng)站王通seo教程
云原生學(xué)習(xí)路線導(dǎo)航頁(yè)(持續(xù)更新中)
- 本文是 Kubernetes operator學(xué)習(xí) 系列第五篇,主要對(duì) k8s.io/api 和 k8s.io/apimachinery 兩個(gè)項(xiàng)目 進(jìn)行學(xué)習(xí)
- 基于 kubernetes v1.24.0 代碼分析
- Kubernetes operator學(xué)習(xí)系列 快捷鏈接
- Kubernetes operator(一)client-go篇
- Kubernetes operator(二)CRD篇
- Kubernetes operator(三)code-generator 篇
- Kubernetes operator(四)controller-tools 篇
- Kubernetes operator(五)api 和 apimachinery 篇
1.k8s.io/api 項(xiàng)目
1.1.k8s.io/api 項(xiàng)目是什么
- 一開(kāi)始,kubernetes的 內(nèi)建資源 還不太多,內(nèi)建資源的 結(jié)構(gòu)定義,都是放在項(xiàng)目里維護(hù)的。
- 后來(lái)為了方便資源的管理和擴(kuò)展,將 所有內(nèi)建資源 的結(jié)構(gòu)定義文件、scheme注冊(cè)文件、deepcopy等文件,放入了 staging/src 目錄下,作為一個(gè)單獨(dú)的項(xiàng)目維護(hù)。該項(xiàng)目的名稱就是
k8s.io/api
- 因此,簡(jiǎn)單來(lái)說(shuō),
k8s.io/api
項(xiàng)目,維護(hù)著 Kubernetes 所有內(nèi)建資源 的 struct定義。
1.2.k8s.io/api 的源碼分析
- 下圖中的每一個(gè)目錄,都代表一個(gè)group
- 一個(gè) Group 下,可能會(huì)存在多個(gè) Version
- 每個(gè)version下,都會(huì)包含三個(gè)文件:
doc.go、register.go、types.go
。- doc.go:聲明了按照 package 維度,為所有 structs 提供生成的聲明
- types.go:編寫(xiě)資源的詳細(xì)結(jié)構(gòu),一般包括:資源、資源List、資源Spec、資源Status 的詳細(xì)定義
- register.go:提供注冊(cè)到 runtime.Scheme 的函數(shù)
- 以
apps/v1/types.go
為例,查看其內(nèi)容,發(fā)現(xiàn)包含GroupVersion=apps/v1
下的所有Resource結(jié)構(gòu)定義。- 下圖只截出了一部分,沒(méi)有截出全部。
- 下圖只截出了一部分,沒(méi)有截出全部。
- 因此,我們操作內(nèi)建資源的時(shí)候,所有 GVK 內(nèi)建資源的結(jié)構(gòu),都是由
k8s.io/api
這個(gè)項(xiàng)目提供的。
2.k8s.io/apimachinery 項(xiàng)目
2.1.k8s.io/apimachinery 項(xiàng)目是什么
k8s.io/apimachinery
項(xiàng)目是一個(gè)關(guān)于Kubernetes API資源的工具集,為k8s.io/api
項(xiàng)目所有的資源,提供下列能力。- ObjectMeta與TypeMeta
- Scheme
- RESTMapper
- 編碼與解碼
- 版本轉(zhuǎn)換
- …
- 有了
k8s.io/apimachinery
,就可以很方便的操作 kubernetes API。
2.2.k8s.io/apimachinery 提供 TypeMeta 與 ObjectMeta
- TypeMeta 與 ObjectMeta 是特別常用的兩個(gè)數(shù)據(jù)結(jié)構(gòu)。kubernetes 的每一個(gè)資源,都會(huì)包含一個(gè) TypeMeta、一個(gè)ObjectMeta。
- TypeMeta是內(nèi)嵌的,轉(zhuǎn)json的時(shí)候不會(huì)有嵌套結(jié)構(gòu)
- ObjectMeta,json標(biāo)簽就是 metadata
type Pod struct {metav1.TypeMeta `json:",inline"`metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"`Spec PodSpec `json:"spec,omitempty" protobuf:"bytes,2,opt,name=spec"`Status PodStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` }
- TypeMeta:位于
apimachinery/pkg/runtime/types.go
type TypeMeta struct {// +optionalAPIVersion string `json:"apiVersion,omitempty" yaml:"apiVersion,omitempty" protobuf:"bytes,1,opt,name=apiVersion"`// +optionalKind string `json:"kind,omitempty" yaml:"kind,omitempty" protobuf:"bytes,2,opt,name=kind"` }
- ObjectMeta:位于
apimachinery/pkg/apis/meta/v1/types.go
type ObjectMeta struct {Name string `json:"name,omitempty" protobuf:"bytes,1,opt,name=name"`GenerateName string `json:"generateName,omitempty" protobuf:"bytes,2,opt,name=generateName"`Namespace string `json:"namespace,omitempty" protobuf:"bytes,3,opt,name=namespace"`SelfLink string `json:"selfLink,omitempty" protobuf:"bytes,4,opt,name=selfLink"`UID types.UID `json:"uid,omitempty" protobuf:"bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID"`ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,6,opt,name=resourceVersion"`Generation int64 `json:"generation,omitempty" protobuf:"varint,7,opt,name=generation"`CreationTimestamp Time `json:"creationTimestamp,omitempty" protobuf:"bytes,8,opt,name=creationTimestamp"`DeletionTimestamp *Time `json:"deletionTimestamp,omitempty" protobuf:"bytes,9,opt,name=deletionTimestamp"`DeletionGracePeriodSeconds *int64 `json:"deletionGracePeriodSeconds,omitempty" protobuf:"varint,10,opt,name=deletionGracePeriodSeconds"`Labels map[string]string `json:"labels,omitempty" protobuf:"bytes,11,rep,name=labels"`Annotations map[string]string `json:"annotations,omitempty" protobuf:"bytes,12,rep,name=annotations"`OwnerReferences []OwnerReference `json:"ownerReferences,omitempty" patchStrategy:"merge" patchMergeKey:"uid" protobuf:"bytes,13,rep,name=ownerReferences"`Finalizers []string `json:"finalizers,omitempty" patchStrategy:"merge" protobuf:"bytes,14,rep,name=finalizers"`ZZZ_DeprecatedClusterName string `json:"clusterName,omitempty" protobuf:"bytes,15,opt,name=clusterName"`ManagedFields []ManagedFieldsEntry `json:"managedFields,omitempty" protobuf:"bytes,17,rep,name=managedFields"` }
2.3.k8s.io/apimachinery 的rumetime/schema包提供 GVRK 各種數(shù)據(jù)結(jié)構(gòu)
- 在kubernetes中,為了方便描述資源,或描述REST 的URL,提出了5個(gè)概念:
- GV:GroupVersion
- GR:GroupResource
- GVR:GroupVersionResource
- GK:GroupKind
- GVK:GroupVersionKind
- 其中,GR、GVR都是用來(lái)描述 RESTFUL API 的,GK、GVK都是用來(lái)描述資源類型的
- 這 5種數(shù)據(jù)結(jié)構(gòu)的 struct 定義,都是寫(xiě)在
k8s.io/apimachinery/pkg/runtime/schema/group_version.go
文件中 - 該文件中還提供了這5種數(shù)據(jù)結(jié)構(gòu)相互轉(zhuǎn)換的方法
-
其中,APIVersion Kind,就是我們平時(shí)寫(xiě)yaml看到的apiVersion:
Group/Version
Kind
-
各結(jié)構(gòu)的轉(zhuǎn)換方法如下:
-
源碼如下:
-
2.4.k8s.io/apimachinery 提供 scheme 數(shù)據(jù)結(jié)構(gòu)
2.4.1.資源的internal版本、external版本
2.4.1.1.資源的internal版本、external版本是什么
- kubernetes的資源,并非一下就確定好的,是有一個(gè)發(fā)展過(guò)程的,因此一個(gè)資源Kind,可能在多個(gè) GroupVersion 下同時(shí)存在。比如 Deployment,在apps/v1下存在,在apps/v1beta1下也存在。
- 那么,在kubernetes的開(kāi)發(fā)者想要處理Deployment的時(shí)候,到底應(yīng)該按照哪個(gè)版本寫(xiě)程序呢?
- 按理說(shuō),每一種GVK都要有相應(yīng)的處理方法。
- 但是這樣實(shí)在是太繁瑣了,維護(hù)起來(lái)不方便,還會(huì)有大量重復(fù)代碼
- 因此,為每一種GK,維護(hù)了一個(gè)internal版本,作為中轉(zhuǎn)節(jié)點(diǎn)。
apps/v1/Deployment
和apps/v1beta1/Deployment
的相互轉(zhuǎn)換,均是先轉(zhuǎn)成internal的Deployment,再轉(zhuǎn)成 對(duì)外的版本- kubernetes的作者們,只需要對(duì)
internal版本
的資源編寫(xiě)邏輯,就可以處理所有version的資源
- 這種設(shè)計(jì)方式,將GVK之間的 拓?fù)浣Y(jié)構(gòu),變成了星型結(jié)構(gòu),非常巧妙。
2.4.1.2.internal版本 和 external版本 相互轉(zhuǎn)換的源碼位置
kubernetes/pkg/apis
中,每個(gè)目錄都是一個(gè)group,每個(gè)group都有一個(gè) internal 的 資源 types.go 文件
- external 資源 --> internal 資源 的方法
2.4.2.scheme的作用
- kubernetes的資源版本太多了,沒(méi)有誰(shuí)專門(mén)有時(shí)間去維護(hù),還是讓資源自己來(lái)注冊(cè)比較方便。
- scheme就是為資源注冊(cè)信息設(shè)計(jì)的一個(gè)數(shù)據(jù)結(jié)構(gòu),每個(gè)GVK,將自己的信息封裝成一個(gè)scheme對(duì)象,并將這個(gè)scheme對(duì)象交給APIServer統(tǒng)一管理,API Server就能夠認(rèn)識(shí)這種 GVK 了
- 在k8s.io/api 項(xiàng)目中,每一個(gè)GV下都有一個(gè)register.go文件,里面就是將當(dāng)前GV下的所有Kind,注冊(cè)到 APIServer 的統(tǒng)一scheme中去。比如
staging/src/k8s.io/api/apps/v1/register.go
文件,package v1import (metav1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/apimachinery/pkg/runtime""k8s.io/apimachinery/pkg/runtime/schema" )// GroupName is the group name use in this package const GroupName = "apps"// SchemeGroupVersion is group version used to register these objects var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}// Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource {return SchemeGroupVersion.WithResource(resource).GroupResource() }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 = &SchemeBuilderAddToScheme = localSchemeBuilder.AddToScheme )// Adds the list of known types to the given scheme. 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 }
2.4.3.k8s.io/apimachinery 提供 scheme 數(shù)據(jù)結(jié)構(gòu)
- 根據(jù)前面的描述,我們知道scheme是一個(gè)數(shù)據(jù)結(jié)構(gòu),它的struct其實(shí)就是 k8s.io/apimachinery 提供的
- 在
staging/src/k8s.io/apimachinery/pkg/runtime/scheme.go
文件中,有 Scheme 結(jié)構(gòu)type Scheme struct {// map,記錄 gvk-->type。其中type是通過(guò)反射的方式記錄的gvkToType map[schema.GroupVersionKind]reflect.Type// map,記錄 type-->gvktypeToGVK map[reflect.Type][]schema.GroupVersionKind// map,記錄 type-->gvk。像pod這種,只有一個(gè)version的,就記錄在這里。unversionedTypes map[reflect.Type]schema.GroupVersionKind// map,記錄 gvk-->type。像pod這種,只有一個(gè)version的,就記錄在這里。unversionedKinds map[string]reflect.Type// Map from version and resource to the corresponding func to convert// resource field labels in that version to internal version.fieldLabelConversionFuncs map[schema.GroupVersionKind]FieldLabelConversionFunc// map,記錄默認(rèn)方法。為某一個(gè)具體的type,設(shè)置默認(rèn)值defaulterFuncs map[reflect.Type]func(interface{})// 轉(zhuǎn)換器converter *conversion.Converter// 記錄version的優(yōu)先級(jí)。當(dāng)沒(méi)有選擇version的時(shí)候,優(yōu)先使用誰(shuí)versionPriority map[string][]string// observedVersions keeps track of the order we've seen versions during type registrationobservedVersions []schema.GroupVersion// schemeName is the name of this scheme. If you don't specify a name, the stack of the NewScheme caller will be used.// This is useful for error reporting to indicate the origin of the scheme.schemeName string }
- Scheme結(jié)構(gòu)中,所有的字段首字母都是小寫(xiě)的,即非導(dǎo)出的,外界無(wú)法訪問(wèn)。為此,
staging/src/k8s.io/apimachinery/pkg/runtime/scheme.go
文件中還提供了一個(gè)方法 NewScheme(),用于初始化一個(gè)空的Scheme對(duì)象func NewScheme() *Scheme {s := &Scheme{gvkToType: map[schema.GroupVersionKind]reflect.Type{},typeToGVK: map[reflect.Type][]schema.GroupVersionKind{},unversionedTypes: map[reflect.Type]schema.GroupVersionKind{},unversionedKinds: map[string]reflect.Type{},fieldLabelConversionFuncs: map[schema.GroupVersionKind]FieldLabelConversionFunc{},defaulterFuncs: map[reflect.Type]func(interface{}){},versionPriority: map[string][]string{},schemeName: naming.GetNameFromCallsite(internalPackages...),}s.converter = conversion.NewConverter(nil)// Enable couple default conversions by default.utilruntime.Must(RegisterEmbeddedConversions(s))utilruntime.Must(RegisterStringConversions(s))return s }
- 此外,
staging/src/k8s.io/apimachinery/pkg/runtime/scheme.go
文件還提供了很多方法,用于將GVK注冊(cè)到Scheme對(duì)象中。用的比較多的是AddKnownTypes()方法func (s *Scheme) AddKnownTypes(gv schema.GroupVersion, types ...Object) {s.addObservedVersion(gv)for _, obj := range types {t := reflect.TypeOf(obj)if t.Kind() != reflect.Ptr {panic("All types must be pointers to structs.")}t = t.Elem()s.AddKnownTypeWithName(gv.WithKind(t.Name()), obj)} }
2.5.3.Scheme結(jié)構(gòu)提供的常用方法
2.5.3.1.AddKnownTypes
- 方法簽名:
func (s *Scheme) AddKnownTypes(gv schema.GroupVersion, types ...Object)
- 方法功能:向 scheme 中注冊(cè)GVK,參數(shù)1 gv 表示 GroupVersion,參數(shù)2 types 是具體的 Kind 類型
- 舉例:
staging/src/k8s.io/api/apps/v1/register.go
文件中,使用 AddKnownTypes 方法,將apps/v1下的所有Kind,都注冊(cè)到scheme中去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 }
2.5.3.2.KnownTypes
- 方法簽名:
func (s *Scheme) KnownTypes(gv schema.GroupVersion) map[string]reflect.Type
- 方法功能:獲取指定GV下所有Kind的Type類型
- 舉例
types := Scheme.KnownTypes(schema.GroupVersion{Group: "apps",Version: "v1", })
2.5.3.3.VersionsForGroupKind
- 方法簽名:
func (s *Scheme) VersionsForGroupKind(gk schema.GroupKind) []schema.GroupVersion
- 方法功能:獲取指定GK的所有Versions,并以GV列表的形式返回
- 舉例
groupVersions := Scheme.VersionsForGroupKind(schema.GroupKind{Group: "apps",Kind: "Deployment", }) // 輸出 ["apps/v1" "apps/v1beta1" "apps/v1beta2"]
2.5.3.4.ObjectKinds
- 方法簽名:
func (s *Scheme) ObjectKinds(obj Object) ([]schema.GroupVersionKind, bool, error)
- 方法功能:獲取指定object 的 所有可能的 group、version、kind 值,并以 GVK 列表的形式返回
- 舉例
gvks, notVersioned, err := Scheme.ObjectKinds(&appsv1.Deployment{}) // 輸出 ["apps/v1 Deployment"]
2.5.3.5.New
- 方法簽名:
func (s *Scheme) New(kind schema.GroupVersionKind) (Object, error)
- 方法功能:根據(jù)指定的GVK,創(chuàng)建該資源的一個(gè)對(duì)象
- 舉例:
deployment, err := Scheme.New(schema.GroupVersionKind{Group: "apps",Version: "v1",Kind: "Deployment", })
2.5.3.6.AddConversionFunc
- 方法源碼
func (s *Scheme) AddConversionFunc(a, b interface{}, fn conversion.ConversionFunc) error {return s.converter.RegisterUntypedConversionFunc(a, b, fn) }
- 該方法,用于向scheme中注冊(cè) 不同資源 的自定義轉(zhuǎn)換器。
2.5.k8s.io/apimachinery 提供 RESTMapper 結(jié)構(gòu)
2.5.1.理解GVR和GVK的用途
- 在 上面2.3 中提到,k8s.io/apimachinery 提供了 GR/GVR、GK/GVK 等數(shù)據(jù)結(jié)構(gòu)。GR和GVR 負(fù)責(zé)對(duì)接 RESTful 風(fēng)格的url路徑,GK和GVK 負(fù)責(zé)確定一個(gè)具體的kubernetes資源
- GVR舉例:
- 用戶想要獲取 apps組下、v1版本的 deployments,如何編寫(xiě)url地址?–>
GET /apis/apps/v1/deployments
- 這個(gè)url中,就可以使用 GVR 描述,group為apps,version為v1,Resource為deployments
- 用戶想要獲取 apps組下、v1版本的 deployments,如何編寫(xiě)url地址?–>
- GVK舉例:
- 當(dāng)kubernetes的代碼中,想要操作一個(gè)資源的時(shí)候,如何找到資源的struct 結(jié)構(gòu)?通過(guò)GVK去找
- 比如 apps/v1/Deployment,就可以確定 group為apps,version為v1,kind為Deployment,就可以找到這個(gè)資源的struct
2.5.2.RESTMapper是什么
- 當(dāng)用戶使用 REST風(fēng)格 的 url 訪問(wèn)資源時(shí),kubernetes如何確定需要操作哪一個(gè)GVK呢?
- REST風(fēng)格 的 url,可以從中得到 GVR,只需要完成 GVR 到 GVK 的轉(zhuǎn)換就可以了
- 因此,apimachinery維護(hù)了一個(gè)數(shù)據(jù)結(jié)構(gòu) RESTMapper,記錄 GVR 和 GVK 的映射關(guān)系
type RESTMapping struct {// Resource is the GroupVersionResource (location) for this endpointResource schema.GroupVersionResource// GroupVersionKind is the GroupVersionKind (data format) to submit to this endpointGroupVersionKind schema.GroupVersionKind// Scope contains the information needed to deal with REST Resources that are in a resource hierarchyScope RESTScope }
- 另外,apimachinery還提供了一個(gè)接口 RESTMapper,接口中提供了 將 GVR 轉(zhuǎn)成 GVK 的方法
- 其中,
KindFor
和KindsFor
就是將 GVR 轉(zhuǎn)成 GVK 的方法
type RESTMapper interface {// KindFor takes a partial resource and returns the single match. Returns an error if there are multiple matchesKindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error)// KindsFor takes a partial resource and returns the list of potential kinds in priority orderKindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error)// ResourceFor takes a partial resource and returns the single match. Returns an error if there are multiple matchesResourceFor(input schema.GroupVersionResource) (schema.GroupVersionResource, error)// ResourcesFor takes a partial resource and returns the list of potential resource in priority orderResourcesFor(input schema.GroupVersionResource) ([]schema.GroupVersionResource, error)// RESTMapping identifies a preferred resource mapping for the provided group kind.RESTMapping(gk schema.GroupKind, versions ...string) (*RESTMapping, error)// RESTMappings returns all resource mappings for the provided group kind if no// version search is provided. Otherwise identifies a preferred resource mapping for// the provided version(s).RESTMappings(gk schema.GroupKind, versions ...string) ([]*RESTMapping, error)ResourceSingularizer(resource string) (singular string, err error) }
- 其中,
2.5.3.DefaultRESTMapper
- RESTMapper接口,有一個(gè)默認(rèn)的實(shí)現(xiàn) DefaultRESTMapper
- 位于
staging/src/k8s.io/apimachinery/pkg/api/meta/restmapper.go
type DefaultRESTMapper struct {defaultGroupVersions []schema.GroupVersionresourceToKind map[schema.GroupVersionResource]schema.GroupVersionKindkindToPluralResource map[schema.GroupVersionKind]schema.GroupVersionResourcekindToScope map[schema.GroupVersionKind]RESTScopesingularToPlural map[schema.GroupVersionResource]schema.GroupVersionResourcepluralToSingular map[schema.GroupVersionResource]schema.GroupVersionResource }
- 位于
staging/src/k8s.io/apimachinery/pkg/api/meta/restmapper.go
中還提供了一個(gè)NewDefaultRESTMapper
方法,用于新建一個(gè)DefaultRESTMapper
2.6.k8s.io/apimachinery 提供序列化、編解碼能力
2.6.1.k8s.io/apimachinery 的 runtime.serializer 包
- k8s.io/apimachinery 中,關(guān)于 序列化 和 編解碼 的代碼,大都在
staging/src/k8s.io/apimachinery/pkg/runtime/serializer
包下
- json、protobuf、yaml包,分別提供了對(duì)應(yīng)格式的序列化器,共3種序列化器
2.6.2.k8s.io/apimachinery 提供了序列化的通用接口
staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go
文件中,提供了序列化的通用接口Serializer
。Serializer接口提供了編解碼能力。type Serializer interface {EncoderDecoder }
- Encoder是編碼器接口,還是在
staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go
文件中type Encoder interface {Encode(obj Object, w io.Writer) errorIdentifier() Identifier }
- Decoder是解碼器接口,還是在
staging/src/k8s.io/apimachinery/pkg/runtime/interfaces.go
文件中type Decoder interface {Decode(data []byte, defaults *schema.GroupVersionKind, into Object) (Object, *schema.GroupVersionKind, error) }
2.6.3.json 序列化器
staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go
文件中,提供了json序列化器type Serializer struct {meta MetaFactoryoptions SerializerOptionscreater runtime.ObjectCreatertyper runtime.ObjectTyperidentifier runtime.Identifier }
- json序列化器 實(shí)現(xiàn)了
runtime.interface.go
中的Serializer接口,實(shí)現(xiàn)了 Encode、Decode方法 - 創(chuàng)建一個(gè)json序列化器,有多個(gè)方法
NewSerializer
、NewSerializerWithOptions
2.6.4.yaml 序列化器
staging/src/k8s.io/apimachinery/pkg/runtime/serializer/yaml/yaml.go
文件中,提供了yaml序列化器type yamlSerializer struct {// the nested serializerruntime.Serializer }
- yaml序列化器 實(shí)現(xiàn)了
runtime.interface.go
中的Serializer接口
2.6.5.protobuf 序列化器
staging/src/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go
文件中,提供了protobuf序列化器type Serializer struct {prefix []bytecreater runtime.ObjectCreatertyper runtime.ObjectTyper }
- protobuf序列化器 實(shí)現(xiàn)了
runtime.interface.go
中的Serializer接口
2.7.k8s.io/apimachinery 提供 不同資源 相互轉(zhuǎn)換能力
- scheme提供了AddConversionFunc方法,用于向scheme中注冊(cè) 不同資源 的自定義轉(zhuǎn)換器。
- 舉例:創(chuàng)建了一個(gè)Scheme對(duì)象,名為scheme。我們就可以通過(guò)下面的方法,注冊(cè) appsv1.Deployment 與 appsv1beta1.Deployment 的相互轉(zhuǎn)換方法
scheme.AddConversionFunc((*appsv1.Deployment)(nil),(*appsv1beta1.Deployment)(nil),func(a, b interface{}, scope conversion.Scope) error{v1deploy := a.(*appsv1.Deployment)v1beta1deploy := b.(*appsv1beta1.Deployment)// make conversion herereturn nil })
3.參考博客
- Kubernetes學(xué)習(xí)筆記[第5章]API Machinery
- runtime/Serializer源碼分析