在Raspberry Pi上自托管Kubernetes

2020-12-24 21:18:34

这篇文章的目的是向您展示如何使用Raspberry Pi 4s构建Kubernetes集群以用于自托管API,网站和功能,以便您可以在Internet上公开它们并向用户提供流量。用它来评估您当前的设置,或计划一个新的构建,包括:硬件选项,HA,入口,存储和操作系统选择。

我们将首先解决常见问题,然后再详细探讨许多主题。这些是我在Raspberry Pi上构建集群5年之后建立的。我也想向您学习,所以请随时向我发送推特@alexellisuk。

这里唯一有效的理由是:因为您想要。而且,如果自我托管的想法使您无法接受,那么请立即停止阅读并在Hacker News上发表嘲讽性评论。

我最近和一位朋友交谈时告诉我,他们以每月7美元的价格在著名的PaaS上托管20个小项目。这将使他们每年花费大约1700美元,将这些工作负载转移到RPi可以节省一笔巨款。

在像DigitalOcean这样的最便宜的提供商之一上运行Kubernetes集群,对于一个中等的集群来说,仍然可以将您的价格设置为60-120美元/月。无论是使用旧PC还是某些Raspberry Pi,您都可以用自己的硬件获得更好的价值。我并不是说您应该打电话给老板并给他一个好消息,但是有一些人喜欢建设和运行基础架构,他们也倾向于节省成本。

我在Raspberry Pi上的内容经常会引起分歧。它带来了某些人的最大优势,而另一些人的优势则最差。

让我简单地说一下-Raspberry Pi是Linux服务器。如果您编写代码,或者"执行DevOps"对于日常工作,您有一个用例。如果您每天使用计算机,则有一个用例。

如果您有预算在eBay上购买一些二手工作站,NUC或服务器,它们的性能会更好,但它们也会占用更多空间并消耗更多电量。幸运的是,我们涵盖的大部分内容将适用于Raspberry Pi和您可以使用的任何英特尔套件。

现在,RPi 4可以通过USB从SSD或NVMe启动,因此不再需要担心SD卡的可靠性。 RPi 4具有更快的I / O,高达8GB的RAM和四核处理器。它不仅适合自托管许多类型的应用程序,而且由于它是专用主机,因此它的性能可能优于较小的共享VPS或EC2实例。

现在,使用K3s及其现在在K3s 1.19中引入的嵌入式etcd模式来构建一个可以容忍节点故障的集群非常简单。

自托管服务自然会有一些缺点:您对ISP的正常运行时间有依赖性,您的其他孩子或孩子可能会拔掉基础设施的电源(是的,但是确实如此),但是我认为您会很开心并磨练自己的技能。

因此,无论您是构建家庭实验室,还是希望托管网站,API和自动化工具,我希望您都能从中找到建议。

您将至少需要一个具有2GB或更多RAM的Raspberry Pi 4。如果您希望运行HA群集,那么我建议您购买三个,这样可以容忍节点故障。

让我以粗体显示:您无需花费大量时间来建立集群。在英国,含税的4倍RPi 4大约每片33英镑,总计约130英镑。如果您只想体验自我托管的经验,并且无需花太多钱就可以了解Kubernetes,则可以以大约54英镑(含税)的价格购买单个4GB RPi 4。

Raspberry Pi 3和CM3都存在K3的问题,特别是如果您运行的版本晚于1.17。如果您已有投资(如我一样),建议您出售或赠与它们。

无论您决定使用哪种情况,都要确保它具有风扇。您可以在我的文章《冷却Raspberry Pi 4》中比较选项。

案例的最佳选择是,可以在亚马逊上以20-25美元的价格购买一套压克力板和支架,或者使用专业级的BitScope Cluster Blade。无论您做什么,都不要购买不支持RPi4或具有冷却功能的原始第一代BitScope刀片服务器。

不要为RPi4购买多功能充电器,它们似乎可以正常工作,但是,如果您调查研究发现,它们会“用尽”。官方适配器并不昂贵,我的建议是不要小气。

在存储方面,您至少需要一张32GB的SD卡,但我鼓励您再买一块固态存储。在我的文章中了解性能差异:使用NVMe引导驱动器升级Raspberry Pi 4。有人问M2 SSD是否足以满足RPi4的USB总线的需求,从而造成瓶颈。它们很好,但是NVMe性能更好,成本也差不多,以后可以在您的一台PC中使用。

直到2019年下半年,我们大多数人仍在努力通过kubeadm在我们的RPis上运行上游Kubernetes,这不是一个愉快的经历。为什么?因为kubeadm设计为可在高性能英特尔云服务器上运行,而不是在低功耗ARM SoC上运行。

