跳至主要内容

分布式混合云或多云集群

K3s 集群仍然可以部署在没有共享公共私有网络且不直接连接的节点上(例如,不同公共云中的节点)。有两种方法可以实现这一点:嵌入式 K3s 多云解决方案和与 tailscale VPN 提供商的集成。

警告

节点之间的延迟会随着外部连接需要更多跳跃而增加。这将降低网络性能,如果延迟过高,还会影响集群的健康状况。

警告

此类部署不支持嵌入式 etcd。如果使用嵌入式 etcd,所有服务器节点必须通过其私有 IP 互相可达。代理可以分布在多个网络上,但所有服务器应位于同一位置。

嵌入式 K3s 多云解决方案

K3s 使用 wireguard 为集群流量建立 VPN 网格。每个节点都必须有一个唯一的 IP,可以通过它访问(通常是公共 IP)。K3s 管理程序流量将使用 websocket 隧道,集群(CNI)流量将使用 wireguard 隧道。

要启用此类部署,您必须在服务器上添加以下参数

--node-external-ip=<SERVER_EXTERNAL_IP> --flannel-backend=wireguard-native --flannel-external-ip

以及在代理上

--node-external-ip=<AGENT_EXTERNAL_IP>

其中 SERVER_EXTERNAL_IP 是我们可以访问服务器节点的 IP,AGENT_EXTERNAL_IP 是我们可以访问代理节点的 IP。请注意,代理中的 K3S_URL 配置参数应使用 SERVER_EXTERNAL_IP 以便能够连接到它。请记住检查 网络要求 并允许在内部和外部地址上访问列出的端口。

SERVER_EXTERNAL_IPAGENT_EXTERNAL_IP 必须相互之间具有连接性,通常是公共 IP。

动态 IP

如果节点被分配了动态 IP 并且 IP 发生了更改(例如在 AWS 中),您必须修改 --node-external-ip 参数以反映新的 IP。如果以服务方式运行 K3s,您必须修改 /etc/systemd/system/k3s.service,然后运行

systemctl daemon-reload
systemctl restart k3s

与 Tailscale VPN 提供商的集成(实验性)

在 v1.27.3、v1.26.6、v1.25.11 及更高版本中可用。

K3s 可以与 Tailscale 集成,以便节点使用 Tailscale VPN 服务在节点之间构建网格。

在部署 K3s 之前,您需要使用 Tailscale 完成四个步骤

  1. 登录到您的 Tailscale 帐户

  2. 设置 > 密钥 中,生成一个身份验证密钥($AUTH-KEY),它可以重复用于集群中的所有节点

  3. 确定集群将使用的 podCIDR(默认情况下为 10.42.0.0/16)。在访问控制中使用节区追加 CIDR(或双栈的 CIDR)

"autoApprovers": {
"routes": {
"10.42.0.0/16": ["[email protected]"],
"2001:cafe:42::/56": ["[email protected]"],
},
},
  1. 在您的节点中安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh

要部署启用 Tailscale 集成的 K3s,您必须在每个节点上添加以下参数

--vpn-auth="name=tailscale,joinKey=$AUTH-KEY

或者在文件中提供这些信息并使用参数

--vpn-auth-file=$PATH_TO_FILE

可选地,如果您有自己的 Tailscale 服务器(例如 headscale),您可以通过将 ,controlServerURL=$URL 附加到 vpn-auth 参数来连接到它。

接下来,您可以使用以下命令创建服务器

k3s server --token <token> --vpn-auth="name=tailscale,joinKey=<joinKey>" --node-external-ip=<TailscaleIPOfServerNode>

执行此命令后,访问 Tailscale 管理控制台以批准 Tailscale 节点和子网(如果尚未通过 autoApprovers 批准)。

服务器设置完成后,使用以下命令连接代理

k3s agent --token <token> --vpn-auth="name=tailscale,joinKey=<joinKey>" --server https://<TailscaleIPOfServerNode>:6443 --node-external-ip=<TailscaleIPOfAgentNode>

再次批准 Tailscale 节点和子网,就像您为服务器所做的那样。

如果您在 Tailscale 中启用了 ACL,您需要添加一个“接受”规则以允许 pod 相互通信。假设您创建的身份验证密钥自动将 Tailscale 节点标记为 testing-k3s 标签,则规则应如下所示

"acls": [
{
"action": "accept",
"src": ["tag:testing-k3s", "10.42.0.0/16"],
"dst": ["tag:testing-k3s:*", "10.42.0.0/16:*"],
},
],
警告

如果您打算使用同一个 tailscale 网络运行多个 K3s 集群,请创建适当的 ACL 以避免 IP 冲突或为每个集群使用不同的 podCIDR 子网。