内容提要
本文介绍了使用K3s和Tailscale搭建多云集群的方法,详细介绍了Tailscale的使用和K3s集成配置。
延伸解读
为何选择 Tailscale 而非内置方案
K3s 内置的 WireGuard Mesh 方案要求每个节点拥有可直接访问的唯一 IP(通常是公网 IP),而 Tailscale 方案则允许节点位于防火墙后,无需公网 IP。对于需要接入家庭服务器的场景,Tailscale 的内网穿透能力更合适,且配置简单,因此作者选择了 Tailscale。
K3s 集成 Tailscale 的实现机制
K3s 并未重新实现网络功能,而是通过调用 tailscale up 命令建立 Tailscale 网络,并使用 tailscale0 网卡初始化集群。此外,--vpn-auth 参数支持 extraArgs,可透传额外的 Tailscale 参数,这为后续利用 Subnet Route 和 Exit Node 等特性提供了灵活性。
Subnet Route 与 Exit Node 的实用价值
Subnet Route 是 K3s 依赖的特性,用于确保 Pod 间网络可达,部署后还可通过 tailscale set 添加新路由,使节点访问其他网段(如家庭局域网)。Exit Node 则允许指定节点作为流量出口,若该节点所在网络有透明代理,可方便地让云服务器等设备利用该出口访问外部网络。
部署前的关键配置与注意事项
所有节点需安装 Linux 系统,建议内核版本大于 5.6,无需单独安装 WireGuard。在 Tailscale 中需生成可复用的 Auth Key,并配置 autoApprovers 将 Pod 子网(如 10.42.0.0/16)加入自动通过,以确保 Pod 网络互通。国内服务器安装 K3s 时可使用镜像源加速。
Q&A
K3s 支持哪些多云集群方案?为什么选择 Tailscale 方案?
K3s 集成了两种多云集群方案:内置的 VPN Mesh 方案(使用 WireGuard)和 Tailscale 方案。选择 Tailscale 方案是因为其简单性,并且能满足接入家庭服务器的需求。
K3s 是如何集成 Tailscale 的?
K3s 在启动前根据传入参数构建 Tailscale 参数,调用 tailscale up 建立 Tailscale 网络,然后使用 tailscale0 网卡初始化集群。核心代码是执行 tailscale 命令。
Tailscale 的 Subnet Route 和 Exit Node 在 K3s 集群中有什么作用?
Subnet Route 是 K3s 所依赖的,用于使 Pod 间网络可达,部署后还可通过 tailscale set 设置新的 Subnet Route 以访问其他网段。Exit Node 可指定节点作为出口,所有公共流量从此节点进出,便于为云服务器配置科学上网。
搭建 K3s + Tailscale 集群前需要做哪些准备工作?
需要至少一台计算设备(云服务器、物理主机等),安装 Linux 系统(建议内核 >5.6,无需 WireGuard),并配置 Tailscale:登录生成可复用的 Auth Key,配置 autoApprovers 将 Pod 子网(如 10.42.0.0/16)添加到自动通过。
如何初始化 K3s Server 节点并加入 Tailscale 网络?
在所有节点安装 Tailscale 后,执行 K3s 安装脚本并添加 --vpn-auth="name=tailscale,joinKey=$AUTH_KEY" 参数。例如:curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server" sh -s - --disable=servicelb --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666 --vpn-auth="name=tailscale,joinKey=$AUTH_KEY"。国内服务器可换用镜像源。
如何创建 K3s Agent 节点并加入集群?
首先在 Server 节点查看 token(sudo cat /var/lib/rancher/k3s/server/token)和 tailscale0 网卡 IP。然后在 Agent 节点执行:curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="agent" sh -s - --server https://<tailscale0 IP>:6443 --token <token> --vpn-auth "name=tailscale,joinKey=$AUTH_KEY"。