Openshift API部分源码学习笔记(二)

前面一篇文章将openshift里面启动kubernetes组件部分解析了一下,本文将对openshift启动master服务的代码解析一下

上一篇文章链接:http://www.cnblogs.com/zard/p/7767112.html

源码分析

前面将kubernetes的API Server注册启动命令创建好了之后回到NewCommandStartAllInOne方法中,这次看下NewCommandStartMaster方法,此方法即为获取启动openshift master的命令

--》openshift/origin/pkg/cmd/server/start/start_allinone.go

--》openshift/origin/pkg/cmd/server/start/start_master.go

NewCommandStartMaster方法中添加命令的逻辑如下,即为添加了controller和API的两个启动命令

这里我们主要看下API相关的即NewCommandStartMasterAPI方法

--》openshift/origin/pkg/cmd/server/start/start_api.go

NewCommandStartMasterAPI方法里面主要逻辑如下,即调用StartMaster方法来启动master服务

后面在RunMaster方法里面根据配置信息生产一个master结构对象并调用start方法启动

--》openshift/origin/pkg/cmd/server/start/start_master.go

start方法里面先根据给定选项来创建openshift和kubernetes的配置信息

然后判断此master server是否有api服务,若有则根据刚刚创建的两个配置文件调用StartAPI方法来启动master上的api部分组件

StartAPI方法会启动那些在master上被认为是API一部分的组件,比如一开始就会根据配置信息来判断是否启动etcd

后面会调用openshiftConfig的run方法来加载组件

--》openshift/origin/pkg/cmd/server/origin/master.go

run方法里面会处理两种API,一种是访问受保护的api(通常这类调用是需要验证的),另一种是不受保护的api,我们这里主要关注那些受保护的api,因为大部分api都是这种

InstallProtectedAPI方法即为安装注册受保护的api,逻辑里首先初始化所有openshift的api

GetRestStorage方法会获取openshift所用到的所有storage,例如projectStorage

然后将所有storage放到一个map中,此map相当于一个openshift的配置文件,记录了所有api路径和此路径所用到的storage

storage := map[string]rest.Storage{
        "images":               imageStorage,
        "imagesignatures":      imageSignatureStorage,
        "imageStreams/secrets": imageStreamSecretsStorage,
        "imageStreams":         imageStreamStorage,
        "imageStreams/status":  imageStreamStatusStorage,
        "imageStreamImports":   imageStreamImportStorage,
        "imageStreamImages":    imageStreamImageStorage,
        "imageStreamMappings":  imageStreamMappingStorage,
        "imageStreamTags":      imageStreamTagStorage,

        "deploymentConfigs":          deployConfigStorage,
        "deploymentConfigs/scale":    deployConfigScaleStorage,
        "deploymentConfigs/status":   deployConfigStatusStorage,
        "deploymentConfigs/rollback": deployConfigRollbackStorage,
        "deploymentConfigs/log":      deploylogregistry.NewREST(configClient, kclient, c.DeploymentLogClient(), kubeletClient),

        // TODO: Deprecate these
        "generateDeploymentConfigs": deployconfiggenerator.NewREST(deployConfigGenerator, c.EtcdHelper.Codec()),
        "deploymentConfigRollbacks": deployrollback.NewDeprecatedREST(deployRollbackClient, c.EtcdHelper.Codec()),

        "processedTemplates": templateregistry.NewREST(),
        "templates":          templateStorage,

        "routes":        routeStorage,
        "routes/status": routeStatusStorage,

        "projects":        projectStorage,
        "projectRequests": projectRequestStorage,

        "hostSubnets":           hostSubnetStorage,
        "netNamespaces":         netNamespaceStorage,
        "clusterNetworks":       clusterNetworkStorage,
        "egressNetworkPolicies": egressNetworkPolicyStorage,

        "users":                userStorage,
        "groups":               groupStorage,
        "identities":           identityStorage,
        "userIdentityMappings": userIdentityMappingStorage,

        "oAuthAuthorizeTokens":      authorizeTokenStorage,
        "oAuthAccessTokens":         accessTokenStorage,
        "oAuthClients":              clientStorage,
        "oAuthClientAuthorizations": clientAuthorizationStorage,

        "resourceAccessReviews":      resourceAccessReviewStorage,
        "subjectAccessReviews":       subjectAccessReviewStorage,
        "localSubjectAccessReviews":  localSubjectAccessReviewStorage,
        "localResourceAccessReviews": localResourceAccessReviewStorage,
        "selfSubjectRulesReviews":    selfSubjectRulesReviewStorage,

        "policies":       policyStorage,
        "policyBindings": policyBindingStorage,
        "roles":          roleStorage,
        "roleBindings":   roleBindingStorage,

        "clusterPolicies":       clusterPolicyStorage,
        "clusterPolicyBindings": clusterPolicyBindingStorage,
        "clusterRoleBindings":   clusterRoleBindingStorage,
        "clusterRoles":          clusterRoleStorage,

        "clusterResourceQuotas":        restInPeace(clusterresourcequotaregistry.NewStorage(c.RESTOptionsGetter)),
        "clusterResourceQuotas/status": updateInPeace(clusterresourcequotaregistry.NewStatusStorage(c.RESTOptionsGetter)),
        "appliedClusterResourceQuotas": appliedclusterresourcequotaregistry.NewREST(
            c.ClusterQuotaMappingController.GetClusterQuotaMapper(), c.Informers.ClusterResourceQuotas().Lister(), c.Informers.Namespaces().Lister()),
    }

