kubernetes dashboard backend源码剖析
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....
转载于:https://www.cnblogs.com/gaorong/p/8576168.html
kubernetes dashboard backend源码剖析相关推荐
- kubernetes源码剖析读后感(二)
注:结合书中的大概内容以及笔者自身的k8s经验 总结学到的一些新知识每一篇篇幅不会很长 书很棒强烈推荐买一本读 本次读书来自于<kubernetes源码剖析> 作者郑东旭 因为第二章确实笔 ...
- kubernetes源码剖析读后感(一)
注:结合书中的大概内容以及笔者自身的k8s经验 总结学到的一些新知识每一篇篇幅不会很长 书很棒强烈推荐买一本读 本次读书来自于<kubernetes源码剖析> 作者郑东旭 第一章kuber ...
- kubernetes的api操作和kubectl的源码剖析
1.kubernetes的api文档的网址: https://kubernetes.io/docs/concepts/overview/kubernetes-api/ 2.kubernetes的go语 ...
- K8s基础知识学习笔记及部分源码剖析
K8s基础知识学习笔记及部分源码剖析 在学习b站黑马k8s视频资料的基础上,查阅了配套基础知识笔记和源码剖析,仅作个人学习和回顾使用. 参考资料: 概念 | Kubernetes 四层.七层负载均衡的 ...
- k8s-client-go源码剖析(一)
简介:云原生社区活动---Kubernetes源码剖析第一期 有幸参与云原生社区举办的Kubernetes源码剖析活动,活动主要以书籍<Kubernetes源码剖析>为主要思路进行展开,提 ...
- Redis源码剖析和注释(十六)---- Redis输入输出的抽象(rio)
Redis源码剖析和注释(十六)---- Redis输入输出的抽象(rio) . https://blog.csdn.net/men_wen/article/details/71131550 Redi ...
- 【Redis源码剖析】 - Redis IO操作之rio
原创作品,转载请标明:http://blog.csdn.net/xiejingfa/article/details/51433696 Redis源码剖析系列文章汇总:传送门 Reids内部封装了一个I ...
- FlinkSQL平台化之路-StreamX提交源码剖析
前言背景 在公司里做实时计算开发,之前大部分job都采用的是基于java的streaming编程方式进行的,这样的好处很明显:足够灵活,可以应对各种复杂的实时分析场景,但缺点也很明显:上手存在门槛,需 ...
- 豌豆夹Redis解决方案Codis源码剖析:Proxy代理
豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...
最新文章
- C++实现stack【栈】
- Camera+销量突破200万 创始人分享成功经验
- 【精品计划 附录2】- 算法分析
- android glide加载不出图片_Glide实现共享元素无缝转场效果,只需四步!
- 年轻人开始“反推荐算法”:算法不讲武德!
- Python之调用函数
- Android实现多条Toast快速显示(强制中止上一条Toast的显示)
- 琴岛学院计算机工程系怎么样,青岛理工大学琴岛学院计算机工程系学子荣获全国网络技术挑战赛二等奖...
- 熊猫烧香病毒样本分析
- 漫游配置文件修改为强制配置文件|ntuser.dat ntuser.man
- 蓝桥杯嵌入式总结(KEY配置_按键扫描(三行代码)_矩阵按键_GPIO口输入和输出类型)
- 使用 Taurine “牛磺酸” 及 AltStore 越狱 iOS 11-14.3 教程
- cad角度怎么画_软件CAD | 各种“线”工具
- Javase day06_汇总
- NLP - 文本向量化
- 互联网金融学习总结(2)——互联网金融风控的应用场景及风控手段
- SELinux/SEAndroid -- 基础知识介绍
- 小白必看!渗透测试的8个步骤
- Ubuntu20.04解决安装synergy失败问题
- java计算机毕业设计ssm在线教学管理系统java计算机毕业设计ssm易物小店交换系统-二手咸鱼交易系统
热门文章
- 天龙源码框架分析_MySQL8-InnoDB总体架构和运行机制的系统分析(上)
- linux安装远程连接snmp的,远程安装net-snmp全过程
- java操作samba_使用Java和Samba JCIFS访问文件
- 华为8x计算机横屏怎么设置,荣耀8x怎么设置横屏显示 两种操作方法详细介绍
- php soap对象数组,nusoap传递数组对象
- hashmap 遍历_这21个刁钻的HashMap面试题,我把阿里面试官吊打了
- Python基本数据类型的注意事项
- 【杂谈】为了让大家学好深度学习模型设计和优化,有三AI都做了什么
- Ubuntu下对双显卡的支持问题
- 谈谈跨界在软件开发中存在的意义