热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【原创】k8s源码分析-----kubectl(2)Factory

本文QQ空间的链接:http:user.qzone.qq.com29185807blog1461036130本文csdn博文的链接:http:blog.csdn.netscrescen

本文QQ空间的链接:http://user.qzone.qq.com/29185807/blog/1461036130

本文csdn博文的链接:http://blog.csdn.net/screscent/article/details/51188790

 

源码为k8s v1.1.1

 

1、原因

首先讲讲为啥,我们要讲解Factory

代码在k8s.io\kubernetes\cmd\kubectl

先从main函数入口来说

main函数很简单,进来就直接构建了一个cmd,然后调用了Execute

而cmd里面的参数除了几个标准的输入输出之外,就只有一个NewFactory


 

下面我们继续看看NewKubectlCommand,在函数中,构建了很多cmd的,每个cmd传入进去的参数也是Factory

代码在k8s.io\kubernetes\pkg\kubectl\cmd


 我们简单的看一个NewCmdCreate


很明显在Run中最重要的函数是RunCreate

 

而在RunCreate中,所有的重要参数都是有Factory产出

 

所以在分析kubectl命令之前,我们先分析下Factory。

 

2、构建

 

代码在k8s.io\kubernetes\pkg\kubectl\cmd\util

下面是源码中的注释

Factory provides abstractions that allow the Kubectl command to be extended across multiple types of resources and different API sets.

主要的含义就是Factory提供了一些抽象动作,目的就是用于kubectl command可以扩展很多不同的类型和不同的api(英文翻译的不好,大致就是这个意思)

 


Factory中,提供了很多的函数对象 

我们在main函数中看到,其中调用了NewFactory来构建Factory

函数比较长,我们慢慢来分析



 代码太长,就不全部贴了。下面挑一些重要的来做详细分析

 

2.1 mapper

mapper := kubectl.ShortcutExpander{RESTMapper: api.RESTMapper}

我们看看

代码在k8s.io\kubernetes\pkg\kubectl\ kubectl.go

这里的ShortcutExpander其实就是对meta.RESTMapper做了一层封装,而我们上一篇文章(【原创】k8s源码分析-----kubectl(1)api.RESTMapper)已经对RESTMapper已经详细讲解过了,就不再细说了

 

2.2 Generator


构建了5种类型的Generator

代码在k8s.io\kubernetes\pkg\kubectl\generator.go


Generator就是根据输入参数构建出相对于的api object

 

2.2.1 BasicReplicationController

"run/v1"对应的是BasicReplicationController,那么我们看看这个


一个空的结构体,但函数ParamNames提供了replicationController所需要的参数

下面我们看看构建





 Generate函数比较长,这里贴了好几张图,才贴完。从上面的函数流程来看,就是从输入参数中,查找api.ReplicationController所需要的参数,最后构建成了一个api.ReplicationController的对象,将其返回

 

2.2.2 BasicPod

"run-pod/v1":对应的是BasicPod


上面就是构建pod所需要的参数

下面我们看看Generate,函数太长,就不全部截图了。关键部分截图出来看看

func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, error) {


查找相关的输入参数,然后构建了一个api.Pod

 

2.2.3 ServiceGenerator

"service/v1": 对应的是ServiceGeneratorV1

"service/v2": 对应的是ServiceGeneratorV2

 

从上图的代码来看,v1和v2版本其实是差不多的,只是v1版本多了一个params["port-name"] = "default"


上面是service构建所需的参数

func generate(genericParams map[string]interface{}) (runtime.Object, error) {


上面就是构建的api.Service

 

 

2.3 clients

我们先看看构建Factory的时候是怎么初始化clients以及其主要提供的函数接口


clients    *ClientCache

其本身从字面上来看是一个client的缓存,主要提供了clients.ClientForVersion()这个接口用于获取client

代码在k8s.io\kubernetes\pkg\kubectl\cmd\util\clientcache.go


其中最重要的参数为clients map[string]*client.Client一个map

我们主要提供的接口


根据版本号来查找,是否已经构建过,没有的话,就重新构建一个client,那么client是什么呢

代码在k8s.io\kubernetes\pkg\client\unversioned\client.go


其中最重要的就是RESTClient

代码在k8s.io\kubernetes\pkg\client\unversioned\restclient.go


 

2.4 小结

主要的构建参数就是generator和clients。

 

3、功能

下面我们看看Factory都提供了那些功能,其实所有的功能都是在构建的时候,初始化的那些函数对象,并不是以成员函数体现的。

3.1  Object

    // Returns interfaces for dealing with arbitrary runtime.Objects.

    Object func() (meta.RESTMapper, runtime.ObjectTyper)


函数主要作用就是封装了一个OutputVersionMapper,其实就将RESTMapper和Version版本封装到了一起

 

另外object函数还返回了一个runtime.objectTyper,就是api.Scheme,这个我们在前面的文章(【原创】k8s源码分析-----kubectl(1)api.RESTMapper)中已经有讲解过

 

3.2 Client


其实就是从clients获取到默认版本的client

 

3.3 RESTClient


RESTClient其实也是从clients获取到的

 

3.4 PodSelectorForObject


根据不同的类型,返回不同的选择标签

 

3.5 Generator


根据不同的类型,返回不同的genterator

 

3.6 小结

Factory提供的功能比较多,这一小结,只分析其中一些比较常用重要的,剩余的可以自己去看下代码,函数功能实现都是很清晰的

 

 

 

龚浩华

QQ 月牙寂 29185807

2016年4月19日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
author-avatar
L-Darin_209
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有