拿到了所有storage后便判断是否是v1版本的,若是则安装注册这些api

这里会先调用apiLegacyV1方法通过刚刚得到的storage map得到一个APIGroupVersion结构对象,此对象即为kubernetes的结构对象,然后调用APIGroupVersion的InstallREST方法去安装api

InstallREST方法逻辑很前一篇文章kubernetes里面的一样,这里就不再重复分析,此方法代码如下:

这样openshift master上的api组件就启动成功了

时间: 2024-08-29 17:04:23

Openshift API部分源码学习笔记(二)的相关文章

Openshift API部分源码学习笔记(一)

Openshift API简介 Openshift API包含了两部分,一部分是Kubernetes v1 REST API,另一部分是OpenShift v1 REST API,这些RESTful API都是通过HTTP(s)来访问OpenShift Container Platform的master服务器来调用的.这些API可用于管理终端用户的应用程序,集群和集群用户. Openshift里面Kubernetes api的前缀是 /api,而OpenShift 自己开发了一些api,它们的前

yii2源码学习笔记(二)

yii\base\Component代码详解 <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace yii\base; use Yii; /** * Object is the base class that implements the

yii2源码学习笔记(二十)

Widget类是所有部件的基类.yii2\base\Widget.php 1 <?php 2 /** 3 * @link http://www.yiiframework.com/ 4 * @copyright Copyright (c) 2008 Yii Software LLC 5 * @license http://www.yiiframework.com/license/ 6 */ 7 8 namespace yii\base; 9 10 use Yii; 11 use Reflectio

菜鸟的jQuery源码学习笔记(二)

jQuery对象是使用构造函数和原型模式相结合的方式创建的.现在来看看jQuery的原型对象jQuery.prototype: 1 jQuery.fn = jQuery.prototype = { 2 //成员变量和方法 3 } 这里给原型对象起了一个别名叫做jQuery.fn.要注意的是这个jQuery.fn可不是jQuery对象的属性,而是jQuery构造方法本身的属性,它是不会传给它所创建的对象的.如果你在控制台敲$().fn的话输出的结果会是undefined.接下来看看原型对象里面有些

Java集合源码学习笔记(二)ArrayList分析

Java集合源码学习笔记(二)ArrayList分析 >>关于ArrayList ArrayList直接继承AbstractList,实现了List. RandomAccess.Cloneable.Serializable接口,为什么叫"ArrayList",因为ArrayList内部是用一个数组存储元素值,相当于一个可变大小的数组,也就是动态数组. (1)继承和实现继承了AbstractList,实现了List:ArrayList是一个数组队列,提供了相关的添加.删除.修

Spring源码学习笔记(6)

Spring源码学习笔记(六) 前言-- 最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门. 上一篇中我们梳理到 Spring 加载 XML 配置文件, 完成 XML 的解析工作,接下来我们将进入 Spring 加载 bean 的逻辑. 我们使用 Spring 获取 XML

Spring源码学习笔记(3)

Spring源码学习笔记(三) 前言----     最近花了些时间看了<Spring源码深度解析>这本书,算是入门了Spring的源码吧.打算写下系列文章,回忆一下书的内容,总结代码的运行流程.推荐那些和我一样没接触过SSH框架源码又想学习的,阅读郝佳编著的<Spring源码深度解析>这本书,会是个很好的入门. DispatcherServlet 实现核心功能 和普通的 Servelt 类一样, DispatcherServlet 中的 doGet() 和 doPost() 方法

Java多线程之JUC包:ReentrantReadWriteLock源码学习笔记

若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5634701.html ReentrantLock提供了标准的互斥操作,但在应用中,我们对一个资源的访问有两种方式:读和写,读操作一般不会影响数据的一致性问题.但如果我们使用ReentrantLock,则在需要在读操作的时候也独占锁,这会导致并发效率大大降低.JUC包提供了读写锁ReentrantReadWriteLock,使得读写锁分离,在上述情

Java多线程之JUC包:Semaphore源码学习笔记

若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC包提供的一个共享锁,一般称之为信号量. Semaphore通过自定义的同步器维护了一个或多个共享资源,线程通过调用acquire获取共享资源,通过调用release释放. 源代码: /* * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to lic