起因

现在有很多厂商推出自己的云服务器,我也用过不少,其中以阿里云、腾讯云、华为云的服务器较为好用,但是也非常贵。

我主要在云服务器上部署一些k8s集群,学习云原生用。但是我又不是时时刻刻在用,虽然可以按时付费,但总归是不方便的,所以我萌生了自己组装家用服务器的想法。

首先既然是家用服务器,那就要考虑经济性和噪音等方面的因素,所以我在网上找了一些资料,逛了一下图吧,综合一下,搞出如下配置:

总共不到两千。

安装PVE

考虑使用虚拟化技术,分出多个节点来使用。主要两种选择:

综合下来选择了 PVE(Proxmox VE)。 网上有很多它们之间的比较区别的文章

接下来我就要开始安装PVE了,其实也很简单,PVE就是基于debian之上使用KVM等虚拟化技术构建的系统,所以就和安装普通的linux系统一样。

首先下载镜像:https://www.proxmox.com/en/downloads 下载最新的镜像就好了。

这里推荐使用Ventoy制作U盘启动盘 https://www.ventoy.net/cn/

安装过程就很稀松平常了。

注意点

  • 安装PVE需要主板BIOS开启虚拟化支持,网上搜一下就知道了

  • 安装过程中可能会出现卡住的现象,如果卡住的时间很长,直接强制重启。在启动的时候按e进入grub引导,在 linux /boot/vmxxxxx ro 后面加入 quiet splash nomodeset ,然后F10启动,应该就会进入安装界面

    • 这是因为 显卡驱动问题导致的,很多独立显卡驱动linux是有问题的,所以我们干脆禁用
    • nomodeset 就表示 系统启动过程中,暂时不运行图像驱动程序
  • 安装完成之后,如果独立显卡有问题 就需要修改下面参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /etc/default/grub

GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodest" # splash后加上nomodeset
GRUB_CMDLINE_LINUX=""

# 保存
update-grub # 更新引导

# 这样重启就好了

使用PVE

pve的web页面

安装pve-tools

为了更好的使用pve,我们可以使用pve-tools工具对pve做一些个性化修改。

https://github.com/ivanhao/pvetools 根据文档操作即可。

删除pve的local-lvm

参考文章:https://foxi.buduanwang.vip/virtualization/1434.html/

这里就不详细叙说了

制作ubuntu模版

这里使用cloud-images来安装ubuntu,可以使用到cloud-init,能非常方便的修改网络ip等。

下载好 ubuntu的镜像

然后创建虚拟机

创建好虚拟机,回到pve终端

1
2
3
4
qm disk import 999 ubuntu-22.04-server-cloudimg-amd64.img local --format qcow2
# 将镜像转为 qcow2格式的
# 999 是虚拟机的id
# local 是存储的名称

使用磁盘:

添加串口、cloud-init设备

在cloud-init中,修改相应的信息,修改完 一定要点重生成映像

在选项中 把引导顺序改一下,磁盘放在第一位:

然后直接启动,安装你想要安装的软件,做成模版

我的初始化安装如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置时区
timedatectl set-timezone Asia/Shanghai

# 设置仓库源
sed -i 's/http:\/\/security.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list
sed -i 's/http:\/\/archive.ubuntu.com/http:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list

# 安装常用软件
apt update && apt upgrade -y

apt install vim neofetch curl wget htop qemu-guest-agent dnsutils net-tools bash-completion -y

# 修改SSH配置
PermitRootLogin yes
PasswordAuthentication yes

之后关机,转化成模版:

后续就可以基于模版快速创建虚拟机节点了

网络方案

方案简图:

  • 使用openwrt作为pve旁路由,pve上所有节点虚拟机的网关都指向openwrt的地址
  • 使用tailscale 做 full mesh VPN,效果就是 只要在我的电脑上安装了tailscale,就能和pve上的虚拟机通信,原理就是所有安装了tailscale的电脑都被打通了(相当于一个隧道,是一个wireguard)

