起因

许多自带电脑上班的程序员或多或少都会遇到这样的窘境——公司发放的傻大黑粗跟你自购的顶配轻薄全能本相比无论是在重量上还是性能上都可以说是捉襟见肘,如果你有幸和我一样公司发的是i5 8G 128GSSD的所谓12寸商务办公本,有着瞎眼的72% NTSC色域和1366 * 768 分辨率的先进屏幕,且有着五年一换的更新机制,你一定不知道要拿它怎么办。

说句老实话,放在办公室当开发环境的服务器我都嫌占空间,我的主力机多开个虚拟机都比它流畅.jpg。

但就这么放着又有点可惜,在办公室的抽屉里躺了三年,每次过年过节都要提心吊胆它在办公室会不会电池鼓包自燃。再说它有雷电接口,有千兆网口,配置还算过得去。

等会儿?千兆网口?

于是我决定把它带回家,取代家里的R4S软路由和两台树莓派3B+组成的容器集群,折腾一个低配版All in One。

前期准备工作

如果你和我一样,打算长期24 * 7将笔记本开着运行家庭服务,首先我建议你要先把电池下掉,以免长期低温烘烤使得电池鼓包,这是非常危险的,尤其在家庭环境中更是如此。

虽然把电池下掉有着这样那样的缺点,早期的Macbook有着无电池保护机制,会自动降低系统性能(并不清楚最新的是否也如此);而像绝大多数的商务本在某些固件更新之前会检测电池是否接入,所以你在下掉电池前最好将各种固件都升级到最新的稳定版,再进行拆机操作。

拆掉的电池

在拆掉了电池之后要记得把这玩意儿拿远点,你可以像我一样选择不丢必要的时候接回来进行固件更新,但千万不要把这玩意儿放房间里。

此外为了维护方便,我选择不装后盖的螺丝,这样随时可以拆开上内存条或者换SSD。

卸了电池的后果👆,无法进行固件更新

之后我给电脑装上了人民喜闻乐见的Ubuntu,并进行了忽略合盖操作的设置。

大致准备工作到此结束,接下来准备进入正文。

部署应用

K3s

由于这次拆机我顺便上了一条闲置的8G内存条,所以比起在树莓派上简单地运行docker应用,我有充足的底气要进行瞎折腾,准备部署Rancher进行容器编排管理,因此第一件事,我们要装上Rancher官方力推的K3s。

看这个命名想必你也能明白,其实这就是K8s的轻量版,我们这次采用高可用外部数据库的安装方式,将MySQL数据库定时备份到树莓派上,这样就算主机本身需要重装,也不会影响到我们的使用。

对于这个安装方式,我只能说Rancher官方提供的中文文档已经相当完备完善且傻瓜了,甚至推出了AutoK3s这样的工具防呆,在这样的背景条件下再多写一个字我都觉得自己在水字数,废话不多说,直接上链接!

K3s使用外部数据库实现高可用安装:https://docs.rancher.cn/docs/k3s/installation/ha/_index/

AutoK3s使用教程:https://docs.rancher.cn/docs/k3s/autok3s/k3d/_index

看链接你就知道都是官方文档,无毒可食用。

对于Rancher来说,最简单的安装方法就是在高可用的K3s Cluster上进行安装,这就相当于打地基。

Rancher

Rancher的安装同样有着相当完善的官方文档,虽然最新2.6版本的官翻还没出来,但是你依旧可以放心大胆的参照2.5的步骤执行操作。

Rancher高可用安装指南:https://docs.rancher.cn/docs/rancher2.5/installation/install-rancher-on-k8s/_index

首先需要注意的是Rancher需要你有一个https证书,当然如果你自己本身有一个当然皆大欢喜,如果只是内部使用,你可以使用cert-manager来颁布证书,这样的缺点无非是你用Chrome访问页面的时候需要在警告页面手动输入 thisisunsafe 字样来进入管理后台界面。

Rancher的访问同样要求你设置一个自定义域名,对于家用环境,我选择简单粗暴在路由器的host配置设置一个home.rancher.xx的域名映射到主机。

输入thisisunsafe之后就成功进入页面啦~
在Rancher管理后台,你可以查看节点资源的使用状态

我都跑了些什么

Nginx

首先当然是一个家庭应用的入口,Nginx,通过配置不同的host域名访问不同端口的应用,这样就省的一个一个输入ip+端口访问啦。

当然有人看到这里还是一头雾水,为什么我不能直接docker run -p 80:80 nginx:latest 来运行呢?

首先当然是为了好玩,其次通过Rancher编排容器化应用在多节点扩容缩减和负载均衡方面有着天然的优势,其次对于熟悉了这套部署流程的人来说,无论部署什么都是信手拈来,效率很高。在应用运行的同时可以直观感受资源的占用情况,这是简简单单的docker run无法比拟的。

方便进行多节点scale操作
服务发现端口配置
ingress入口暴露

Redis + MySQL

我自己开发的一些应用基本都采用Redis做快速缓存,所以在跑测试Demo的时候都会用到这个Redis环境。

当然数据库服务也是不可或缺。

Gitlab

一个私有化部署的git仓库。

DockerHub

如果你需要做一个家庭容器化环境的管理,一个私有化的镜像仓库是必须的。

DDNS + 内网穿透

外网访问回家庭开发环境的神器,同时为了安全,我开了路由器的防火墙,只开放了自定义端口入网规则。

软路由各种插件的管理端

由于你们都懂的原因,这里就不细说是什么应用了。在这里我也得承认我标题党了,其实说要All in One,但我还是没放弃软路由,因为实在是没必要,而且小巧一台摆在弱电箱正好,非得折腾一个笔记本去替换属实是画蛇添足,但我将上面应用的访问入口和管理页面都管控到这台主机上了,由这台主机作为家庭服务的总入口,也算是重新定义All in One了吧。

写在最后

当然其实这套环境的重点还是在于有了Rancher + 容器化,你就拥有了无限自定义的可能,搭建一套这样的家庭容器化环境其实并不是折腾的结束,相反,真正的折腾才刚刚开始,敬请期待我之后一些天马行空的想法吧。

2
1