k8s源码分析------kube-apiserver分析(3)

说明:此文章为腾讯云机器自动从本人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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Fish

爬虫入门实战课

写在最前 通过爬虫,可以搜集互联网上很多信息,有助于科研(比如爬个会议的网站之类的),因此想以应用带动一下学习,因此就有了这个小练手。 爬虫代码的主要结构 一个...

1849
来自专栏coding for love

在线商城项目12-商品列表页价格筛选实现

之前我们约定前端传startPrice和endPrice来获取价格区间。我们设定如下规则:

622
来自专栏撸码那些事

【封装那些事】 不充分的封装

以汽车为例,我们并不需要了解发动机的原理就可以开车。这准确描绘了封装原则的作用:用户无需知道抽象(汽车)的细节,此外,封装原则还让抽象能够隐藏实现细节的变化。发...

46913
来自专栏杂烩

程序eclipse下run和debug不一致问题

    公司核心代码,这里不上了,主要将如何发现问题、如何排查问题和如何解决问题。

502
来自专栏云飞学编程

怎么让代码更Pythonic?光有技巧可不行,你还需要看这些

写代码如同写文章,好的文章是反复修改出来的,代码也同样是反复的重构出来的。今天给大家分享下,怎么从一个编程学习者变为一个程序猿(程序媛)!起码不要让别人一看你的...

943
来自专栏24K纯开源

Python 3.x自定义迭代器对象

Python 3.x与Python 2.x之间存在着较多的语法细节差异。今天在看Python核心编程的时候,说到了自定义迭代器对象。于是动手将源码打了一遍,原书...

1896
来自专栏Golang语言社区

论Go语言中goroutine的使用

go中的goroutine是go语言在语言级别支持并发的一种特性。初接触go的时候对go的goroutine的欢喜至极,实现并发简便到简直bt的地步。但是在项目...

3978
来自专栏JackieZheng

AngularJS in Action读书笔记3——走近Services

  试着想想这些问题:如果一个controller只关心自己所控制的view页面,那么对于整个application来说,你如何调用想要的function;如果...

1949
来自专栏微信终端开发团队的专栏

聊聊苹果的Bug - iOS 10 nano_free Crash

背景 iOS 10.0-10.1.1上,新出现了一类堆栈为nano_free字样的crash问题,困扰了我们一段时间,这里主要分享解决这个问题的思路,最后尝试...

4259
来自专栏進无尽的文章

工具篇- FBMemoryProfiler 内存泄漏的自动化排查框架

应用开发到一定规模后,各种内存问题频频出现,还很难定位。你是否也体会过这种痛苦?随着我们工程的体量增长,代码结构变得越来越复杂。这时候很多内存问题就变得越来越难...

762

扫码关注云+社区