背景
随着分布式云的发展,多集群的场景越来越普遍,当各个集群部署完毕后,集群间pod cidr是不通的,那么为了是东西向访问更加mesh 更加扁平,我们希望用VPN的方式将集群间的POD 网段拉通。
由于集群中的节点众多,我们本篇先入门,首先解决两个集群中的Gateway Node 间的互通。至于集群间的非Gateway Node 我们放在下一篇文章去解决。
VPN方式
- IPsec
IPsec 有很多实现,这个协议非常灵活,终端配置也不算复杂,本文暂且不写这种方式。 - Wireguard
wireguad 是本文的写作目的,它的配置相对来说比较简单。
环境描述
Cluster1:
Gateway Node: 192.169.33.17
Pod Cidr: 172.19.0.0/16
Cluster2:
Gateway Node: 192.169.33.18
Pod Cidr: 172.22.0.0/16
操作步骤
-
安装wireguard
这里安装很容易,安装官网的方式,一行命令即可。我是Ubuntu,所以直接在两个集群的Gateway Node 上分别部署:root@edge1-1:~# apt install wireguard root@edge1-1:~# modprobe wireguard && lsmod | grep -i wireguard wireguard 221184 0 ip6_udp_tunnel 16384 2 wireguard,vxlan udp_tunnel 16384 2 wireguard,vxlan
-
集群1 创建并配置wireguard 设备
root@edge1-1:~# wg genkey > private // 保存私钥 root@edge1-1:~# wg pubkey < private // 得到公钥 root@edge1-1:~# ip link add wg0 type wireguard // 创建netlink root@edge1-1:~# wg set wg0 private-key ./private // 给该wg 类型的netlink 设置私钥 root@edge1-1:~# ip link set wg0 up root@edge1-1:~# wg interface: wg0 public key: uFEdhmV52i59r/RSjp9x77hRBs+k0f/2er3IFBCvSiM= private key: (hidden) listening port: 43691
-
集群2 创建并配置wireguard 设备
root@edge2-1:~# wg genkey > private // 保存私钥 root@edge2-1:~# wg pubkey < private // 得到公钥 root@edge2-1:~# ip link add wg0 type wireguard // 创建netlink root@edge2-1:~# wg set wg0 private-key ./private // 给该wg 类型的netlink 设置私钥 root@edge2-1:~# ip link set wg0 up root@edge2-1:~# wg interface: wg0 public key: hwc/LdW2oWUm3Z4uXPObQN6llXNpQOevhn9j3VhBMEg= private key: (hidden) listening port: 60242
-
集群1 配置wireguard 的peer
root@edge1-1:~# wg set wg0 peer hwc/LdW2oWUm3Z4uXPObQN6llXNpQOevhn9j3VhBMEg= allowed-ips 172.22.0.0/16 endpoint 192.169.33.18:60242 persistent-keepalive 25
-
集群2 配置wireguard 的peer
root@edge2-1:~# wg set wg0 peer uFEdhmV52i59r/RSjp9x77hRBs+k0f/2er3IFBCvSiM= allowed-ips 172.19.0.0/16 endpoint 192.169.33.17:43691 persistent-keepalive 25
-
效果
cluster1root@edge1-1:~# wg interface: wg0 public key: uFEdhmV52i59r/RSjp9x77hRBs+k0f/2er3IFBCvSiM= private key: (hidden) listening port: 43691 peer: hwc/LdW2oWUm3Z4uXPObQN6llXNpQOevhn9j3VhBMEg= endpoint: 192.169.33.18:60242 allowed ips: 172.22.0.0/16 latest handshake: 9 seconds ago transfer: 128.96 KiB received, 570.25 KiB sent persistent keepalive: every 25 seconds
cluster2
root@edge2-1:~# wg interface: wg0 public key: hwc/LdW2oWUm3Z4uXPObQN6llXNpQOevhn9j3VhBMEg= private key: (hidden) listening port: 60242 peer: uFEdhmV52i59r/RSjp9x77hRBs+k0f/2er3IFBCvSiM= endpoint: 192.169.33.17:43691 allowed ips: 172.19.0.0/16, 10.128.0.0/12 latest handshake: 1 minute, 34 seconds ago transfer: 464.51 KiB received, 128.99 KiB sent persistent keepalive: every 25 seconds
-
手工设置路由:
目前仅仅是隧道打通,但是从Pod发出的流量,尚不能route 到 wg0 设备。因此我们配置一个策略路由:root@edge1-1:~# ip rule add from all table 100 root@edge1-1:~# ip route add 172.22.0.0/16 dev wg0 table 100
另一个集群cluster2:
root@edge2-1:~# ip rule add from all table 100 root@edge2-1:~# ip route add 172.19.0.0/16 dev wg0 table 100
-
进入容器里,去ping 下试试
很遗憾不行,原因是,容器网络的一条iptables 规则:
-A POSTROUTING ! -s 172.22.0.0/16 -d 172.22.0.0/24 -m comment --comment "flanneld masq" -j RETURN
因此,我们还需要在这条规则前,新增Accept。root@edge1-1:~# iptables -t nat -I POSTROUTING -s 172.19.0.0/16 -d 172.22.0.0/16 -j ACCEPT root@edge1-1:~# iptables -t nat -I POSTROUTING -s 172.22.0.0/16 -d 172.19.0.0/16 -j ACCEPT
root@edge2-1:~# iptables -t nat -I POSTROUTING -s 172.22.0.0/16 -d 172.19.0.0/16 -j ACCEPT root@edge1-1:~# iptables -t nat -I POSTROUTING -s 172.19.0.0/16 -d 172.22.0.0/16 -j ACCEPT
然后就可以去容器里,ping通了。