K3的头条新闻称服务器需要500MB的RAM,使用嵌入式etcd时增加256MB。代理的索赔是50MB的RAM。无论实际使用什么,它都将比kubeadm小得多,并减轻系统负担。

我认为32位操作系统的主要限制是3GB进程限制。这不是我特别担心的事情,但是也许您是吗?真正的问题是:您要使用Ubuntu还是RaspiOS?

Raspberry Pi Foundation确实提供了RaspiOS的beta版,但是它不是精简版,并且配备了完整的桌面。

以我在K3s上的经验,Ubuntu 20.10与RPi4上的RaspiOS Lite一样好。我倾向于推荐使用32位操作系统的RaspiOS,因为大多数Raspberry Pi用户已经在使用它并且对此感到满意。

使用ARM采购应用程序和图表可能会有些棘手,因为许多维护人员尚未考虑将其软件移植到此体系结构。

因此,我将arkade项目构建为一个开源Kubernetes市场。您可以使用它来安装应用程序,无论它们是打包为Helm图表,YAML清单还是附带了自己的CLI。

为什么不使用头盔?在某些情况下确实可以,但是如果ARM不提供软件包,它将告诉您。如果图表具有150个配置选项,则--help文本会告诉您我们认为您需要的配置选项。 arkade info APP命令为您提供有关如何使用该图表的说明,您可以随时获取该信息而无需再次安装该应用程序。

现在有40多个软件包和许多贡献者。在Raspberry Pi上运行的著名软件包包括:Minio,OpenFaaS,证书管理器,入口nginx,Traefik 2,Linkerd,SealedSecrets和Kubernetes仪表板。

arkade还提供快速的CLI下载,以防止在遵循说明时中断流程。您运行了几次啤酒酿造更新"然后立刻后悔吗?

每个软件包都以静态二进制文件的形式下载并放入PATH中。无论您使用的是Intel还是ARM,Linux,MacOS或Windows,都将下载正确的二进制文件(如果有)。

警告:无论您做什么,都应抵制运行第三方的冲动。或您认可的社区构建工具。这很麻烦,代码可能会对您的计算机和网络产生任何影响。另请参阅:"中毒docker images"

我将在Kubernetes上公开服务的主要方法有两种。第一种是使用LoadBalancer,这是使用托管Kubernetes集群最常使用的。通过将服务设置为类型:LoadBalancer并提供多个端口,将配置云负载平衡器并开始在给定IP地址上路由流量。

在家中运行时,您可以使用kube-vip或MetalLB之类的工具,但它们只会为您提供本地网络上的IP地址,外部用户无法访问。如果您正在考虑使用这些工具,则最好只使用NodePort并放弃其他工具。 NodePort在您所有节点上都提供了较高的端口号(例如31112),然后将流量路由到公开的服务。

许多家庭实验室将意识到端口转发,可以在其中设置家用路由器,以将给定端口集上的流量转发到内部网络上的主机。这是通过将较高的非标准端口号映射到内部端口来实现的。不幸的是,许多家庭用户无意中给出了他们的位置,他们的ISP客户编号(Virgin Media,我在看着您),并且在某些情况下,对他们的家庭地址做出了很好的估计。现在,最重要的是,您无法随身携带该IP地址,因此,如果您关闭运行K3s的笔记本电脑的机盖,并打开咖啡馆的强制门户上的机盖,您的服务将不再可用。

同样,您的IP可能会更改。缓解措施是运行一个守护程序,该守护程序不断检查您的IP地址并更新您的DNS记录。

在早期,我曾经使用Ngrok从您的内部网络中挖出隧道,但是不幸的是我一直遇到它的连接和速率限制。它还没有Kubernetes集成,而且并非缺乏尝试-Joe Beda(Kubernetes的联合创始人)曾经建立了一个项目来尝试解决此问题。

在过去的一年中,我开发了一种名为“入口”的工具,该工具可以解决端口转发和Ngrok的问题:无需手动配置,没有高端口,没有暴露您的位置,IP随您而移动-甚至到咖啡店和它绝对没有人为的速率限制,因为您可以在自己的VM上自行托管隧道服务器。

入口是一个从头开始构建的Cloud Native隧道,可在容器,VM,Kubernetes,Linux,Windows,MacOS和ARM中使用-随便命名。

