Kubernetes Dashboard定制化简介
我先前一篇博客其实介绍了另一种Dashboard提供方案, 当时的方案中, 没有涉及到Dashboard的二次开发, 先前的方案适合rbac可用的集群, 当前的这个方案适用性更广, 你仅需要有一个kubeconfig文件, 就可以提供一个 权限控制完善的Dashboard提供用户使用.
Dashboard
本身的权限控制功能太弱了, 而前端的页面多而复杂, 想要结合到我们平台上,
需要精简一下前端, 然后改变后端的鉴权方式, 整个过程的修改应该尽量的小,
以便我们日后能随着Dashboard
的更新来更新, 不然某天出现了安全问题需要更新就很难打patch了.
本次修改不需要你提前会用Dashboard
, 但是要对K8s的API有一定的了解,
然后再读一下Dashboard
的代码. 它的前端是Angular, 后端是Golang.
一般写的不错的代码, 风格都差不多, 大多都践行了表驱动法和中间件的思想. 前端页面中的配置文件肯定时放在一起的, 后端肯定是有中间件的, 我们添加鉴权模块就可以了.
先把程序跑起来
首先你要由一个能用的kubeconfig
文件, 保证自己的kubectl操作可用.
我的上一篇博客中介绍了kubectl proxy
的使用, 如果你有兴趣可以读一下, 相信你对Kubernetes API的概念
会有更深的理解.
前端
前端运行起来比较简单
1 | > yarn start:frontend |
打开websocket支持
有一点你要注意, 默认去读的配置aio/proxy.conf.json
中, 没有显式的开启websocket,
所以shell页面不是的使用方式不是长连接, 如果你想在本地调试时也使用全功能的webshell,
可以改成下面这样.
1 | { |
后端
我个人不太喜欢Golang一定要编译出二进制文件才能运行, 一般都是
go run main.go
直接来跑的.
1 | > cd src/app/backend/ |
然后打开前端页面, 应该是有个全功能的Dashboard.
前端页面裁剪
侧边栏裁剪
具体的代码在
src/app/frontend/chrome/nav/template.html
中, 可以调整顺序, 并且把一些不需要的组件去掉
1 | <kd-nav-item class="kd-nav-item" |
精简serach功能
因为搜索框的触发时, 会搜索所有给定的资源, 因为我们单个NS的pods可能会很多, 会导致搜索框的效率缓慢, 因此, 将搜索逻辑的某些组件也隐藏掉, 当然也可以在这里调整显示顺序
具体的代码在
src/app/frontend/search/template.html
1 | <kd-job-list (onchange)="onListUpdate($event)" |
后端增加鉴权
鉴权位置
dashboard
的后端使用了go-restful这个库, 然后我们找一下它是如何增加中间件的,
它有filter
的概念,
1 | // 代码来自 https://github.com/emicklei/go-restful/blob/v3/examples/filters/restful-filters.go |
我们的目的就是在dashboard后端增加几个全局的filter, 进行鉴权以及用户事件记录.
再看下dashboard
代码位置, 我们针对所有的API做一次再鉴权就可以了.
1 | // src/app/backend/handler/apihandler.go |
鉴权方案
我们是用OpenID做登录的, 但是我又不想去开发这个登录模块了, 所以复用了keycloak-gatekeeper, 最近再看的时候已经停止维护了…
它的功能主要是过滤非登录用户, 同时给后台传递登录用户的具体信息, 比如邮箱或是用户名.
根据邮箱, 用户名, 判断当前请求中的namespace
以及api
是否允许用户访问.
kubeconfig配置自动刷新
我们所使用的Kubernetes集群中, kubeconfig的token是会过期的, 需要我们定期去刷新. 这个涉及到Dashboard的另一项改动,
1 | // src/app/backend/dashboard.go |
我为了能够按照自己的意愿更新kubeconfig, 因此新增了一个生成器,
1 | func NewXXXClientManager(kubeConfigPath, apiserverHost string) clientapi.ClientManager { |
总结
我只是分享下我们的方案, 希望维护PaaS平台的各位由所收获吧. 我个人感觉开发能力比较足的PaaS平台, 都直接内嵌WebShell了, 我们实在没什么前端, 所以就拼凑一下了, 目前方案稳定运行半个月, 稳定性方面应该没什么问题..