彻底拆解 rancher:Let's unbox it

·  阅读 1871

前言

很久没有写技术类的文档和分享了,这两年陆陆续续参与了各方面的工作,从 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 等,了解云原生系统的工作范式。

那就开始吧。

分类:
后端
收藏成功!
已添加到「」, 点击更改