如何为 K8s 多站点配置 Wireguard?

如何为 K8s 多站点配置 Wireguard?

我尝试为 K3s 多站点集群配置 Wireguard,我的问题在于路由。至少有 4 个节点,一个位置有 2 个 + 另一个位置有 1 个,另一个位置有 1 个。

假设:

  • 10.50.0.0/16 网络用于物理节点
  • 10.42.0.0/16 网络用于 Pod
  • 10.43.0.0/16 网络用于服务
  • 每个物理节点都可以创建一个 Pod,该 Pod 在 10.42.0.0/16 范围内分配一个唯一的 IP 地址
  • 每个物理节点上的每个 Pod 都应该能够相互 ping 通

部署的配置仅在最后两个节点之间有效,其余节点甚至无法互相 ping 通。我猜可能是路由出了问题,但我没有足够的知识来检查这一点。

两个节点的示例配置:

10.50.54.100:

[Interface]
# primary-1
Address = 10.50.54.100/24
PrivateKey = pr111111111111111111111111111111111111111111
ListenPort = 443
MTU = 1500
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward
PostUp = ufw allow 443/udp || true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = sysctl -w -q net.ipv4.ip_forward=0
PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward

[Peer]
# infra-1
PublicKey = pub11111111111111111111111111111111111111111
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = xxxxxxxxxx:443

[Peer]
# compute-2
PublicKey = pub2222222222222222222222222222222222222222
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = yyyyyyyyyy:443

[Peer]
# storage-1
PublicKey = pub3333333333333333333333333333333333333333
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = zzzzzzzzzzz:443

10.50.54.2:

[Interface]
# infra-1
Address = 10.50.54.2/24
PrivateKey = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ListenPort = 443
MTU = 1500
PostUp = sysctl -w net.ipv4.ip_forward=1
PostUp = echo 1 > /proc/sys/net/ipv4/ip_forward
PostUp = ufw allow 51820/udp || true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = sysctl -w -q net.ipv4.ip_forward=0
PostDown = echo 0 > /proc/sys/net/ipv4/ip_forward

[Peer]
# primary-1
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = xxxxxxxxxxxx:443

[Peer]
# compute-2
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = yyyyyyyyyyy:443

[Peer]
# storage-1
PublicKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
AllowedIPs = 10.50.54.0/16, 10.42.0.0/16, 10.43.0.0/16
PersistentKeepalive = 15
Endpoint = zzzzzzzzzzzz:443

你有什么线索吗?Wireguard 应该如何设计?为什么这种配置不起作用?

谢谢!

答案1

(抱歉,这可能应该是一条评论,因为我不能 100% 确定它是否正确,但我在这个网站上的声誉还不足以使用评论。)

我认为AllowedIPs每个都[Peer]需要是唯一的(即不重叠的范围),因为这是 WireGuard 知道将给定的出站数据包路由到哪个对等点的方式。如果是这样,您需要为每个站点设置单独的 IP 范围(针对 pod 和服务 - 节点无关紧要)。

我从未真正尝试过使用重叠范围来查看它会做什么,文档也没有明确说明,但似乎暗示不支持此功能。(如果支持,则必须将每个数据包广播到AllowedIPs包含数据包目标地址的所有对等方,或者使用类似 ARP 的东西来动态确定路由。)

我不太熟悉k3s,所以不确定它的多站点集群是如何工作的——这基本上只是多个集中管理的独立 Kubernetes 集群吗?

相关内容