Keepalived实现廉价HA

最近在dockerize各种home lab上的服务,其中遇到的一个问题就是如何实现HA。最方便的实现方式是打开eBay.com搜索F5 Big IP 购买硬件Load Balancer。最廉价的方式是多个设备间跑VRRP协议实现自动Fail over切换。Keepalived 就是一个精细生活VRRP的软件实现。

具体用例为两台Docker node上各跑了一个container运行unbound提供recursive DNS服务。任意一台机器下线(不管是container下线或是node下线)都由另一台机器在同一个IP地址下继续提供服务。切换期间网络不不会中断。

既然已经有了两台运转正常的Docker node,显然Keepalived跑在Container里是最经济且便于管理的。这里用到的docker image是 https://github.com/osixia/docker-keepalived

需要注意的是两台机器的sysctl需要设置 net.ipv4.ip_nonlocal_bind=1 在Ubuntu上可以通过修改 /etc/sysctl.conf 并运行 sysctl -p /etc/sysctl.conf 实现。在RancherOS上需要修改cloud-config.yml 具体参考官方文档

并且这两个container需要跑在host network上且赋予 CAP_NET_ADMIN (--cap-add NET_ADMIN

以下是用docker-composer 和直接运行docker run的两种配置。

# docker-composer.yml

keepalived:
     container_name: keepalived
     image: arcts/keepalived:latest
     environment:
       - KEEPALIVED_AUTOCONF=true
       - KEEPALIVED_STATE=MASTER
       - KEEPALIVED_INTERFACE=eth0
       - KEEPALIVED_VIRTUAL_ROUTER_ID=2
       - KEEPALIVED_UNICAST_SRC_IP=10.2.1.10
       - KEEPALIVED_UNICAST_PEER_0=10.2.1.11
       - KEEPALIVED_TRACK_INTERFACE_1=eth0
       - KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0"
     network_mode: "host"
     cap_add:
       - NET_ADMIN
# docker run command
docker run -d --name keepalived --net=host --cap-add NET_ADMIN \
-e KEEPALIVED_AUTOCONF=true               	\
-e KEEPALIVED_STATE=BACKUP           		\
-e KEEPALIVED_INTERFACE=eth0                \
-e KEEPALIVED_VIRTUAL_ROUTER_ID=2           \
-e KEEPALIVED_UNICAST_SRC_IP=10.2.1.11    	\
-e KEEPALIVED_UNICAST_PEER_0=10.2.1.10     \
-e KEEPALIVED_TRACK_INTERFACE_1=eth0        \
-e KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0" \
arcts/keepalived

至此 IP地址 10.2.1.12 就由 10.2.1.10 为master ,10.2.1.10下线 则10.2.1.11 自动由backup转为master继续提供服务

在家搞了IPv6 tunnel

几个月前就在Comcast IPv6 trials报名申请IPv6线路测试,等了几个月收到的唯一更新就是测试名额已满,什么时候再开不知道。对Comcast不抱什么希望,还是搞个HE的IPv6 tunnel接入。Router上跑的Tomato USB v1.28支持IPv6 6in4 static tunnel。

首先就是在Hurricane Electric申请一条Regular Tunnel。我选择了离家物理距离最近的Fremont机房。申请完成后会看到一堆参数,在Router上设置如下。

Assigned/Routed Prefix 填Routed IPv6 Prefixes – Routed /64中的内容

Tunnel Remote Endpoint (IPv4 Address)填Server IPv4 Address中的IPv4地址,也就是在创建Tunnel的时候你选择的对应机房IPv4地址

Router IPv6 Address 对应Server IPv6 Address

Tunnel Client IPv6 Address对应Client IPv6 Address

Router上保存后你可以在终端上获取到IPv6地址,然后自然是到  这里测试下你的IPv6 tunnel是否联通。如果一切正常的话,恭喜你,你可以看到KAME那只乌龟的动画了。

如果你的ISP没有给你提供static ipv4的话,你每次获得新IP还需要更新下tunnel broker那边你的ip地址。在Tunnel Details里的Advanced tab有具体说明。

补充下,如果是动态IP地址,那么需要设置一个DDNS来周期性地向HE更新你的client IPv4地址。Basic -> DDNS 里service可选het.net IPv6 tunnel broker,所以即使你没有固定IP也可以方便使用HE的IPv6 tunnel