安装openwrt

推荐使用别人封装好的镜像,这样就不需要自己手动加各种插件了

https://lidrive.vip/OpenWrt

下载链接:https://lidrive.vip/d/OpenWrt/OpenWrt%20X86/6.1%E5%86%85%E6%A0%B8/%E7%B2%BE%E5%93%81%E5%B0%8F%E5%8C%85/openwrt6.1-jpxb-20231014-x86-64-generic-squashfs-combined-efi.img.gz?sign=A8AAu7OttEc0K2biRZTzhnBxfTBvwUCVZulCK_Ct4jk=:0

安装openwrt就和上面安装ubuntu步骤类似

附上我安装的openwrt的信息:

安装好之后 按照提示修改你的ip地址,然后进入web页面:

然后:

设置完,网络应该就通了

openwrt安装了一些可以插件,可以支持科学上网,这样openwrt作为pve其他节点的网关,可以使得网络会更加通畅

安装tailscale

在openwrt上安装tailscale

打开终端:

1
2
3
4
5
6
7
8
9
10
opkg update
opkg install tailscale iptables-nft
service tailscale restart

tailscale up --accept-routes=true --accept-dns=false --advertise-routes=192.168.12.0/24
# 此时会跳出一个url,去浏览器登录就行了

# 开启路由--accept-routes=true
# 关闭下发dns--accept-dns=false
# 指定本地局域网段路由转发--advertise-routes=192.168.12.0/24

然后在openwrt的web上修改

添加新接口,这里我已经添加好了一个接口 tailscale

接着修改tailscale接口,这里的ipv4地址填写tailscale上面给的地址

点击防火墙设置,这里防火墙自己新建一个

到此就基本完成了

在其他设备上安装tailscale

tailscale官方文档:https://tailscale.com/kb/

在一台windows上安装tailscale,wifi使用手机热点,模拟不在同一网段下

安装步骤很快就可以安装完成,然后在https://login.tailscale.com/admin/machines 这个页面上就可以看到你安装了taiscale的设备了

1
2
3
#常用的tailscale命令
tailscale status # 可以看到是否直连
tailscale ping 100.64.1.242 # 看一下延迟

简单使用一下,发现延迟比较高,这我不能忍啊,得想一个办法解决延迟问题。

tailscale的开源解决方案

tailscale的控制服务器是不开源的,免费用户限制100台节点,一般也就够了

目前有一款开源的实现叫 Headscale,这也是唯一的一款。

headscale的部署网上有很多方案了,这里就不多说了

部署私有DERP中继服务

Tailscale 官方内置了很多 DERP 服务器,分步在全球各地,惟独不包含中国大陆,原因你懂得。这就导致了一旦流量通过 DERP 服务器进行中继,延时就会非常高。而且官方提供的 DERP 服务器是万人骑,存在安全隐患。

为了实现低延迟、高安全性,我们可以参考 Tailscale 官方文档自建私有的 DERP 服务器。有两种部署模式,一种是基于域名,另外一种不需要域名,可以直接使用 IP,不过需要一点黑科技。我们先来看最简单的使用域名的方案。

参考文档:https://icloudnative.io/posts/custom-derp-servers/#derp

使用国内的一些方案

上面的一些方案都太折腾了,又没有一些比较好的方案呢。

我翻遍全网,还真找到了一个国内的方案:xEdge,这是一个国内大佬兼容tailscale的方案,中继节点是部署在国内的,所以延迟这一块完全不成问题。

文档:https://xedge.cc/doc/quickstart

使用相当简单,在之前我们安装的openwrt上执行如下命令:

1
tailscale up --accept-dns=false --advertise-routes=192.168.34.0/24 --login-server=https://login.xedge.cc

然后会有一个url地址,用浏览器打开,微信/GitHub注册登录即可

其他设备使用参考文档

以上就是我目前使用家用服务器的一些方案

附录