Como configuro o Wireguard para um multi-site K8s?

Como configuro o Wireguard para um multi-site K8s?

Tentei configurar o Wireguard para um cluster multisite K3s, meu problema é com roteamento. Existem pelo menos 4 nós, 2 em um local + 1 em outro local e + 1 em outro local.

Premissas:

  • A rede 10.50.0.0/16 é para nós físicos
  • A rede 10.42.0.0/16 é para pods
  • A rede 10.43.0.0/16 é para serviços
  • Cada nó físico pode criar um pod, ao qual foi atribuído um endereço IP exclusivo no intervalo 10.42.0.0/16
  • Cada pod em cada nó físico deve ser capaz de executar ping entre si

A configuração implantada funcionou apenas entre os dois últimos nós, os demais nós não conseguem nem executar ping entre si. Acho que pode ser algo com o roteamento, mas não tenho conhecimento suficiente para verificar isso.

Exemplos de configurações de dois nós:

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

Faz alguma ideia? Como isso deve ser projetado com o Wireguard? Por que esta configuração não funciona?

Obrigado!

Responder1

(Desculpas, provavelmente deveria ser um comentário, pois não tenho 100% de certeza se está correto, mas ainda não tenho representantes suficientes neste site para usar comentários.)

Acredito que AllowedIPsfor each [Peer]precisa ser único (ou seja, intervalos não sobrepostos) porque é assim que o WireGuard sabe para qual peer rotear um determinado pacote de saída. Nesse caso, você precisaria configurar intervalos de IP separados (para pods e serviços - os nós não deveriam importar) para cada site.

Na verdade, nunca tentei com intervalos sobrepostos para ver o que faria, e a documentação não é exatamente clara sobre isso, mas parece implicar que isso não é suportado. (Se fosse suportado, teria que transmitir cada pacote para todos os pares que AllowedIPsincluíssem o endereço de destino do pacote ou usar algo como ARP para descobrir o roteamento dinamicamente.)

Não estou muito familiarizado com o k3s, então não tenho certeza de como funciona o cluster de vários sites - isso é basicamente apenas vários clusters Kubernetes separados que são gerenciados centralmente?

informação relacionada