k3s混合云组网
k3s混合云组网
K3s 有两种主要方案来满足混合云和多云环境的需求:
- 嵌入式 k3s 多云解决方案
- 与 Tailscale VPN 集成
多云场景下, 节点之间的延迟会变高; 延迟太高会降低网络性能, 还可能影响集群的运行; 此类部署不支持嵌入式 etcd; 如果使用嵌入式 etcd, 所有 Server 节点必须通过其私有 IP 相互访问; Agent 可能分布在多个网络上, 但所有 server 都应该位于同一位置;
k3s_WireGuard
-
部署 WireGuard, wg 网段设置为 192.168.1.x
-
基于 vpn 通道部署 k3s
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相关参数
为节点设置外部公网 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 wg0Agent 安装
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-agentK3S_Token 去 cat /var/lib/rancher/k3s/server/node-token 获取即可 K3S_URL 需要设置 master 的通信地址端口, 端口默认是 6443, IP 地址就是虚拟网域的 IP node-external-ip 为节点公网地址 node-ip 节点虚拟 IP 地址
kubectl get nodes -o wide
k3s kubectl get nodeTailscale网络
Tailscale 作为 saas 服务商, 各节点通过它组成了一个 vpn 网络; 并通过 vpn 网络进行通信; 于是 k3s 集群并没有在公网暴露任何端口
本地局域网的一个虚拟机作为 K3s server 节点(K3s1), 阿里云(izwz9eox9l8h9wh9bazd2hz)和 AWS(ip-172-31-7-7) 的两台实例分别作为 agent 节点
安装并配置 Tailscale
- 登录到你的 Tailscale 帐户
- 在 Settings > Keys 中, 生成一个授权密钥($AUTH-KEY), 它可以被集群中的所有节点重复使用:
本例获取的 AUTH-KEY 为: tskey-auth-kfZp9F4CNTRL-Kj3sqcKW4i7zY3cCq2q7h7uhXitJutpY
- 定义 K3s 集群使用的 pod CIDR(默认 10.42.0.0/16)网络策略; 在 Access Controls 中附加 CIDR(或双栈的 CIDR)
"autoApprovers": {
"routes": {
"10.42.0.0/16": ["kingsd041@xxx.com"],
// "2001:cafe:42:0::/56": ["your_account@xyz.com"],
},
},- 在每个节点中安装 Tailscale curl -fsSL https://tailscale.com/install.sh | sh
部署 K3s 集群
要部署启用了 Tailscale 集成的 K3s, 必须在每个节点上添加以下参数 --vpn-auth="name=tailscale,joinKey=$AUTH-KEY
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 去注册
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 集群