前言
很久没有写技术类的文档和分享了,这两年陆陆续续参与了各方面的工作,从 IaC 的探索到 SRE 体系的建设,到 API gateway 的设计,粗粗的看过了一个云平台从制备到部署到运营的全流程。最近在负责产品中 API gateway 的建设,而涉及到 cluster management,就没法绕开 kubesphere, rancher 等著名的实现。
网上对 rancher 的源码解析很少,即使有寥寥几篇,也大多流于表面,或过于陈旧。往往让人心生疑惑,做一个 cluster management 这么简单,各路大神们不屑于分析?
当我抱着疑惑去阅读 rancher 代码时,读完整体代码结构尚不觉得有什么稀奇。但随着工作展开,真正去构建 API gateway 的时候,深感开源实现和企业级应用的鸿沟。开源实现可能可以只实现基本的 CRUD,但企业用用中,账号系统、权限体系的建设;运营流、业务流的搭建;第三方团队的接入;产品 SLA/SLO 的建设等,才是工作量的大头,且难以通过开源软件的堆砌达到满意的效果。而在自己构建整个技术体系的过程中,方法论和架构设计又成了拦路石。如果设计者没有一定的思维能力,往往会导致代码不断的推翻重建。
带着这些思绪,我再一次打开了 rancher 的工程,并写下了这个系列:Let's unbox rancher.
这个系列可能会陆陆续续写很多,涵盖基础设施的对接、集群管理、隧道管理、控制面与管理面、认证鉴权、API 建设等等内容,也算是作为我的工作随笔,有空时就写下一些心得和体会。
rancher 架构
首先了解一下 rancher 本身的架构。
里面重要的部分有
- 认证鉴权:具体方式和原理是什么?
- 用户管理:具体方式和原理是什么?
- cluster controller/agent:各自的功能和业务流程是什么?
- 通信隧道:如何建立和通信?
至于 rancher API 有哪些接口,各自起到什么能力,过于琐碎,读者自己参考 rancher 的 v3 API 即可。
在查看源码时,默认读者希望管理已有的 k8s 集群,而非通过共有云的 k8s 服务创建集群,或通过 rke 创建集群。这是因为集群制备涉及到 IaaS,已超过 rancher 的 scope,即使 rancher 支持 k8s 集群的制备,只不过是调用真正的 k8s service 的接口而已。
这里先抛出上述问题的答案,带着这些问题,我们将深入到 rancher 的代码中。
- 认证:agent 上报 service account token,server 通过 impersonation 技术委托托管账号执行请求
- 鉴权:server 暴露 rancher RBAC 管理系统,并转化为 k8s RBAC 规则分发到后端集群
- 用户管理:直接对接 IDP,创建内部账号
- cluster controller:主要监听后端集群资源变化情况,执行调谐操作
- cluster agent:主要做集群注册、信息上报、请求转发
- 隧道:基于 websocket 建立双工隧道
代码结构
本系列基于 rancher v2.5.9,只涉及 rancher 服务端,不涉及前端。打开项目后,代码结构可大致分为
- 若干子项目的主函数:根目录下的
main.go是 rancher 的主函数,cmd下包含了 rancher agent 与 rancherd 的主函数 - API 定义 & code-gen:
pkg/api包含 web server 的框架,pkg/apis包含 CRD 定义,pkg/codegen包含了 code-generator - k8s operators:
pkg/controllers - 隧道模块:分散在多个包中,如
pkg/dialer,pkg/httpproxy,pkg/k8slookup,pkg/peermanager,pkg/tunnelserver,pkg/clusterrouter。rancher 本身对隧道的管理和对集群的管理解耦不彻底,也是因为 remotedialer 包本身不做集群管理导致的。 - 集群管理模块:见
pkg/multiclustermanager
能看出 rancher 的代码结构对各个子组件做了大致的分类,但代码仍显得比较混乱,模块化做的并不出色。
行文思路
接下来,让我们庖丁解牛,把 rancher 拆解干净。rancher 的能力可概括为三大部分
- 集群管理
- 用户管理
- 请求转发
各自包含的重要子模块为
集群管理:
- controllers
- cluster agent
- multi-cluster manager
请求转发:
- 认证模块
- 鉴权模块
- 隧道模块
- 请求转发模块
用户管理:
- 账号管理
- IDP 对接
- token 管理
- 权限管理
在这些模块中,最基础和独立的是隧道模块和集群管理模块,了解 rancher 如何知晓一个集群的存在,如何将请求从 rancher APIServer 转发到后端 k8s 集群,就可以了解 rancher 的大致工作模式了,其他不过是基于该工作模式的业务逻辑。
所以后面我们会优先梳理完隧道模块,并基于隧道分析 agent 和 multi-cluster manager 在集群注册和集群管理方面的行为,之后通过讲解 k8s 的认证和鉴权,结合请求被转发的流程,分析 rancher 与后端集群通信时,认证和鉴权是如何开展的。
之后,我们将分析 rancher 的用户管理和权限管理模块,基于上面的隧道模块,读者可以理解 rancher 的管理面和 k8s 的控制面是如何协同工作的,rancher 又做了哪些不透明的小动作。
最后,我们会分析一些 rancher 的工具,比如 CI/CD, service mesh, monitoring, app store 等,了解云原生系统的工作范式。
那就开始吧。