5. Tailscale 集成部署
这是本教程的亮点章节。通过 Tailscale(基于 WireGuard 的 Mesh VPN),我们可以轻松地将位于不同物理位置的服务器(如:家中树莓派 + 阿里云 ECS + 公司内网机器)组成一个逻辑上的局域网 K3s 集群。
5.1 为什么要用 Tailscale?
- 跨地域组网:节点无需公网 IP,只要能上网即可加入集群。
- 安全性:所有流量点对点加密(WireGuard 协议)。
- 零配置:无需复杂的防火墙打洞和端口映射。
5.2 前置准备
- 注册 Tailscale 账号。
- 在 Tailscale 控制台启用 MagicDNS(方便通过主机名访问)。
- 关键步骤:在控制台禁用 Key Expiry(密钥过期),防止节点因密钥过期掉线。
5.3 在节点上安装 Tailscale
在所有准备加入集群的机器上执行:
# 1. 安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# 2. 启动并加入网络
# 建议开启 IP 转发,这对于 K3s 流量转发是必须的
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
# 3. 登录
sudo tailscale up
# 根据提示复制 URL 到浏览器授权
参数详解:
* net.ipv4.ip_forward = 1: 允许 Linux 内核转发数据包。K3s 的 CNI 插件和 Service 代理都需要此功能。
5.4 基于 Tailscale 部署 K3s
重点在于让 K3s 使用 Tailscale 的虚拟网卡(通常是 tailscale0)作为节点通信接口。
5.4.1 初始化 Master 节点
获取 Master 的 Tailscale IP(假设为 100.x.y.z):
ts_ip=$(tailscale ip -4)
curl -sfL https://get.k3s.io | sh -s - server \
--flannel-iface=tailscale0 \
--advertise-address=$ts_ip \
--node-ip=$ts_ip \
--tls-san=$ts_ip
参数详解:
* --flannel-iface=tailscale0: 强制 Flannel 使用 Tailscale 的虚拟网卡进行 Pod 间通信。这是跨地域组网的核心。
* --advertise-address=$ts_ip: 告诉 K3s API Server 广播这个 IP,让其他节点通过这个 IP 联系它。
* --node-ip=$ts_ip: 将节点的 Kubernetes Internal-IP 设置为 Tailscale IP。
* --tls-san=$ts_ip: 将 Tailscale IP 添加到 SSL 证书的 SAN 列表中,防止 kubectl 连接报错。
5.4.2 加入 Worker 节点
在 Worker 机器上执行:
# 1. 获取 Master 的 IP 和 Token (在 Master 上执行 cat /var/lib/rancher/k3s/server/node-token)
export MASTER_IP=100.x.y.z
export K3S_TOKEN=K10abc...
# 2. 获取本机 Tailscale IP
ts_ip=$(tailscale ip -4)
# 3. 加入集群
curl -sfL https://get.k3s.io | K3S_URL=https://$MASTER_IP:6443 K3S_TOKEN=$K3S_TOKEN sh -s - agent \
--flannel-iface=tailscale0 \
--node-ip=$ts_ip
5.5 验证与优化
5.5.1 连通性测试
创建一个 Pod 并 ping 另一个节点上的 Pod,验证跨地域网络是否打通。
5.5.2 性能优化 (MTU 设置)
Tailscale 网络的 MTU(最大传输单元)通常为 1280,而 Flannel 默认 VXLAN MTU 较大。为了避免分片导致的性能下降,建议调整 Flannel MTU。
在安装时添加参数:--flannel-conf=/etc/rancher/k3s/flannel-conf.json
flannel-conf.json 内容:
5.6 安全策略 (ACL)
在 Tailscale 控制台配置 ACL,限制只有集群节点之间可以互访,防止通过 Tailscale 网络攻击集群。