设为首页 收藏本站
查看: 841|回复: 0

[经验分享] Openshift API部分源码学习笔记(二)

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2018-1-5 22:29:40 | 显示全部楼层 |阅读模式
  前面一篇文章将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":          >  "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组件就启动成功了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-432054-1-1.html 上篇帖子: 四、创建覆盖网络--Flannel 下篇帖子: Kubernetes1.5新特性:支持windows容器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表