跳转至

5. Tailscale 集成部署

这是本教程的亮点章节。通过 Tailscale(基于 WireGuard 的 Mesh VPN),我们可以轻松地将位于不同物理位置的服务器(如:家中树莓派 + 阿里云 ECS + 公司内网机器)组成一个逻辑上的局域网 K3s 集群。

5.1 为什么要用 Tailscale?

  • 跨地域组网:节点无需公网 IP,只要能上网即可加入集群。
  • 安全性:所有流量点对点加密(WireGuard 协议)。
  • 零配置:无需复杂的防火墙打洞和端口映射。

5.2 前置准备

  1. 注册 Tailscale 账号
  2. 在 Tailscale 控制台启用 MagicDNS(方便通过主机名访问)。
  3. 关键步骤:在控制台禁用 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 连通性测试

kubectl get nodes -o wide
# 此时节点的 INTERNAL-IP 应该都是 100.x.x.x 开头的地址

创建一个 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 内容:

{
  "Network": "10.42.0.0/16",
  "Backend": {
    "Type": "vxlan",
    "MTU": 1200
  }
}
注:MTU 建议设置为 Tailscale MTU (1280) - VXLAN Overhead (50) = 1230 左右,这里保守设为 1200。

5.6 安全策略 (ACL)

在 Tailscale 控制台配置 ACL,限制只有集群节点之间可以互访,防止通过 Tailscale 网络攻击集群。

{
  "acls": [
    // 允许集群节点互相访问
    { "action": "accept", "src": ["tag:k8s"], "dst": ["tag:k8s:*"] },
    // 允许管理员访问集群 API
    { "action": "accept", "src": ["group:admin"], "dst": ["tag:k8s:6443"] }
  ],
  "tagOwners": {
    "tag:k8s": ["group:admin"]
  }
}