Openshift API部分源码学习笔记(一)
Openshift API簡(jiǎn)介
Openshift API包含了兩部分,一部分是Kubernetes v1 REST API,另一部分是OpenShift v1 REST API,這些RESTful API都是通過HTTP(s)來訪問OpenShift?Container Platform的master服務(wù)器來調(diào)用的。這些API可用于管理終端用戶的應(yīng)用程序,集群和集群用戶。
Openshift里面Kubernetes api的前綴是 /api,而OpenShift 自己開發(fā)了一些api,它們的前綴是 /oapi,kubernetes原生api已有的功能Openshift并沒有重新寫接口而是直接用的kubernetes的原生apii,只不過開發(fā)了一些kubernetes原先沒有的功能和api接口。
源碼分析
github地址:https://github.com/openshift/origin(此文中代碼對(duì)應(yīng)1.3版本)
sourcegraph網(wǎng)站地址:https://sourcegraph.com/github.com/openshift/origin@release-1.3/-/blob/cmd/openshift/openshift.go
代碼入口
--》openshift/origin/cmd/openshift/openshift.go
openshift.go里面的main方法有啟動(dòng)服務(wù)邏輯,通過調(diào)用CommandFor獲取哪些啟動(dòng)命令需要執(zhí)行。
CommandFor方法里面根據(jù)傳入的basename參數(shù)來決定獲取哪些命令,默認(rèn)是調(diào)用NewCommandOpenShift方法獲取所有命令
?
NewCommandOpenShift方法先創(chuàng)建一個(gè)Command結(jié)構(gòu)root,然后往root里面添加命令。邏輯里會(huì)首先調(diào)用NewCommandStartAllInOne方法獲取一些主要命令集。
--》openshift/origin/pkg/cmd/server/start/start_allinone.go
NewCommandStartAllInOne方法里面添加命令的主要邏輯如下:
此處會(huì)拿到master,node等等的啟動(dòng)命令,還有kubernetes相關(guān)服務(wù)組件的啟動(dòng)。
1).這里我先從獲取kubernetes相關(guān)命令的方法開始看
--》openshift/origin/pkg/cmd/server/start/kubernetes/kubernetes.go?
NewCommand方法里面主要邏輯如下:
?
這里包含了好幾部分kubernetes組件的啟動(dòng)命令,我們主要關(guān)注api部分,因此是NewAPIServerCommand方法
--》openshift/origin/pkg/cmd/server/start/kubernetes/apiserver.go
這后面的邏輯跟kubernetes源碼里面api這部分的邏輯大致相同,先根據(jù)默認(rèn)參數(shù)新建一個(gè)APIServer
然后通過server.go里面的run方法啟動(dòng)指定的APIServer
--》openshift/origin/vendor/k8s.io/kubernetes/cmd/kube-apiserver/app/server.go?
run方法里面啟動(dòng)api server的主要邏輯如下,先根據(jù)配置新建一個(gè)server然后啟動(dòng)
--》openshift/origin/vendor/k8s.io/kubernetes/pkg/master/master.go
master里面的new方法先根據(jù)配置信息返回一個(gè)api server的實(shí)例,然后調(diào)用InstallAPIs方法初始化所有的api
InstallAPIs方法里面會(huì)根據(jù)條件來創(chuàng)建好幾個(gè)apiGroupsInfo結(jié)構(gòu)并將它們添加到一個(gè)apiGroupsInfo組中間去,這些不同的apiGroupsInfo對(duì)應(yīng)不同的版本信息,例如v1,v1beta1等等。添加到數(shù)組中去好了之后會(huì)調(diào)用InstallAPIGroups方法來安裝所有的apiGroupsInfo中的api。這里我們拿v1這個(gè)group來看,邏輯里面會(huì)先調(diào)用initV1ResourcesStorage方法來初始化v1這個(gè)group的所有storage,例如podStorage,nodeStorage
新建好這些storage之后會(huì)將它們配置到一個(gè)map中去,此map即相當(dāng)于一個(gè)配置文件去管理要用到哪些storage以及對(duì)應(yīng)的路徑path,這些即決定了后面會(huì)提供哪些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) }),}然后新建一個(gè)APIGroupInfo,將前面的這個(gè)map放到這個(gè)新建的APIGroupInfo中去。等所有APIGroupInfo放好之后調(diào)用InstallAPIGroups方法
--》openshift/origin/vendor/k8s.io/kubernetes/pkg/genericapiserver/genericapiserver.go
InstallAPIGroups方法里面會(huì)循環(huán)調(diào)用InstallAPIGroup方法去安裝每個(gè)APIGroup
InstallAPIGroup方法先取得api路徑前綴,這里我們還是拿v1這個(gè)group舉例,所以這里拿到的前綴apiPrefix會(huì)是 /api,然后根據(jù)APIGroupInfo結(jié)構(gòu)的信息來獲取一個(gè)apiGroupVersion結(jié)構(gòu)對(duì)象,再調(diào)用apiGroupVersion的InstallREST方法來注冊(cè)REST api。
--》openshift/origin/vendor/k8s.io/kubernetes/pkg/apiserver/apiserver.go
?
InstallREST方法會(huì)新建一個(gè)webService,此webService會(huì)處理指定的path下面的所有請(qǐng)求,vi這個(gè)group的webService所對(duì)應(yīng)的path就是/api/v1,然后調(diào)用Install方法去安裝初始化所有route
--》openshift/origin/vendor/k8s.io/kubernetes/pkg/apiserver/api_installer.go
Install方法里面主要邏輯如下,循環(huán)遍歷所有前面那個(gè)記錄path和storage的map里的路徑path,然后注冊(cè)每個(gè)path對(duì)應(yīng)的handler
registerResourceHandlers方法里面先根據(jù)當(dāng)前的storage獲取各種action方法,例如create,get方法
然后根據(jù)當(dāng)前storage對(duì)應(yīng)的resource是否是有namespace的來分別創(chuàng)建action并放到actions這個(gè)數(shù)組中
這里的不同action方法用到的api路徑不盡相同,像LIST,POST方法都是path里面不需要item name的,而GET,PUT都是需要item name的
然后循環(huán)actions數(shù)組將每種action對(duì)應(yīng)的方法轉(zhuǎn)化成route并添加到webService中去,這里截取GET的處理代碼
所有這些都處理好之后將此webService添加到container中去,至此kubernetes的API Server注冊(cè)啟動(dòng)命令就創(chuàng)建好了
?
轉(zhuǎn)載于:https://www.cnblogs.com/zard/p/7767112.html
總結(jié)
以上是生活随笔為你收集整理的Openshift API部分源码学习笔记(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java虚拟机5:常用JVM命令参数
- 下一篇: linux下安装oracle客户端,实现