
Intenté configurar Wireguard para un clúster multisitio K3s, mi problema es con el enrutamiento. Hay al menos 4 nodos, 2 en una ubicación + 1 en otra ubicación y + 1 en otra ubicación.
Supuestos:
- La red 10.50.0.0/16 es para nodos físicos
- La red 10.42.0.0/16 es para pods
- La red 10.43.0.0/16 es para servicios.
- Cada nodo físico puede crear un Pod, al que se le ha asignado una dirección IP única en el rango 10.42.0.0/16.
- Cada Pod en cada nodo físico debería poder hacer ping entre sí.
La configuración implementada funcionó solo entre los dos últimos nodos, los nodos restantes ni siquiera pueden hacer ping entre sí. Supongo que puede ser algo relacionado con el enrutamiento, pero no tengo el conocimiento suficiente para comprobarlo.
Configuraciones de ejemplo de dos de nodos:
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
¿Tienes alguna pista? ¿Cómo debería diseñarse esto con Wireguard? ¿Por qué esta configuración no funciona?
¡Gracias!
Respuesta1
(Disculpas, esto probablemente debería ser un comentario, ya que no estoy 100% seguro de que sea correcto, pero todavía no tengo suficiente representante en este sitio para usar comentarios).
Creo que AllowedIPs
for each [Peer]
debe ser único (es decir, rangos que no se superpongan) porque así es como WireGuard sabe a qué par enrutar un paquete saliente determinado. Si es así, deberá configurar rangos de IP separados (para pods y servicios; los nodos no deberían importar) para cada sitio.
En realidad, nunca lo probé con rangos superpuestos para ver qué haría, y la documentación no es exactamente clara al respecto, pero parece implicar que esto no es compatible. (Si fuera compatible, tendría que transmitir cada paquete a todos los pares que AllowedIPs
incluyeran la dirección de destino del paquete, o usar algo como ARP para determinar el enrutamiento dinámicamente).
No estoy muy familiarizado con k3s
, así que no estoy seguro de cómo funciona su clúster de sitios múltiples. ¿Se trata básicamente de múltiples clústeres de Kubernetes separados que se administran de forma centralizada?