用wiregurad打通两个Kubernetes集群

背景

随着分布式云的发展,多集群的场景越来越普遍,当各个集群部署完毕后,集群间pod cidr是不通的,那么为了是东西向访问更加mesh 更加扁平,我们希望用VPN的方式将集群间的POD 网段拉通。

由于集群中的节点众多,我们本篇先入门,首先解决两个集群中的Gateway Node 间的互通。至于集群间的非Gateway Node 我们放在下一篇文章去解决。

VPN方式

  1. IPsec
    IPsec 有很多实现,这个协议非常灵活,终端配置也不算复杂,本文暂且不写这种方式。
  2. 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

操作步骤

  1. 安装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
    
  2. 集群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
    
  3. 集群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
    
  4. 集群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
    
  5. 集群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
    
  6. 效果
    cluster1

    root@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
    
  7. 手工设置路由:
    目前仅仅是隧道打通,但是从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
    
  8. 进入容器里,去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通了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值