Openshift API部分源码学习笔记(一)
2021-05-02 06:28
标签:epo 执行 net 开发 openshift war font nbsp 等等 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 然后新建一个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注册启动命令就创建好了 Openshift API部分源码学习笔记(一) 标签:epo 执行 net 开发 openshift war font nbsp 等等 原文地址:http://www.cnblogs.com/zard/p/7767112.htmlm.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) }),
}
文章标题:Openshift API部分源码学习笔记(一)
文章链接:http://soscw.com/index.php/essay/81216.html