中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

有關(guān)做美食的網(wǎng)站王通seo教程

有關(guān)做美食的網(wǎng)站,王通seo教程,中國(guó)質(zhì)量新聞網(wǎng)站官網(wǎng),網(wǎng)站建設(shè)與維護(hù)實(shí)訓(xùn)ppt云原生學(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&a…

云原生學(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)有截出全部。
      在這里插入圖片描述
  • 因此,我們操作內(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/Deploymentapps/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
  • 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 的方法
    • 其中,KindForKindsFor 就是將 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源碼分析
http://www.risenshineclean.com/news/54640.html

相關(guān)文章:

  • 網(wǎng)站怎么發(fā)布做微商在線識(shí)別圖片找原圖
  • 溫州建設(shè)網(wǎng)站哪家好百度官方認(rèn)證
  • 百度做網(wǎng)站推廣怎么樣優(yōu)化網(wǎng)站seo
  • 游戲網(wǎng)站建設(shè)一條龍平臺(tái)推廣公眾平臺(tái)營(yíng)銷
  • 網(wǎng)站建設(shè)空標(biāo)記網(wǎng)站seo查詢站長(zhǎng)之家
  • 住房城鄉(xiāng)與建設(shè)廳網(wǎng)站企業(yè)網(wǎng)站推廣策略
  • 做網(wǎng)站廣告有哪些職位seo關(guān)鍵詞挖掘
  • 國(guó)內(nèi)企業(yè)網(wǎng)站設(shè)計(jì)網(wǎng)站排名優(yōu)化培訓(xùn)哪家好
  • 做音樂(lè)網(wǎng)站用什么程序網(wǎng)站策劃書(shū)
  • 怎么做博客網(wǎng)站windows7優(yōu)化大師
  • 移動(dòng)端前端開(kāi)發(fā)需要學(xué)什么成都網(wǎng)站排名 生客seo
  • 受歡迎的鄭州網(wǎng)站建設(shè)個(gè)人可以做推廣的平臺(tái)有哪些
  • 沈陽(yáng)電商網(wǎng)站建設(shè)上海關(guān)鍵詞seo
  • 阿里巴巴網(wǎng)站建設(shè)方案書(shū)商品促銷活動(dòng)策劃方案
  • dedecms 遷移 wordpressseo優(yōu)化工作內(nèi)容做什么
  • 成都房產(chǎn)網(wǎng)房天下seo研究中心官網(wǎng)
  • 中華智能自建代理網(wǎng)站搜索引擎優(yōu)化推廣
  • 怎么申請(qǐng)公司網(wǎng)站互動(dòng)營(yíng)銷的案例及分析
  • 網(wǎng)站建設(shè) 入門(mén)知識(shí)鄭州外貿(mào)網(wǎng)站推廣
  • 溫州的網(wǎng)站設(shè)計(jì)58同城關(guān)鍵詞怎么優(yōu)化
  • 網(wǎng)站診斷表正能量網(wǎng)站地址鏈接免費(fèi)
  • html5 開(kāi)發(fā)網(wǎng)站網(wǎng)站排名提升軟件
  • 南充房產(chǎn)網(wǎng)簽備案查詢seo排名點(diǎn)擊器
  • 安徽先鋒網(wǎng)站兩學(xué)一做如何優(yōu)化網(wǎng)絡(luò)連接
  • 怎樣做音視頻宣傳網(wǎng)站互聯(lián)網(wǎng)營(yíng)銷軟件
  • 建設(shè)個(gè)公司網(wǎng)站需要多少費(fèi)用個(gè)人在百度上發(fā)廣告怎么發(fā)
  • 有域名怎樣建設(shè)網(wǎng)站網(wǎng)站標(biāo)題seo外包優(yōu)化
  • 國(guó)外開(kāi)源建站系統(tǒng)參考消息今天新聞
  • 青島網(wǎng)站建設(shè)銘盛信息品牌策略的7種類型
  • 創(chuàng)建網(wǎng)頁(yè)費(fèi)用獨(dú)立站seo實(shí)操