Keepalived in Triton

Bisher hatte ich immer gedacht, es wäre gar nicht möglich, IP-Failover mit keepalived in Triton zu konfigurieren. Es ist aber (vermutlich aus guten Gründen) nur für den Normaluser nicht möglich. Mit Admin-Unterstützung kann man bhyve-Instanzen erzeugen, die mit Hilfe einer "Service IP" z. B. einen hochverfügbaren Loadbalancer bereitstellen.

Der Administrator kann über das Admin-UI Instanzen erzeugen, denen IP-Adress- und MAC-Adress-Spoofing erlaubt sind:

Für meine bhyve-Instanz sieht die entsprechende Konfiguration dann z. B. so aus:

! Configuration File for keepalived 
   
vrrp_instance VI_1 {
    state MASTER
    interface net0
    virtual_router_id 101
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.65.69.45
    }
}

Die andere Instanz bekommt z. B. die virtual_router_id 100 und eine höhere oder niedrigere priority. Danach übernimmt die Instanz mit der höheren Priorität automatisch die IP-Adresse:

Sep 28 09:13:21 localhost systemd[1]: Started Keepalive Daemon (LVS and VRRP).
Sep 28 09:13:21 localhost Keepalived_vrrp[8710]: (VI_1) received lower priority (100) advert from 10.65.69.158 - discarding
Sep 28 09:13:24 localhost Keepalived_vrrp[8710]: message repeated 3 times: [ (VI_1) received lower priority (100) advert from 10.65.69.158 - discarding]
Sep 28 09:13:24 localhost Keepalived_vrrp[8710]: (VI_1) Entering MASTER STATE
[...]
2: net0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 90:b8:d0:6a:c3:d2 brd ff:ff:ff:ff:ff:ff
    altname enp0s6f0
    inet 10.65.69.109/24 brd 10.65.69.255 scope global net0
       valid_lft forever preferred_lft forever
    inet 10.65.69.45/32 scope global net0
       valid_lft forever preferred_lft forever
    inet6 fe80::92b8:d0ff:fe6a:c3d2/64 scope link 
       valid_lft forever preferred_lft forever
[...]

Die Service IP bzw. virtual_ipaddress muß man natürlich vorher in der Admin-UI reservieren:

reservierte IP in der Admin-UI

Jetzt muß man nur noch einen Dienst konfigurieren, der diese Funktion benutzt.