如何通过 Kubernetes 管理不可变基础设施

时间:2022-10-17 19:01:33

作者

王海龙,SUSE Rancher 中国社区技术经理,Linux Foundation APAC Evangelist,负责 Rancher 中国技术社区的维护和运营。拥有 8 年的云计算领域经验,经历了 OpenStack 到 Kubernetes 的技术变革,无论底层操作系统 Linux,还是虚拟化 KVM 或是 Docker 容器技术都有丰富的运维和实践经验。


本文整理自王海龙在 SUSECON 北京 2022 开源技术峰会上的主题演讲。

本文主要介绍如何通过 Kubernetes 在边缘设备上部署和管理操作系统,然后将这些边缘设备组建成一个 Kubernetes 集群,最后统一接入到 Rancher 中进行管理。

云原生技术的基础定义

如何通过 Kubernetes 管理不可变基础设施

云原生相信大家已经非常了解了,上图是 CNCF 对云原生的定义,也列出了云原生的代表技术,其中容器、服务网格、微服务、声明式 API 这些技术,相信大家都已经非常熟悉。

其中一项叫不可变基础设施,这个概念并不常见,用起来和我们传统方式有些冲突,有时候大家可能会感觉别扭,我们就从不可变基础设施谈起。

Mutable vs Immutable

如何通过 Kubernetes 管理不可变基础设施

先来对比一下可变和不可变,也就是 Mutable 和 Immutable。

从基础设施角度来看,Mutable 更倾向于我们传统的运维视角,其实就是一个 update in-place,即在原地更新这样的理念,比如:您原来的主机上安装了 apache2,上面部署了业务,想换成 nginx,需要先卸载掉 apache2 服务,然后再重新安装一个 nginx,可能也需要重启服务或者系统来让这次变更生效。这个过程,您的基础设施为了满足业务需求,进行了一次或者多次变更,实际上它就是一个可变的基础设施。

Immutable 的核心思想是任何基础设施的实例一旦创建之后变成为只读状态,如需修改和升级,则使用新的实例进行替换。如果您有新的变更需求,就应该去准备(provision)一个新的基础设施,而不是说在原来的基础上做一个本地的更新。

最大的区别,就是原来的 Mutable 人工干预的比较多,需要靠人工去操作系统里进行各种更改。Immutable 的话,更偏向自动化,您已经预先把基础设施及其依赖都定义好了,这时只需要去触发新的变更就可以完成变更。这里并不涉及到去更改原始的基础设施,这对于基础设施来说,就变成不可变的了。

介绍完这两种理念,大家应该立刻想到了容器技术。您可以构建一个镜像,然后在镜像的基础上去部署业务。如果出现问题,我们不会去容器里去做变更,而是从容器构建阶段去解决问题。所以从容器的角度,镜像就是一个不可变的基础设施。容器技术出现后,Immutable 就变得非常直观,也出现了类似 OCI Image 这样的规范。

Immutable 不只存在于容器领域,也逐渐下沉到了操作系统的层面,Immutable OS 也借助 Container 的理念,形成了许多 Container OS,比如:RancherOS,K3os,CoreOS。这些 OS 的理念,都是从这个角度衍生出来的。

Elemental-toolkit:提供 Container based OS 的自定义能力

如何通过 Kubernetes 管理不可变基础设施

我们之前在使用操作系统的时候,很少自己构建;就算有特殊需求需要构建操作系统,我们自定义的内容也不会特别多。

既然是 Container OS,那就应该像容器一样,能够交付给用户一个充分自定义能力的操作系统。所以我们做了一个叫 Elemental-toolkit 的工具,来让用户自己去构建一个自定义的 Container OS。

这个工具有两个非常重要的特点:

  • 可以使用 Dockerfile 定义操作系统,就像写原始的 docker images 那样。Elemental-toolkit 可以基于您写的 dockerfile 来去构建一个操作系统。这并不是一个简单的镜像,而是一个操作系统,这里面有内核、rootfs,还有您加的软件包。
  • 为了和 OCI Image 的理念整合,所以这个操作系统是可以使用 OCI Image 去做分发;也就是说您构建出来的操作系统,可以上传到 dockerhub。升级的时候,就直接到 dockerhub 去拉这个镜像,然后自动到您的操作系统上安装。也就是说您运维操作系统和运维容器没什么区别。

使用 Kubernetes 管理边缘基础设施

如何通过 Kubernetes 管理不可变基础设施

Elemental-toolkit 可以构建一个自定义的基础操作系统,然后就可以借助 Kubernetes 能力来去管理边缘基础设施。当然,还需要借助一些工具才能实现:

  • RancherD:其实就是一个部署工具,可以实现自定义部署 Rancher/k3s/rke2。RancherD 可以封装到由 Elemental-tools 构建的操作系统里,这样启动操作系统之后就会自动创建 K3s 集群。
  • RancherOS Operator:可以实现自动注册节点到集群,然后批量升级和管理操作系统的版本等一些功能。我们可以通过 RancherOS Operator 来管理这些不可变的基础设施,也就是由 Elemental-toolkit 构建的这些不可变的操作系统。

Demo:通过 Kubernetes 在边缘设备上安装和管理 OS

下面我们将通过 Demo 来给大家介绍如何通过 Kubernetes 在边缘设备上安装操作系统,如何通过 Kubernetes 在边缘设备上管理和升级操作系统。这个 Demo 分为几个核心阶段:

  • RancherOS Operator 安装和设置
  • 构建引导 ISO 映像
  • 创建下游集群
  • 将 OS 安装到节点,并添加到集群
  • 更新 OS

项目地址:​​https://github.com/rancher-sandbox/rancher-node-image​

具体现场 Demo 内容,请参见本视频:​​https://www.bilibili.com/video/BV1NG4y1r75V/?spm_id_from=333.999.0.0​