dashboard架构主要由一个API handler 和 五个manager构成:

API handler用来处理来自客户的http请求,不同的path路由到不同的的handler处理,使用的是go-restful库,

五个manager是ClienManager, AuthManager, SettingManager, SystemBannerManager, IntegrationManager, 分别负责认证,系统设置, 提示条和集成其他组件,并且每个manager独立于一个package中, 由manager和handler两部分组成, manager负责数据处理, handler用来响应各自负责的http request.

client package 根据前端用户请求从api-server获取相应数据, 每个http request中都会携带用户的authinfo, 用于创建a对应的pi server client, 获取用户所需数据, 系统启动时会初始化一个insecureClient用来做一些用户无关的请求,例如获取k8s集群版本,初始化heapster组件等.

auth package中包括所有的认证方面的处理,认证其实是交给K8S apiServer负责的,dashboard只是根据用户登录信息生成authInfo对象,加密后作为token携带在浏览器中, 即jwe协议, jwe子包是JWE协议的实现, 其中KeyHolder(rsaKeyHolder concrete class)用来管理jwe用到的密钥对, 将秘钥存放在kubernetes-dashboard-key-holder secrets对象中, 实时在不同dashboard实例间同步,TokenManager(jweTokenManager concrete class)用来管理token, 根据秘钥解密或生成token来进行权限验证, authManager 中的login method会根据login前端页面返回的信息获取到authInfo信息(Authenticator),然后healthCheck判断是否合法,最后利用tokenManager生成jwe token返回给用户,token的payload保存的就是k8s AuthInfo对象.

sync package 是用来监视k8s资源,会定期poll指定的资源,如果资源发生变化会调用用户注册的回调函数,并且负责对资源的CURD操作, 目前只实现了监控secret, 上面提到的kubernetes-dashboard-key-holder secrets就是通过sync在不同dashboard间同步, poll secrets信息由SecretPoller负责, 他是会定期Get secrets对象(getSecretEvent),根据不同情况返回不同的Event,通过PollWatcher(实现了watch.Interface)中的channle传输到secretSynchronizer中,然后secretSynchronizer根据Event执行不同的回调函数.

此外sync package中有个Overwatch对象用来监视注册到其中的synchronizer对象,它的基本实现就是通过channle来获取synchronizer的错误信息, 然后根据重启策略进行重启.

查看dashboard的deploy文件会发现创建了kubernetes-dashboard-minimal的Role资源并绑定到了dashboard这个deployment上, Role的resourceNames为kubernetes-dashboard-key-holder及其他对象,这些对象都需要在系统初始化的时候设置完毕, 其实就是由上面的insecureClient进行的

setting package是一些基本的设置,包括ClusterName, ItemsPerPage, AutoRefreshTimeInterval 等信息,保存在kubernetes-dashboard-settings 这个config map中,用户可以通过页面来设置,更新这个configMap.

systemBanner package是用来在页面上显示一条banner, 用来提醒用户一些信息的.

integration package用来集成显示其他信息,例如heapster的监控信息, 每个被集成的对象被称为一个integration, 并有一个integration Id 与之对应, integrationManager其实是交给metricManager来管理integration的, metricManager会为每个integration创建一个对应的MetricClient获取数据, heapsterClient就是实现了上述MetricClient接口, 通过heapster提供的data model来访问heapster内的数据.

metricsClient一些方法,如下:

DownloadMetric(selectors []ResourceSelector, metricName string, cachedResources *CachedResources) MetricPromises

这个函数从heapster获取数据,但是封装的比较抽象, 其中ResourceSelector表示某个特定的请求对象,例如请求deployment则其中保存了一些deployment metadata. metricName表示cpu/memory等资源类型, CachedResources用来表示一些高级对象的子对象,例如上面的deployment,因为在heapster没有直接对deployment资源的监控,只有对pod的监控, 所以一个deployment下所有pod的资源使用信息之和就是他的资源使用信息, 此处cachedResources就表示deployment中包含那些pod数组,返回值 MetricPromises包含两个Channel,分别用于获取metric数据和error数据,同时提供了一个GetMetrics用于从channel中获取metric数据.(如果直接看heapster还是比较抽象的,最好从一个资源请求的handler中进去,明白其如何使用之后在看其实现.)

