Openshift API部分源碼學習筆記(一)

來源:互聯網
上載者:User

標籤: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/[email protected]/-/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註冊啟動命令就建立好了

 

Openshift API部分源碼學習筆記(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.