k3s混合云组网

k3s混合云组网

k3s混合云组网

K3s 有两种主要方案来满足混合云和多云环境的需求:

  1. 嵌入式 k3s 多云解决方案
  2. 与 Tailscale VPN 集成

多云场景下, 节点之间的延迟会变高; 延迟太高会降低网络性能, 还可能影响集群的运行;
此类部署不支持嵌入式 etcd; 如果使用嵌入式 etcd, 所有 Server 节点必须通过其私有 IP 相互访问;
Agent 可能分布在多个网络上, 但所有 server 都应该位于同一位置;

k3s_WireGuard

  1. 部署 WireGuard, wg 网段设置为 192.168.1.x

  2. 基于 vpn 通道部署 k3s

1
2
3
4
5
6
7
8
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
  sh -s -  --node-external-ip 42.xx.xx.12 \
  --advertise-address 42.xx.xx.12 \
  --node-ip 192.168.1.1 \
  --flannel-iface wg0

systemctl status k3s
kubectl get pods -A

相关参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
为节点设置外部公网 IP, 避免 k3s 组件在设置 loadbalance , 将内网 IP 当作公网 IP 使用
 K3s , 如果配置参数指定了 node-external-ip,
K3s 会为节点自动添加 flannel.alpha.coreos.com/public-ip-overwrite,
以便 flannel 可以自动配置正确的对外 IP
--node-external-ip=

用于设置 kubectl 工具以及子节点进行通讯使用的地址, 可以是 IP, 也可以是域名,
在创建 apiserver 证书时会将此设置到有效域中
--advertise-address=

如果不设置这个参数, 那么第一张网卡设备上的 IP 就会被选中, 所以这个 IP 应该是内网 IP
因为自行组建了虚拟局域网, 所以需要指定虚拟局域网的 IP
--node-ip=

wg0  WireGuard 创建的网卡设备, 我需要使用虚拟局域网来进行节点间的通信, 所以这里需要指定为 wg0
--flannel-iface wg0

Agent 安装

1
2
3
4
5
6
7
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn \
  K3S_URL=https://192.168.1.1:6443 \
  K3S_TOKEN=K107xxxxxxxxxxxxxxxx2cf95048d6a3cd85f15717edfbe5::server:xxxxxxxxxxxxxxxxxxxx4da1b7e701f67e sh -s - \
  --node-external-ip 122.xx.xxx.111 \
  --node-ip 192.168.1.2 --flannel-iface wg0

systemctl status k3s-agent

K3S_Token 去 cat /var/lib/rancher/k3s/server/node-token 获取即可
K3S_URL 需要设置 master 的通信地址端口, 端口默认是 6443, IP 地址就是虚拟网域的 IP
node-external-ip 为节点公网地址
node-ip 节点虚拟 IP 地址

1
2
3
kubectl get nodes -o wide

k3s kubectl get node

Tailscale网络

Tailscale 作为 saas 服务商, 各节点通过它组成了一个 vpn 网络;
并通过 vpn 网络进行通信; 于是 k3s 集群并没有在公网暴露任何端口

本地局域网的一个虚拟机作为 K3s server 节点(K3s1),
阿里云(izwz9eox9l8h9wh9bazd2hz)和 AWS(ip-172-31-7-7) 的两台实例分别作为 agent 节点

安装并配置 Tailscale

  1. 登录到你的 Tailscale 帐户
  2. 在 Settings > Keys 中, 生成一个授权密钥($AUTH-KEY), 它可以被集群中的所有节点重复使用:

本例获取的 AUTH-KEY 为: tskey-auth-kfZp9F4CNTRL-Kj3sqcKW4i7zY3cCq2q7h7uhXitJutpY

  1. 定义 K3s 集群使用的 pod CIDR(默认 10.42.0.0/16)网络策略;
    在 Access Controls 中附加 CIDR(或双栈的 CIDR)
1
2
3
4
5
6
"autoApprovers": {
        "routes": {
            "10.42.0.0/16":        ["kingsd041@xxx.com"],
            // "2001:cafe:42:0::/56": ["your_account@xyz.com"],
        },
    },
  1. 在每个节点中安装 Tailscale
    curl -fsSL https://tailscale.com/install.sh | sh

部署 K3s 集群

要部署启用了 Tailscale 集成的 K3s, 必须在每个节点上添加以下参数
–vpn-auth=“name=tailscale,joinKey=$AUTH-KEY

1
2
3

curl -sfL https://get.k3s.io | sh -s - \
    --vpn-auth="name=tailscale,joinKey=tskey-auth-kfZp9F4CNTRL-Kj3sqcKW4i7zY3cCq2q7h7uhXitJutpY"

安装成功后, 会自动将该节点注册到 Tailscale 中
并在 Tailscale 中生成一个可用于 VPN 网络内访问的 IP 地址: 例如 100.105.190.87
在注册 agent 节点时, 就可以通过 Tailscale 提供的 100.105.190.87 作为 K3s server 节点 IP 去注册

1
2
3
4
curl -sfL https://get.k3s.io | \
    K3S_URL=https://100.105.190.87:6443 \
    K3S_TOKEN=mynodetoken sh -s - \
    --vpn-auth="name=tailscale,joinKey=tskey-auth-kfZp9F4CNTRL-Kj3sqcKW4i7zY3cCq2q7h7uhXitJutpY"

三个节点之间可以通过 Tailscale 提供的 100. 开头的 IP 地址进行相互通信

也可以通过 Tailscale 提供的私有网络来访问 K3s 集群

Licensed under CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议,知会作者并注明出处
不得用于商业用途!
最后更新于 2026-03-12 00:00 UTC