在某些handler中对资源的请求是异步进行的,会启动一个groutine,在其中调用client-go请求api-server,然后再通过channel返回到主线程中,在主线程中进行汇总返回给浏览器.

resoutce/dataselect用于对获取的数据进行过滤,排序,分页等

总的来说dashborad中的技术点包括但不限于: jwe, autogenerate certification, wathchover, synchronizer, heapster integration, go-restful, client-go, csrf....

kubernetes dashboard backend源码剖析的更多相关文章

  1. 豌豆夹Redis解决方案Codis源码剖析:Dashboard

    豌豆夹Redis解决方案Codis源码剖析:Dashboard 1.不只是Dashboard 虽然名字叫Dashboard,但它在Codis中的作用却不可小觑.它不仅仅是Dashboard管理页面,更 ...

  2. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  3. Django----djagorest-framwork源码剖析

    restful(表者征状态转移,面向资源编程)------------------------------------------->约定 从资源的角度审视整个网络,将分布在网络中某个节点的资源 ...

  4. Django Rest Framework源码剖析(八)-----视图与路由

    一.简介 django rest framework 给我们带来了很多组件,除了认证.权限.序列化...其中一个重要组件就是视图,一般视图是和路由配合使用,这种方式给我们提供了更灵活的使用方法,对于使 ...

  5. Django Rest Framework源码剖析(四)-----API版本

    一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...

  6. OpenMPI源码剖析1:MPI_Init初探

    OpenMPI的底层实现: 我们知道,OpenMPI应用起来还是比较简单的,但是如果让我自己来实现一个MPI的并行计算,你会怎么设计呢?————这就涉及到比较底层的东西了. 回想起我们最简单的代码,通 ...

  7. 别人家的 InfluxDB 实战 + 源码剖析

    1. 前几次的分享,我们多次提到了下图中 Metrics 指标监控的 Prometheus.Grafana,而且 get 到了 influxdata 旗下的 InfluxDB 的入门技能. 本次,我们 ...

  8. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  9. Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

    声明:本文为原创博文,转载请注明出处. Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们.在网络编程中,一般都是基于Reactor线程 ...

随机推荐

  1. YUM安装软件

    YUM:介绍.工作流程.本地yum.网络yum.yum的相关命令 一.What is YUM YUM是基于rpm但更胜于rpm的软件管理工具 YUM的优点: 1.更方便的管理rpm软件包 2.自动解决 ...

  2. Python常用数据结构之collections模块

    Python数据结构常用模块:collections.heapq.operator.itertools collections collections是日常工作中的重点.高频模块,常用类型由: 计数器 ...

  3. DxPackNet 5.视频高质量的压缩和传输

    DxPackNet 对视频的压缩和解压也提供了很好的支持,且系统不需要装第三方解码器哦~ 主要用到了 IxVideoEncoder 视频编码器  和 IxVideoDecoder 两个接口 这里只做简 ...

  4. C#语言Devdevexpress控件chart在C/S框架中的使用

    声明.数据库连接机制框架已经写好.框架模式是MVC模式.就以我的from测试.我的做法是在查询页面创建一个按钮,然后在这个按钮上绑定一个点击事件.点击查询按钮把查询条件传到需要显示图例的页面.查询页面 ...

  5. UVA1619 栈维护递增序列

    先说这题的关键性质:每一个数应该只会计算一次,它有一个最小区间[L,R],即它在这个区间内是最小的,最小区间内任何包含它的子区间都不会大于F(L,R)=(a[L]+...+a[R])*min(a[l] ...

  6. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  7. postman 中调试接口的小记录

    1.form-data:  就是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件.当上传的字段是文件 ...

  8. hexo持续更新记录

    port:50187

  9. 网站入住各大搜索引擎的seo优化技巧

    最近在公司上班的时候做了一个工业物联网的项目,上层主管提出要求,让这个网站入住各大搜索引擎,也就是说在各大搜索引擎中输入与网站相关的关键字就能搜索到我们自己的网站.刚开始自己一脸懵逼,因为之前自己并没 ...

  10. nodejs之socket.io模块——实现了websocket协议

    Nodejs实现websocket的4种方式:socket.io.WebSocket-Node.faye-websocket-node.node-websocket-server,主要使用的是sock ...