kubectl源码分析之convert(代码片段)

1994july 1994july     2022-11-30     590

关键词:

发布一个k8s部署视频:https://edu.csdn.net/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.csdn.net/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.csdn.net/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件

第四个课程发布:https://edu.csdn.net/course/detail/28488

本课程将详细介绍k8s所有命令,以及命令的go源码分析,学习知其然,知其所以然
————————————————

type ConvertOptions struct //convert结构体
	PrintFlags *genericclioptions.PrintFlags
	Printer    printers.ResourcePrinter

	OutputVersion string
	Namespace     string

	builder   func() *resource.Builder
	local     bool
	validator func() (validation.Schema, error)

	resource.FilenameOptions
	genericclioptions.IOStreams
func NewConvertOptions(ioStreams genericclioptions.IOStreams) *ConvertOptions 
	return &ConvertOptions//初始化convert结构体
		PrintFlags: genericclioptions.NewPrintFlags("converted").WithTypeSetter(scheme.Scheme).WithDefaultOutput("yaml"),
		local:      true,
		IOStreams:  ioStreams,
	
//创建convert命令
func NewCmdConvert(f cmdutil.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command 
	o := NewConvertOptions(ioStreams)//初始化结构体

	cmd := &cobra.Command//创建cobra命令
		Use:                   "convert -f FILENAME",
		DisableFlagsInUseLine: true,
		Short:                 i18n.T("Convert config files between different API versions"),
		Long:                  convertLong,
		Example:               convertExample,
		Run: func(cmd *cobra.Command, args []string) 
			cmdutil.CheckErr(o.Complete(f, cmd))//准备
			cmdutil.CheckErr(o.RunConvert())//运行
		,
	

	cmd.Flags().BoolVar(&o.local, "local", o.local, "If true, convert will NOT try to contact api-server but run locally.")//local选项
	cmd.Flags().StringVar(&o.OutputVersion, "output-version", o.OutputVersion, i18n.T("Output the formatted object with the given group version (for ex: ‘extensions/v1beta1‘)."))//output-version选项
	o.PrintFlags.AddFlags(cmd)//打印选项

	cmdutil.AddValidateFlags(cmd)//校验选项
	cmdutil.AddFilenameOptionFlags(cmd, &o.FilenameOptions, "to need to get converted.")//文件选项
	return cmd
//准备
func (o *ConvertOptions) Complete(f cmdutil.Factory, cmd *cobra.Command) (err error) 
	err = o.FilenameOptions.RequireFilenameOrKustomize()//文件是必须的
	if err != nil 
		return err
	
	o.builder = f.NewBuilder//设置builder

	o.Namespace, _, err = f.ToRawKubeConfigLoader().Namespace()//设置namespace
	if err != nil 
		return err
	

	o.validator = func() (validation.Schema, error) //设置schemaValidator
		return f.Validator(cmdutil.GetFlagBool(cmd, "validate"))
	

	// build the printer
	o.Printer, err = o.PrintFlags.ToPrinter()//printflag转printer
	if err != nil 
		return err
	
	return nil
//运行
func (o *ConvertOptions) RunConvert() error 

	// Convert must be removed from kubectl, since kubectl can not depend on
	// Kubernetes "internal" dependencies. These "internal" dependencies can
	// not be removed from convert. Another way to convert a resource is to
	// "kubectl apply" it to the cluster, then "kubectl get" at the desired version.
	// Another possible solution is to make convert a plugin.
	fmt.Fprintf(o.ErrOut, "kubectl convert is DEPRECATED and will be removed in a future version.
In order to convert, kubectl apply the object to the cluster, then kubectl get at the desired version.
")//打印deprecated提示

	b := o.builder().
		WithScheme(scheme.Scheme).
		LocalParam(o.local)
	if !o.local 
		schema, err := o.validator()
		if err != nil 
			return err
		
		b.Schema(schema)
	

	r := b.NamespaceParam(o.Namespace).
		ContinueOnError().
		FilenameParam(false, &o.FilenameOptions).
		Flatten().
		Do()//用builder构造result对象

	err := r.Err()
	if err != nil 
		return err
	

	singleItemImplied := false
	infos, err := r.IntoSingleItemImplied(&singleItemImplied).Infos()//获取infos
	if err != nil 
		return err
	

	if len(infos) == 0 //info为0个返回错误
		return fmt.Errorf("no objects passed to convert")
	

	var specifiedOutputVersion schema.GroupVersion
	if len(o.OutputVersion) > 0 //如果指定了output-version
		specifiedOutputVersion, err = schema.ParseGroupVersion(o.OutputVersion)//解析output-version
		if err != nil 
			return err
		
	

	internalEncoder := scheme.Codecs.LegacyCodec(scheme.Scheme.PrioritizedVersionsAllGroups()...)//获取codec
	internalVersionJSONEncoder := unstructured.JSONFallbackEncoderEncoder: internalEncoder//构造json encoder
	objects, err := asVersionedObject(infos, !singleItemImplied, specifiedOutputVersion, internalVersionJSONEncoder)//转换对象
	if err != nil 
		return err
	

	return o.Printer.PrintObj(objects, o.Out)//打印结果
//转换对象
func asVersionedObject(infos []*resource.Info, forceList bool, specifiedOutputVersion schema.GroupVersion, encoder runtime.Encoder) (runtime.Object, error) 
	objects, err := asVersionedObjects(infos, specifiedOutputVersion, encoder)//转换对象
	if err != nil 
		return nil, err
	

	var object runtime.Object
	if len(objects) == 1 && !forceList //如果结果是1个对象,不是forceList
		object = objects[0]
	 else 
		object = &api.ListItems: objects//把对象包装成list
		targetVersions := []schema.GroupVersion
		if !specifiedOutputVersion.Empty() //specifiedOutputVersion非空
			targetVersions = append(targetVersions, specifiedOutputVersion)//append version
		
		targetVersions = append(targetVersions, schema.GroupVersionGroup: "", Version: "v1")//append version

		converted, err := tryConvert(scheme.Scheme, object, targetVersions...)//尝试转换
		if err != nil 
			return nil, err
		
		object = converted
	

	actualVersion := object.GetObjectKind().GroupVersionKind()//获取对象实际的version
	if actualVersion.Version != specifiedOutputVersion.Version //如果对象实际version不等于指定的version
		defaultVersionInfo := ""
		if len(actualVersion.Version) > 0 //实际version非空,设置打印消息
			defaultVersionInfo = fmt.Sprintf("Defaulting to %q", actualVersion.Version)
		
		klog.V(1).Infof("info: the output version specified is invalid. %s
", defaultVersionInfo)//输出klog日志
	
	return object, nil//返回对象
//转换对象
func asVersionedObjects(infos []*resource.Info, specifiedOutputVersion schema.GroupVersion, encoder runtime.Encoder) ([]runtime.Object, error) 
	objects := []runtime.Object
	for _, info := range infos //遍历infos
		if info.Object == nil //info的object为空继续
			continue
		

		targetVersions := []schema.GroupVersion//构造目标version slice
		// objects that are not part of api.Scheme must be converted to JSON
		// TODO: convert to map[string]interface, attach to runtime.Unknown?
		if !specifiedOutputVersion.Empty() //指定的version非空
			if _, _, err := scheme.Scheme.ObjectKinds(info.Object); runtime.IsNotRegisteredError(err) //获取对象kind,如果是IsNotRegisteredError错误
				// TODO: ideally this would encode to version, but we don‘t expose multiple codecs here.
				data, err := runtime.Encode(encoder, info.Object)//encode对象
				if err != nil 
					return nil, err
				
				// TODO: Set ContentEncoding and ContentType.
				objects = append(objects, &runtime.UnknownRaw: data)//追加objects,继续
				continue
			
			targetVersions = append(targetVersions, specifiedOutputVersion)//追加目标vesions
		 else //如果版本没指定
			gvks, _, err := scheme.Scheme.ObjectKinds(info.Object)//获取对象kinds
			if err == nil 
				for _, gvk := range gvks 
					targetVersions = append(targetVersions, scheme.Scheme.PrioritizedVersionsForGroup(gvk.Group)...)//追加目标versions
				
			
		

		converted, err := tryConvert(scheme.Scheme, info.Object, targetVersions...)//尝试convert
		if err != nil 
			return nil, err
		
		objects = append(objects, converted)//追加对象
	
	return objects, nil//返回对象
//尝试转换
func tryConvert(converter runtime.ObjectConvertor, object runtime.Object, versions ...schema.GroupVersion) (runtime.Object, error) 
	var last error
	for _, version := range versions //遍历目标版本
		if version.Empty() //如果版本为空,直接返回对象
			return object, nil
		
		obj, err := converter.ConvertToVersion(object, version)//转换对象到某个版本
		if err != nil //有错误继续
			last = err
			continue
		
		return obj, nil//返回对象
	
	return nil, last//返回错误

 

 

 

 

 推荐:网赚教程,新手看了100%学会

工业互联网的发展步伐如何完善?

西部数据黑盘是什么,西部数据Black™ NVMe™ M.2固态硬盘评测

spring源码分析之abstractapplicationcontext源码分析(代码片段)

  首先我觉得分析ApplicationContext必须从它的实现类开始进行分析,AbstractApplicationContext我觉得是一个不错的选择,那我们就从这里开始逐一分析吧,首先我自己手画了一张图,作为索引吧,其中蓝色的为类,紫色的为接口,箭... 查看详情

flutter命令本质之fluttertools机制源码深入分析(代码片段)

...er系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid端Flut... 查看详情

布局优化之viewstub源码分析(代码片段)

源码分析1@RemoteView2publicfinalclassViewStubextendsView3privateintmInflatedId;4privateintmLayoutResource;56privateWeakReference<View>mInflatedViewRef;78privateLayoutInflatermInflater;9privateOnInf 查看详情

@springbootapplication之自动配置源码分析(代码片段)

一、自动包规则原理1、SpringBoot应用的启动类:@SpringBootApplicationpublicclassMainApplicationpublicstaticvoidmain(String[]args)SpringApplication.run(MainApplication.class,args);分析下@SpringBootApplication 查看详情

netty源码分析之服务端启动(代码片段)

Netty服务端启动代码:publicfinalclassEchoServerstaticfinalintPORT=Integer.parseInt(System.getProperty("port","8007"));publicstaticvoidmain(String[]args)throwsException//Configuretheserver.EventLoopGroupboss 查看详情

poco源码分析之binding(代码片段)

本文介绍PocoC++编程技术之关键字绑定机制,以use关键字的实现为例session<<"SELECT*FROMDeviceSetWHEREHardwareID=?ANDInstanceID=?",use(hardware),use(instance),into(HardwareSet),now;  查看详情

iceberg源码分析之hadooptableoperations(代码片段)

HadoopTableOperations实现可原子重命名的文件系统;维护表位置下的“metadata”文件夹中的元数据;publicclassHadoopTableOperationsimplementsTableOperationsprivatevolatileTableMetadatacurrentMetadata=null;privatevolatileIntegerversion 查看详情

iceberg源码分析之hadooptableoperations(代码片段)

HadoopTableOperations实现可原子重命名的文件系统;维护表位置下的“metadata”文件夹中的元数据;publicclassHadoopTableOperationsimplementsTableOperationsprivatevolatileTableMetadatacurrentMetadata=null;privatevolatileIntegerversio 查看详情

poco源码分析之extraction(代码片段)

本文介绍PocoC++编程技术之关键字绑定机制,以into关键字的实现为例 session<<"SELECT*FROMDeviceSetWHEREHardwareID=?ANDInstanceID=?",use(hardware),use(instance),into(HardwareSet),now;  查看详情

源码分析rocketmqdledger(多副本)之日志追加流程(代码片段)

上一篇我们详细分析了源码分析RocketMQ多副本之Leader选主,本文将详细分析日志复制的实现。有了前篇源码分析RocketMQDLedger多副本存储实现,本文将直接从Leader处理客户端请求入口开始,其入口为:DLedgerServer的handleAppend方法开始... 查看详情

android图形架构之七——choreographer源码分析(代码片段)

前言Android图形架构之一——概述Android图形架构之二——SurfaceFlinger启动和连接Android图形架构之三——创建Layer、Surface、SurfaceControlAndroid图形架构之四——图形缓冲区的申请和消费流程及核心类Android图形架构之五——深入分析add... 查看详情

androidjetpack之navigation源码分析(代码片段)

AndroidJetpack之Navigation源码分析AndroidNavigation简介关于Fragment的基础篇:Fragment基础篇官方指导地址:官方指地址Githubdemo地址:demo使用Navigation可以管理APP页面跳转。Navigation不部分情况下作用于Fragment中,使用Navigation... 查看详情

flask系列之源码分析(代码片段)

...术点python之__setattr__python之threading.localpython之偏函数flask源码上下文管理1、综述过程将请求对象压入栈1.请求进入__call__---> wsgi_app---> ctx=self.request_context(environ)初始化请求对象2.通过ctx.puth()建立2个请求堆栈(采用thread 查看详情

flutter实践深入分析之——flutterview相关源码分析(代码片段)

文章目录前言Flutter渲染模式FlutterSurfaceView分析FlutterTextureView分析FlutterImageView分析FlutterRender分析FlutterView分析总结(类图,架构图)类关系图架构图前言​通过前面文章的分析我们了解到FlutterActivity的显示最终是通过F... 查看详情

flutter实践深入分析之——flutterview相关源码分析(代码片段)

文章目录前言Flutter渲染模式FlutterSurfaceView分析FlutterTextureView分析FlutterImageView分析FlutterRender分析FlutterView分析总结(类图,架构图)类关系图架构图前言​通过前面文章的分析我们了解到FlutterActivity的显示最终是通过F... 查看详情

matrix源码分析之第一篇(代码片段)

Matrix源码分析之第一篇概述前几天腾讯将一款Android应用性能监控的框架matrix开源了,源码地址在https://github.com/Tencent/matrix,作者是微信终端团队。matrix到底是什么?据官方说法如下:Matrix是一款微信研发并日常使用的APM(Applicat... 查看详情

androidjetpack之lifecycles源码分析(代码片段)

AndroidJetpack之Lifecycles源码分析AndroidJetpack简介Jetpack是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在... 查看详情

androidjetpack之workmanager源码分析(代码片段)

AndroidJetpack之WorkManager源码分析AndroidWorkManager简介WorkManager负责用来管理后台任务,它适用于需要保证系统即使应用程序退出也会运行的任务,WorkManager根据设备API级别和应用程序状态等因素选择适当的方式来运行任务。如... 查看详情