【原創】k8s原始碼分析-----kubectl(1)api.RESTMapper

月牙寂發表於2016-04-18

 

本文QQ空間連結:http://user.qzone.qq.com/29185807/blog/1460961715

本文csdn博文連結:http://blog.csdn.net/screscent/article/details/51179485

原始碼為k8s v1.1.1穩定版本

 

api. RESTMapper是kube-apiserver和kubectl的基礎,在講解kube-apiserver的時候,我們就有簡單的講解api. RESTMapper,但並沒有系統的講解。那麼這一章,我們先系統的講解下

 

1、構建

原始碼在k8s.io\kubernetes\pkg\api\mapper.go

宣告瞭一個全域性變數RESTMapper,並在init函式中初始化了

 

那麼什麼時候註冊呢?

在之前,我們需要看看,group/version 是一個很重要的東西

1.1 版本號註冊

我們先看下版本號的註冊

 

程式碼在k8s.io\kubernetes\pkg\api\registered

先讀取了環境變數KUBE_API_VERSIONS,一般來說這個設定為空,那就是預設的為"v1,extensions/v1beta1"

 

1.2 GroupMeta

我們再看下groupmeta的儲存

程式碼在k8s.io\kubernetes\pkg\api\latest

groupmeta保持的group的metadata資訊

 接下來就是儲存group的資訊

上面有一個函式,用來註冊group

1.3 Scheme

程式碼在k8s.io\kubernetes\pkg\api\register.go

api下注冊了很多types

k8s.io\kubernetes\pkg\api\v1\register.go

v1下注冊了很多的types

1.4 註冊

程式碼在k8s.io\kubernetes\pkg\api\install

 

從上面的init函式來看,先註冊了“”的一個group資訊,然後初始化了GroupVersiongroupVersion,Group:apiutil.GetGroup(groupVersion),Version:apiutil.GetVersion(groupVersion),Codec:runtime.CodecFor(api.Scheme, groupVersion),groupMeta.Versions = versionsgroupMeta.GroupVersions = groupVersionsgroupMeta.SelfLinker = runtime.SelfLinker(accessor) 在之後NewDefaultRESTMapper

 

 
 遍歷了所有註冊在Scheme的型別,ignoredKinds型別將直接跳過,這裡我們要注意兩個rootScoped對應的是meta.RESTScopeRoot,其餘的對應的是meta.RESTScopeNamespace

2、DefaultRESTMapper

下面我們來分析下RESTMapper的作用程式碼在k8s.io\kubernetes\pkg\api\meta\restmapper.go在上面mapper呼叫了meta.NewDefaultRESTMapper


 
 我們看看結構體



 其實從結構體來看,就是儲存了一個mapping。這個是這個結構的最主要東西 根據上面構建的流程,最後呼叫了Add

 

3、功能

那麼最後就是mapper的提供的功能了

 

查詢version版本

根據version和kind查詢相關的資訊

最後返回一個結構體,主要的就是相對應的kind包含的所有資訊

  

4、總結

首先,註冊所有的version版本,用於版本管理。

然後註冊了所有的group版本,用於group管理

最後,針對group和version註冊了RESTMapper。

 

RESTMapper用於管理所有物件的資訊。外部要獲取的話,直接通過version,group獲取到RESTMapper,然後通過kind型別可以獲取到相對應的資訊

 

 

 

龔浩華

QQ 月牙寂 道長 29185807

2016年4月18日

 (版權宣告:本文為作者原創,如需轉載請通知本人,並標明出處和作者。擅自轉載的,保留追究其侵權的權利。)

 

如果你覺得本文對你有幫助,可以轉到你的朋友圈,讓更多人一起學習。

第一時間獲取文章,可以關注本人公眾號:月牙寂道長,也可以掃碼關注

 

 

相關文章