它的扩展性比VPN好,因为您不必为每个主机分配IP地址和子网。您可以在几分钟之内建立成千上万个入口隧道,然后按照客户告诉我的那样,通常必须在现场派工程师或承包商来配置他们的VPN。与SSH隧道不同,它不需要额外的工具即可保持其运行,并且不需要额外的配置即可通过HTTP代理。

您在限制性网络内部运行客户端,而服务器在公共VM上运行。两者连接后,您就可以从公共VM的IP访问私有服务。由于客户首先说话,所以往往会“工作正常”。

入口使用入口操作员集成到Kubernetes中,您可以使用arkade或头盔安装它:

arkade安装入口运算符\ --provider digitalocean \ --region lon1 \ --token文件〜/ do-api-key.json \ --license文件〜/ LICENSE

在自述文件中,您将发现入口OSS和PRO之间的区别,因为建议使用自托管PRO,并且具有更多功能。社区成员添加了大约六家云提供商,但我更喜欢DigitalOcean,因为它具有启动时间短,成本低(约5美元/月)的优势。

运行该命令后,您公开的任何LoadBalancer都会在公共云上创建VM,并部署入口服务器。然后,入口客户端将在您的集群中运行,并且您可以随意托管自己的主机。

现在,Kubernetes的一个著名技巧是仅公开一个LoadBalancer,并通过不同的DNS名称将所有站点托管在同一IP地址上。这可以通过Kubernetes Ingress来完成。

除非另行配置K3,否则它将在安装过程中为您添加Traefik1.x。 arkade附带了多个您可以使用的IngressController应用程序,例如Traefik 2和Kong,但是我倾向于使用ingress-nginx。

因此,无论您是在使用公共云,还是在家中使用入口运营商和自我托管,现在都只需要为一台VM或Cloud LoadBalancer付费,而不必为每项服务付费。

使用入口,您还可以通过运行cert-manager并将隧道80和443从出口服务器传输到Kubernetes ingressController来获取TLS证书。

您可以为服务建立自己的头盔图,并通过IngressController公开它。

有关Node.js舵图的示例,请参阅我的Express.js微服务示例,该示例具有Dockerfile,Kubernetes YAML和非root用户:alexellis / expressjs-k8s。

我在这里有偏见,但我更喜欢使用OpenFaaS托管微服务和API。工作流程看起来像这样:

从那里,我可以使用商店中的许多语言模板之一来创建函数并进行部署:

faas-cli模板存储拉出golang-httpfaas-cli新的--lang golang-http \ --prefix alexellis2 \ my-apifaas-cli发布--platforms linux / amd64,linux / arm / v7faas-cli deploy -f https:/ /openfaas.example.com

还可以使用FunctionIngress附加组件来部署自定义域,例如my-api.example.com:TLS和函数的自定义域

您还可以将您的API和网站重新映射为一个REST风格的API。

就CI / CD而言,如果您正在使用OpenFaaS,则可以使用现有的API来部署函数,而GitHub Actions可以构建多体系结构映像,请参阅Utsav Anand的这篇文章:使用GitHub构建和部署OpenFaaS函数动作。

如果选择了64位操作系统,则可以选择Flux,但要进行大量配置工作,需要配置配置库(详细说明要应用的清单)以及用于构建和部署映像的单独工作。

您还可以使用公共IP公开Kubernetes API服务器,请参阅我的指南:从任何地方对您的私有集群进行kubectl访问。

如果您不需要使用OpenFaaS,则可以在与Helm或Kustomize一起部署时将其与CI / CD管道结合使用。

对于状态应用程序(如Minio或Prometheus),您将需要PersistentVolume-将文件存储在容器的文件系统中。

K3随附了“本地路径设置程序”。它将主机存储用于永久卷。它确实有一些限制,您可以在此处阅读。

我不会自称是自托管Kubernetes块存储的专家,但是Longhorn,NFS和Ceph似乎都很流行。

只是为了展示ARM支持的发展情况,在5天前发布了Longhorn v1.1.0,它增加了对64位ARM操作系统(如Ubuntu 20.10)的支持。

OpenEBS项目还在2020年11月的2.3.0版中获得了对64位ARM的beta支持

如果我要托管一个需要数据库,S3或Redis缓存的应用程序,那么我可能会对那些部分使用托管服务,特别是如果我关心数据的话。在DigitalOcean上,托管数据库的起价为合理的15美元/月,与托管S3等价的" Spaces"开始于5美元/月。

重建集群和重新部署无状态微服务很容易,更困难的是管理有状态的应用程序并从数据丢失中恢复。

毫无疑问,托管自己的注册表比在美国西海岸使用Docker Hub镜像要快,特别是如果您像我一样住在欧洲的话。这不是严格必要的,但是您应该尝试一下,看看是否适合您。

