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

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

[复制链接]

尚未签到

发表于 2018-1-5 18:09:55 | 显示全部楼层 |阅读模式
  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,它们的前缀是 /oapi,kubernetes原生api已有的功能Openshift并没有重新写接口而是直接用的kubernetes的原生apii,只不过开发了一些kubernetes原先没有的功能和api接口。
  源码分析
  github地址:https://github.com/openshift/origin(此文中代码对应1.3版本)
  sourcegraph网站地址:https://sourcegraph.com/github.com/openshift/origin@release-1.3/-/blob/cmd/openshift/openshift.go
  代码入口
  --》openshift/origin/cmd/openshift/openshift.go
  openshift.go里面的main方法有启动服务逻辑,通过调用CommandFor获取哪些启动命令需要执行。

  CommandFor方法里面根据传入的basename参数来决定获取哪些命令,默认是调用NewCommandOpenShift方法获取所有命令

  NewCommandOpenShift方法先创建一个Command结构root,然后往root里面添加命令。逻辑里会首先调用NewCommandStartAllInOne方法获取一些主要命令集。

  --》openshift/origin/pkg/cmd/server/start/start_allinone.go
  NewCommandStartAllInOne方法里面添加命令的主要逻辑如下:

  此处会拿到master,node等等的启动命令,还有kubernetes相关服务组件的启动。
  1).这里我先从获取kubernetes相关命令的方法开始看
  --》openshift/origin/pkg/cmd/server/start/kubernetes/kubernetes.go
  NewCommand方法里面主要逻辑如下:

  这里包含了好几部分kubernetes组件的启动命令,我们主要关注api部分,因此是NewAPIServerCommand方法
  --》openshift/origin/pkg/cmd/server/start/kubernetes/apiserver.go
  这后面的逻辑跟kubernetes源码里面api这部分的逻辑大致相同,先根据默认参数新建一个APIServer

  然后通过server.go里面的run方法启动指定的APIServer
  --》openshift/origin/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go
  run方法里面启动api server的主要逻辑如下,先根据配置新建一个server然后启动

  --》openshift/origin/vendor/k8s.io/kubernetes/pkg/master/master.go
  master里面的new方法先根据配置信息返回一个api server的实例,然后调用InstallAPIs方法初始化所有的api
  InstallAPIs方法里面会根据条件来创建好几个apiGroupsInfo结构并将它们添加到一个apiGroupsInfo组中间去,这些不同的apiGroupsInfo对应不同的版本信息,例如v1,v1beta1等等。添加到数组中去好了之后会调用InstallAPIGroups方法来安装所有的apiGroupsInfo中的api。这里我们拿v1这个group来看,逻辑里面会先调用initV1ResourcesStorage方法来初始化v1这个group的所有storage,例如podStorage,nodeStorage

  新建好这些storage之后会将它们配置到一个map中去,此map即相当于一个配置文件去管理要用到哪些storage以及对应的路径path,这些即决定了后面会提供哪些api
  

m.v1ResourcesStorage = map[string]rest.Storage{"pods":             podStorage.Pod,"pods/attach":      podStorage.Attach,"pods/status":      podStorage.Status,"pods/log":         podStorage.Log,"pods/exec":        podStorage.Exec,"pods/portforward": podStorage.PortForward,"pods/proxy":       podStorage.Proxy,"pods/binding":     podStorage.Binding,"bindings":         podStorage.Binding,  

"podTemplates": podTemplateStorage,  

"replicationControllers":        controllerStorage.Controller,"replicationControllers/status": controllerStorage.Status,  

"services":        serviceRest.Service,"services/proxy":  serviceRest.Proxy,"services/status": serviceStatusStorage,  

"endpoints": endpointsStorage,  

"nodes":        nodeStorage.Node,"nodes/status": nodeStorage.Status,"nodes/proxy":  nodeStorage.Proxy,  

"events": eventStorage,  

"limitRanges":                   limitRangeStorage,"resourceQuotas":                resourceQuotaStorage,"resourceQuotas/status":         resourceQuotaStatusStorage,"namespaces":                    namespaceStorage,"namespaces/status":             namespaceStatusStorage,"namespaces/finalize":           namespaceFinalizeStorage,"secrets":                       secretStorage,"serviceAccounts":               serviceAccountStorage,"securityContextConstraints":    securityContextConstraintsStorage,"persistentVolumes":             persistentVolumeStorage,"persistentVolumes/status":      persistentVolumeStatusStorage,"persistentVolumeClaims":        persistentVolumeClaimStorage,"persistentVolumeClaims/status": persistentVolumeClaimStatusStorage,"configMaps":                    configMapStorage,  

"componentStatuses": componentstatus.NewStorage(func() map[string]apiserver.Server { return m.getServersToValidate(c) }),  }
  

  然后新建一个APIGroupInfo,将前面的这个map放到这个新建的APIGroupInfo中去。等所有APIGroupInfo放好之后调用InstallAPIGroups方法
  --》openshift/origin/vendor/k8s.io/kubernetes/pkg/genericapiserver/genericapiserver.go

  InstallAPIGroups方法里面会循环调用InstallAPIGroup方法去安装每个APIGroup
  InstallAPIGroup方法先取得api路径前缀,这里我们还是拿v1这个group举例,所以这里拿到的前缀apiPrefix会是 /api,然后根据APIGroupInfo结构的信息来获取一个apiGroupVersion结构对象,再调用apiGroupVersion的InstallREST方法来注册REST api。
  --》openshift/origin/vendor/k8s.io/kubernetes/pkg/apiserver/apiserver.go

  InstallREST方法会新建一个webService,此webService会处理指定的path下面的所有请求,vi这个group的webService所对应的path就是/api/v1,然后调用Install方法去安装初始化所有route
  --》openshift/origin/vendor/k8s.io/kubernetes/pkg/apiserver/api_installer.go
  Install方法里面主要逻辑如下,循环遍历所有前面那个记录path和storage的map里的路径path,然后注册每个path对应的handler

  registerResourceHandlers方法里面先根据当前的storage获取各种action方法,例如create,get方法

  然后根据当前storage对应的resource是否是有namespace的来分别创建action并放到actions这个数组中

  这里的不同action方法用到的api路径不尽相同,像LIST,POST方法都是path里面不需要item name的,而GET,PUT都是需要item name的
  然后循环actions数组将每种action对应的方法转化成route并添加到webService中去,这里截取GET的处理代码


  所有这些都处理好之后将此webService添加到container中去,至此kubernetes的API Server注册启动命令就创建好了

运维网声明 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-431978-1-1.html 上篇帖子: 查看ubuntu系统信息 下篇帖子: centos7 install k8s centos 安装 kubernetes 详细
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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