说明:此文章为腾讯云机器自动从本人csdn博客搬迁过来。是本人授权操作。
申明:无本人授权,不可转载本文。如有转载,本人保留追究其法律责任的权利。
龚浩华,QQ 29185807,月牙寂 道长
第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang
继续接上kube-apiserver分析(2)
在上一篇中,我们分析了storage的注册。下面分析下storage是怎么转换成restful格式的。
我们从k8s.io\kubernetes\pkg\master\master.go 入手
在函数func (m *Master) init(c *Config)中
我们看到api_v1的installrest
跟踪进去
这里面选择了默认的apigroupversion,storage则为之前注册好的storage。
下面我们跟踪进去看下defaultApiGroupVersion
这里返回了一个apiserver. APIGroupVersion。暂时我们不管里面初始化了那些参数。
代码在k8s.io\kubernetes\pkg\apiserver\apiserver.go
下面是APIGroupVersion的结构体
我们回到第一张图中,跟踪进去APIGroupVersion. InstallREST
我们看到了128行 container.Add(ws) 从这里就完成了storage变成restful的真正注册
但我们还是没有看到具体是怎么转的。
我们继续跟踪
在这里生成了一个APIInstaller。prefix则为root+version。
我们看下info
生成了APIInstaller之后NewWebService
这里做了一些参数设定,其中的path就是之前的root+version
紧接着就是
在上面,我们看到遍历了storage的key,然后生成了paths,并排序
然后针对每个path都进行registerResourceHandlers
所以真正的注册在registerResourceHandlers中
这函数比较长
上面的没什么好看的,主要是看看有没有subresource,还有就是获取到一些kind,version等信息
重要的是下图中的第一行,mapping
再接着就是一些处理接口,现在应该比较熟悉了,这个就是storage里面的
我们中间跳过一些代码
直接看到下图。其中scope 则为mapping.scope
scope有两个参数。其中之一为RESTScopeNameRoot。 等到后面我再介绍这个参数的来由
接着,我们看真正的处理封装
scope另外一个参数RESTScopeNameNamespace。
也是注册了一些action
再往下,一个参数结构体
然后遍历所有的actions。
从下图中,我们看到了熟悉的
411行 route := ws.GET(action.Path).To(handler).
425行 ws.Route(route)
当然还有一些
等等,就不一一截图列出来了。
至此我们看到了所有的storage都已经转换成了restful格式,并注册进去了
上面我们还遗留了一个问题,那就是scope有连个类型参数。
现在我们看下k8s.io\kubernetes\pkg\api\install\install.go
在这里有两个类型的sets
然后调用了api. NewDefaultRESTMapper
k8s.io\kubernetes\pkg\api\mapper.go
其中注册在rootscope中的几个类型设置为RESTScopeRoot
剩下的类型为RESTScopeNamespace