背景
目前,很多边缘计算容器开源项目在使用上均存在一个默认的前提:用户需要提前准备一个标准的或者特定工具搭建的 Kubernetes 集群,然后再通过特定工具或者其他方式在集群中部署相应组件来体验边缘能力。这无疑提高了用户体验边缘能力的门槛,而且使用上有众多的限制,让用户很难上手。 简单整理,大概会有如下问题:
门槛太高
- 用户需要提前准备一个 Kubernetes 集群,对于很多用户来说门槛太高,搭建的流程比较复杂,容易失败,把很多想使用边缘能力的人群拒之门外;
限制性太大
- 往往要求特定工具搭建的特定版本的 Kubernetes 集群,通用性太差,用户在想在实际生产环境上使用限制性太大;
添加边缘节点比较麻烦
- 添加边缘节点需要依靠搭建 Kubernetes 集群本身的工具添加 Kubernetes 原生的节点再进行转化,对第三方工具依赖性较强,并且操作流程比较麻烦,容易出错;
自动化能力较差
- 无论 Kubernetes 集群的搭建,还是添加边缘节点都很难在生产环境自动化起来,相关流程还需要自己的团队进行二次开发,集成难度较大;
为了降低用户体验边缘能力的门槛,云原生社区的同学打算开发一个可以一键部署边缘 Kubernetes 集群的方法,让用户可以更容易、更简单的体验边缘 Kubernetes 集群。
架构设计
针对上述问题,为了降低用户使用边缘 Kubernetes 集群的门槛,让边缘 Kubernetes 集群具备生产能力,我们设计了一键就可以部署出来一个边缘 Kubernetes 集群的方案,完全屏蔽安装细节,让用户可以零门槛的体验边缘能力。
初衷
- 让用户很简单、无门槛的使用边缘 Kubernetes 集群,并能在生产环境真正把边缘能力用起来;
目标
一键化使用
- 能够一键搭建起一个边缘 Kubernetes 集群;
- 能够一键很简单、很灵活的添加边缘节点;
两种安装创景
- 支持在线安装;
- 支持离线安装,让私有化环境也能很简单;
可生产使用
- 不要封装太多,可以让想使用边缘 Kubernetes 集群的团队能在内部系统进行简单的集成,就生产可用;
零学习成本
- 尽可能的和 kubeadm 的使用方式保持一致,让用户无额外的学习成本,会用 kubeadm 就会用 edgeadm;
原则
- 不修改 kubeadm 源码
- 尽量引用和复用 kubeadm 的源码,尽量不修改 kubeadm 的源码,避免后面升级的隐患;
- 基于 kubeadm 但又高于 kubeadm,不必被 kubeadm 的设计所局限,只要能让用户使用起来更简单就可以被允许;
- 允许用户选择是否部署边缘能力组件;
- 允许用户自定义边缘能力组件的配置;
设计与实现
我们研究了 kubeadm 的源码,发现可以借用 kubeadm 创建原生 Kubernetes集群、join 节点、workflow 思想来一键部署边缘 Kubernetes 集群,并且可以分步去执行安装步骤。这正是我们想要的简单、灵活、低学习成本的部署方案。于是我们站在巨人的肩膀上,利用 Kubedam 的思想,复用 kubeadm 的源码,设计出了如下的解决方案。
其中
kubeadm init cluster/join node
部分完全复用了 kubadm 的源码,所有逻辑和 kubeadm 完全相同。
这个方案有如下几个优点:
完全兼容 kubeadm
我们只是站在 kubeadm 的肩膀上,在 kubeadm init/join 之前设置了一些边缘集群需要的配置参数,将初始化 Master 或 Node 节点自动化,安装了容器运行时。在 kubeadm init/join 完成之后,安装了 CNI 网络插件和部署了相应的边缘能力组件。
我们以 Go Mod 方式引用了 kubeadm 源码,整个过程中并未对 kubeadm 的源码修改过一行,完全的原生,为后面升级更高版本的 kubeadm 做好了准备。
一键化,用起来简单、灵活、自动化
edgeadm init 集群和 join 节点完全保留了 kubeadm init/join 原有的参数和流程,只是自动了初始化节点和安装容器运行时,可以用edgeadm --enable-edge=fasle
参数来一键化安装原生 Kubernetes 集群, 也可以用edgeadm --enable-edge=true
参数一键化来安装边缘 Kubernetes 集群。
可以 Join 任何只要能够访问到 Kube-apiserver 位于任何位置的节点, 也可以 join master。join master 也延续了 kubeadm 的的方式,搭建高可用的节点可以在需要的时候,直接用 join master 去扩容 Master 节点,实现高可用。
无学习成本,和 kubeadm 的使用完全相同
因为kubeadm init cluster/join node
部分完全复用了 kubadm 的源码,所有逻辑和 kubeadm 完全相同,完全保留了 kubeadm 的使用习惯和所有 flag 参数,用法和 kubeadm 使用完全一样,没有任何新的学习成本,用户可以按 kubeadm 的参数或者使用 kubeadm.config 去自定义边缘 Kubernetes 集群。
边缘节点安全增强
借助 Kubernetes Node鉴权机制,我们默认开启了NodeRestriction准入插件,确保每个节点身份都唯一,只具有最小权限集,即使某个边缘节点被攻破也无法操作其他边缘节点。
Kubelet 我们也默认开启了Kubelet配置证书轮换机制,在 Kubelet 证书即将过期时, 将自动生成新的秘钥,并从 Kubernetes API 申请新的证书。 一旦新的证书可用&