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 下yum使用技巧

    本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 经常会遇上一些linux系统允许你上外网,而一些是不允许的,这时我们 ...

  2. centos 环境变量配置

    CentOS系统下如何将PHP和mysql命令加入到环境变量中,在Linux CentOS系统上 安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到 ...

  3. spring boot 使用java9上传到github其他人clone后报错

    错误原因: Java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException jdk9存在版本兼容问题. 经过查找资料发现问题所在 大致意思是ja ...

  4. bzoj 2176 最小表示

    2176: Strange string Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 419  Solved: 174[Submit][Status ...

  5. 初学node.js有感一

    Node.js感悟 一.前言 很久以前就对node.js十分的好奇和感兴趣,因为种种原因没能去深入的认识了解和学习掌握这门技术,最近正好要做一些项目,其中就用到了node.js中的一些东西,所以借着使 ...

  6. 2018/3/2晚11点30分写的程序(C++)

    程序目标:输入一个字符串,竖向输出该字符串.使用string和动态分配内存机制.代码如下: #include<iostream>#include "stdafx.h"# ...

  7. R语言-时间序列

    时间序列:可以用来预测未来的参数, 1.生成时间序列对象 sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40 ...

  8. 关于MYCAT 读写分离,与只读事务的问题.

    习惯性为了复用mysql连接,喜欢加上@Transactional(readOnly = true) 只读事务,很多零碎的查询下,速度会快一些,也环保一些. 最近用mycat做了读写分离,其中一个查询 ...

  9. effective C++笔记-2

    6:析构函数使用 1.如果一个基类是为了多态用途,那么就应该有一个虚析构函数. 2.如果一个类中有虚函数,那么就应该就有一个虚的析构函数. 3.如果一个基类中不是为了多态的用途,或者不作为基类来使用, ...

  10. APP性能测试(电量)

    #encoding:utf-8 import csv import os import time #控制类 class Controller(object): def __init__(self, c ...