用multipass开发containerd的方法

431 阅读5分钟

大约18个月前,我开始了一个项目,直接针对containerd进行开发。这提出了一个我以前没有真正遇到过的问题--在我的Mac上的DockerKubernetes已经不够了,我需要一个Linux环境。

开始的时候,我只是用了一台旧的2016型号的Dell XPS,它提供了我所需要的一切,但当其他人开始贡献时,他们都在使用Mac,所以我们有一个问题。多重通行证是我们困境的答案,我们对它感到惊喜,并想知道为什么没有更多的人每天使用它。

我想告诉你一些我们在OpenFaaS社区开发faasd的经验--一个可移植的FaaS框架,就像OpenFaaS,但没有Kubernetes集群的复杂性和开销。

containerd曾经为我们做了什么?

前段时间,Docker的原始版本实际上是用Python写的,然后随着时间的推移演变成了Go的重写版本。Go版本被一些消费者,特别是Kubernetes社区视为单一的。

Docker做了很多事情,甚至一度将集群和多节点协调加入到这个列表中(想想Docker Swarm和Docker EE)。

随着代码库的重构,出现了两个项目:containerd和runc:

  • runc是一个很小的Go二进制文件,它的工作是:根据规范运行一个容器,runc也是OCI规范的驱动程序。
  • containerd的工作是为runc做好准备--比如拉取镜像和定义规范。

然后,Docker作为这两个工具之上的一个细化层,带来了用户友好的开发者体验、网络、高级API和CLI。

随着时间的推移,containerd已经进入了人们的视线,在Kubernetes 1.20中,它将接管在Kubernetes集群中运行容器的职责。现在变化不大,因为containerd和runc一直都在那里,我们只是跳过了几个层次的指示。

containerd并不提供开箱即用的网络,这是最困难的挑战之一。

不是因为它在技术上很复杂,而是严重缺乏文档。

容器网络倡议(CNI)填补了我们的空白,使我们能够在容器之间建立一个网络。

当你眯着眼睛看faasd的时候,你会发现它看起来很像一个单节点的Kubernetes集群,使用的是大多数节点上的相同项目:containerd、runc和CNI。

你为什么要用containerd开发?

创建 "faasd "有两个主要原因--第一个原因是我们听到用户说他们不想为了运行少量的功能、APIS或网页而运行整个Kubernetes集群。第二个原因是我想做一些学习和低级别的编码。

虽然containerd有一个可用的套接字,并且可以挂载或转发,但它并不像你所期望的那样工作。containerd客户端试图在它所执行的主机上运行容器,只是与containerd套接字同步状态。我发现这很让人困惑,但我得到的保证是,这是它设计的工作方式。

你可以看到我们的代码已经发展成两个主要的服务,装在一个单一的二进制文件中。

  • faasd- 启动OpenFaaS的所有核心服务:网关、NATS、Prometheus和我们的队列工作者。一个docker-compose文件被用来定义镜像的版本,以及启动服务的依赖图。
  • faasd-provider- 一个HTTP接口,用于执行函数和机密的调用和CRUD。

两者都是用systemd单元文件安装的,这一次靠在主机系统上,而不是用抽象的东西,让人感到很新鲜。

短版的

multipassCanonical的产品,其开源组件和使用说明可在GitHub上找到

Multipass是一个用于Linux、Windows和macOS的轻量级虚拟机管理器。它是为那些希望通过一个命令就能获得一个新鲜的Ubuntu环境的开发者设计的。

由于它支持云启动的元数据,你可以在你的笔记本电脑或工作站上模拟一个小型的云部署。

在MacOS上,它目前使用hyperkit来运行虚拟机,这是我们可以感谢Docker构建的另一件事。在Windows和Linux上,它使用不同的虚拟化技术,但有相同的简单的用户体验,这意味着我们可以写一个教程就可以了。作为一个忙碌的维护者,我认为这是一个很大的胜利。

下面是你如何用最新版本的Ubuntu服务器启动一个虚拟机。

multipass launch --name faasd

借壳进入虚拟机。

multipass exec faasd /bin/bash

我们后来意识到multipass支持云计算,所以把我们的README改成了下面这个样子。

curl -sSLO https://raw.githubusercontent.com/openfaas/faasd/master/cloud-config.txt
multipass launch --cloud-init cloud-config.txt  --name faasd

我今天有幸在Zoom上与multipass的工程经理和PM交谈,他们告诉我,你甚至可以把cloud-init文件作为一个URL传递,所以我们的教程变得更加简单。

multipass launch --cloud-init https://raw.githubusercontent.com/openfaas/faasd/master/cloud-config.txt  --name faasd

从那里,你有一个完整的Linux系统,有一个工作版本的containerd和Container Network Initiative(CNI)插件正在运行,最重要的是faasd已经启动并运行。

faas-cli list
faas-cli store deploy figlet
faas-cli invoke figlet <<< "faasd"

虽然我还没有使用它,但我听说你也可以从你的基本系统中挂载文件夹来同步你的GOPATH。因此,你可以用VSCode写代码,让内置的终端窗格运行 "multipass exec /bin/bash "或ssh会话。

我最近写了一篇文章:One last trip down memory lane with the Raspberry Pi Zero,我试图把faasd移植到Raspberry Pi Zero上。由于faasd的Go构建时间太长,我放弃了,打开了multipass并交叉编译了它。这整个过程比等待可怜的armv6服务完成它的工作要快。

用于 Kubernetes 的 multipass

你也可以用multipass来运行其他工作负载,我试图用microk8s部署Kubernetes,但遇到了一些默认限制的问题。

首先:没有足够的内存分配,然后是没有足够的磁盘,最后是没有足够的vCPU。在解决了所有这些问题之后,我想出了以下办法。

multipass launch --name microk8s -m 8G -c 2 -d 80G

现在,我们从来没有遇到过这个问题,这并不奇怪,因为faasd被设计得非常精简。它甚至可以在只有1GB内存的Raspberry Pi 3上运行。

总结

每当我们需要从Mac上访问Linux虚拟机时,multipass对我们来说都很有用。它甚至可以用来运行Kubernetes集群,但我通常更愿意使用KinDk3d在Docker容器中部署Kubernetes,因为它的速度和效率更高。

multipass是一个比VirtualBox和Vagrant等工具更精简的选择。该团队正在寻找反馈,并且已经在计划一种启动自定义镜像的方法。比如说:multipass launch openfaasmultipass launch gitlab

我们认为multipass是实现与世界各地的用户合作的一个重要部分,无论他们在桌面上使用Linux、MacOS还是Windows。

大约有20人直接为faasd做出了贡献,还有更多的人间接地做出了贡献。它对我们来说效果很好,我们相信multipass值得更多的关注。

去试试吧,让他们知道哪些地方适合你,哪些地方可以为你的工作流程做改进。