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. Linux系统软件安装的几种方式

    Linux系统,一个文件能不能执行看的是有没有可执行权限x,不过真正的可执行文件是二进制文件(binary file),举例来说Linux上的c语言源码编写完后,通过gcc程序编译后就可以创建一个可执 ...

  2. 史上最全的FTP网址

    无帐号密码的为匿名登录 ftp://202.114.1.121 ftp://202.114.10.199 ftp://warez:cn.ftp@202.114.12.174 ftp://Music2: ...

  3. Google 浏览器被劫持怎么办?

    chrome://version/ 输入以上语句,在命令行中可看到恶意网址,复制该命令行,修改后面的网址即可

  4. basler 相机拍照简单类综合Emgu.CV---得到图档

    在网上找了半天都是下载要钱,自己试做了,经测试能ok,一起分享吧.给初学的人一点鼓励. using System;using System.Collections.Generic;using Syst ...

  5. oracle报表功能

    需求是将指定的批量sql语句执行的结果通过脚本导出成txt或者能用excel打开的文件. oracle导出文件可以通过spool命令实现,通过bat脚本登录sqlplus,然后引入sql文件即可,源码 ...

  6. vue项目中遇到的问题

    在 export defaul new Router({ )} 这个路由配置中一定要加mode : 'history' 否者就会在路由前面默认添加# 路由跳转的几种方式: 在VUE中使用less来编译 ...

  7. cronatab周期性任务

    要执行周期性任务,要保证服务运行.服务名为crond:service crond start ; systemctl start crond; 配置文件 /etc/crontab cron的日志文件 ...

  8. javascript form表单常用的正则表达式

    form验证时常用的几个正则表达式 座机: \d{3,4}-\d{7,8} 手机号: /^1[34578][0-9]{9}$/ (\86)?\s+1[34578]\d{0-9} (\+86)?\s*1 ...

  9. mongodb一些使用技巧或注意事项记录

    1.有的时候需要删除指定字段那一列,使用update操作.例如要删除name这一列: query  json: {"name":{$exists:true}} update jso ...

  10. zTree实现删除树节点

    zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...