Metallb with RouterOS
之前主路由是OpenWRT, 安装了支持BGP的组建后配置和Metallb的BGP模式工作起来,现在主路由换成了RouterOS,一直没动这块,当然blog就下线了几个月。
在RouterOS(7.x)中配置BGP很容易,本身得益于RouterOS完善的功能,出厂就具备完善的路由功能,在【Routing】-【BGP】中添加几个BGP connection即可,最简配置只需要写Local Address(我的是192.168.1.1),Local AS(我的是65000),Remote Address(我的有4个节点,创建4个BGP connection,每个节点一个),Remote AS(我的是65009),其他都用了默认配置,可以根据实际情况再选择,比如local port和remote port也许需要根据实际情况填写。
如果一切正常,建立完4个bgp connection后,可以看到有4个bgp sessions出现
如果已经使用metallb分配了loadbalancer ip给k8s service,你应该可以在RouterOS的路由表中看到通过BGP通知过来的IPs,在【IP】- 【Routes】中这几个192.168.2.x的就是metallb分配出去的,可以看到Gateway分别是k8s的几个nodes,比如192.168.2.5有3个gateway可选,但目前只有1个是active的,可以通过看第一列的tags分辨出,其中D-dynamic, b-BGP, a-Active
这里的192.168.2.1是ingress-nginx的service,目前我部署的其他服务都通过ingress暴露出去,从公网访问过来的话会进入到ingress,于是我创建了一个dst nat把WAN上特定端口转发到ingress的特定端口上,但实际情况是从外进入的流量无法得到response,最终超时。
在日志中可以看到dst nat工作正常,只看到进入,看不到有流量出去,而如果只在内网访问(改hosts指向ingree)也正常。最终通过测试暴露一个192.168.1.x上的服务出去,能得到response,只是192.168.2.x不行,于是怀疑复杂的防火墙拦截了,还好在防火墙最前面有个bypass规则,打开后直接短路了后续所有规则,访问就正常了。。。最终看到有一条 prerouting规则,拦截了所有不是来自 local_subnet的流量,而local_subnet当时只有 192.168.1.x,于是添加了192.168.2.x后正常。