通过将IngressController与imports-operator隧道连接,您可以运行几个arkade命令并获得自己的注册表:

从那里您将获得有效的TLS证书,并且可以在任何地方使用它,并且还具有auth:

现在也许在上一节中我有些自嘲。我确实非常了解一件事,那就是网络启动,以至于我花了一周时间为我的GitHub赞助商建立了一个研讨会,以便他们节省时间。当您考虑构建和测试说明所花的时间时,每月拨出一美元是不错的价值。

容器化是在Kubernetes集群上运行容器的通常选择,但它不支持NFS,这是网络启动机器的主要选择。这就是Mythic Beasts用于自己的RPi云的原因,不幸的是,为什么用户无法在其中运行K8或Docker。

我的实验室将介绍解决方法,并为您提供在RPi3和RPi4上进行网络引导所需的内容。整洁的是,一旦将根文件系统托管在另一台计算机上,就可以通过使用NVMe进行备份来提高速度。

每当遇到节点问题时,就说序列号为c3e76471的节点-我只运行rm -rf / nfs / c3e76471,然后运行配置脚本并重新启动设备。使用BitScope群集刀片时,我什至可以使用其微控制器远程重启电源。

如果您想学习网络引导的工作原理,可以在我的新文章“新堆栈:云原生世界中的裸机”中阅读更多内容。

要访问我的Raspberry Pi高级网络启动研讨会,只需在Treasure Trove层上注册我的GitHub赞助商,然后单击Insiders Update。

假设您想将所有这些放在一起,以便使用K3,Traefik,OpenfaaS和cert-manager为IngressController创建一个具有高可用性的Kubernetes集群,并为其使用一个公共IP。就像我为KubeCon演示构建的设置一样。

K3可以使用etcd或外部数据库支持两种模式的多主机/高可用性:

想象一下,您购买了三台具有4GB RAM的RPi4作为服务器,以及两台具有8GB RAM的RPi4来运行工作负载。这是如何使用k3sup对其进行配置的方法:

#!/ bin / bashset -eCH = 1.19echo安装服务器1k3sup install --user pi --ip 192.168.2.147 \ --k3s-channel $ CH \ --clusterecho安装服务器2k3sup join --user pi --ip 192.168。 2.141 --server-ip 192.168.2.147 \ --k3s-channel $ CH \ --serverecho安装服务器3k3sup join --user pi --ip 192.168.2.123 --server-ip 192.168.2.147 \ --k3s-channel $ CH \ --server \ --print-commandecho安装代理1k3sup join --user pi --ip 192.168.2.129 --server-ip 192.168.2.147 \ --k3s-channel $ CH echo安装Agent 2k3sup join --user pi --ip 192.168.2.131-服务器IP 192.168.2.147 \ --k3s-channel $ CH

然后,我们将使用arkade安装所需的各种头盔图表和Ingress记录:

#安装cert-managerarkade安装cert-manager#安装OpenFaaSarkade安装openfaas#安装imports-operatorarkade安装installs-operator --provider digitalocean \ --region lon1 --license-file〜/ LICENSE \ --token-file〜/ Downloads / do-access-token#从TraefikINGRESS_IP = $获得公共IP(kubectl get svc / traefik -n kube-system -o jsonpath =" {。spec.loadBalancerIP}")#创建DNS A记录为该IPdoctl域创建selfhosted.example.com --ip-address INGRESS_IP#生成OpenFaaSarkade的入口记录install openfaas-ingress \ --ingress-class traefik \-向[email protected] \ --domain selfhosted .example.comexport OPENFAAS_URL = https://selfhosted.example.com#登录到openfaasfaas-cli登录

docker login --username alexellis2#部署一个函数(alexellis2是我的Docker Hub名称)faas-cli new --lang node12 \ --prefix alexellis2 \ slashcommandfaas-cli publish --platforms linux / arm / v7,linux / arm64,linux / amd64faas-cli deploy#调用函数curl https://selfhosted.example.com/function/slashcommand

在5年的时间里,我写了许多关于Raspberry Pi上的容器和集群的教程。事情在不断发展,支持越来越好。如果上次尝试时遇到困难,请再试一次。

如果您喜欢本教程,请在假期中尝试一下,让我知道您对进气口的看法。您可以通过Twitter @alexellisuk与我联系。

您可以观看来自KubeCon的演讲,学习构建集群的各种方法,观看从GitHub部署到RPis的实时演示,并了解我在自己的集群中使用的东西。 现在,如果Kubernetes不适合您, ......