Luna bonding and Vlans
Luna 2.1u1 (april 8 2025) and higher supports native bonding and has extended vlan support. This would allow for bonding on top of tagged interfaces or tagging on top of bonding and of course regular bonding and vlan configurations. Bonding based on IB interfaces (IPoIB NIC-s) is supported as well.
Bonds and Vlans can be configured on a group level, meaning all the nodes part of the group will inherit these interfaces, or on a node level to either override a group configuration or extend.
Bonding for groups and nodes
For Ethernet based bonds, the network these interfaces reside in must be specified as type ethernet. For Infiniband based bonds, the type has to be infiniband.
For example, cluster network is type ethernet:
+------------------------------------------------------------------------------------------------------------+
| << Network >> |
+---+----------+---------------+------------+-------+------------------+----------------+--------------------+
| # | name | network | type | dhcp | dhcp_range_begin | dhcp_range_end | dhcp_nodes_in_pool |
+---+----------+---------------+------------+-------+------------------+----------------+--------------------+
| 1 | cluster | 10.141.0.0/16 | ethernet | True | 10.141.10.0 | 10.141.255.253 | True |
+---+----------+---------------+------------+-------+------------------+----------------+--------------------+
Group level bonded interfaces
To add a bond using ens192 and ens224 for group compute for example:
luna group change -if bond0 -B balance-rr -A 'ens192,ens224' -N cluster compute
When showing the groups details, the bond is there:
+-------------------------------------------------------------------------------+
| Group => compute |
+---------------------+---------------------------------------------------------+
| name | compute |
| domain | cluster |
| osimage | compute |
| osimagetag | default (default) |
| kerneloptions | net.ifnames=0 biosdevname=0 (compute) |
| interfaces | interface = BOOTIF |
| | network = cluster |
| | interface = bond0 |
| | network = cluster |
| | bond_mode = balance-rr |
| | bond_slaves = ens192,ens224 |
| | interface = BMC |
| | network = ipmi |
| setupbmc | True |
...
+---------------------+---------------------------------------------------------+
It's possible to make a bond, where the provisioning interface (default BOOTIF) is a part of:
luna group change -if BOOTIF -B balance-rr -A 'BOOTIF,ens224' -N cluster compute
+-------------------------------------------------------------------------------+
| Group => compute |
+---------------------+---------------------------------------------------------+
| name | compute |
| domain | cluster |
| osimage | compute |
| osimagetag | default (default) |
| kerneloptions | net.ifnames=0 biosdevname=0 (compute) |
| interfaces | interface = BOOTIF |
| | network = cluster |
| | bond_mode = balance-rr |
| | bond_slaves = BOOTIF,ens224 |
| | interface = BMC |
| | network = ipmi |
| setupbmc | True |
...
+---------------------+---------------------------------------------------------+
In this case, the node would 'mark' the interface of the bond that boots as BOOTIF, performs the normal tasks in terms of provisioning and after the pivot, sets up the bond where BOOTIF would be part of.
Node level bonded interfaces
In principle the same approach for bonding on a group level is also available on a node level. Where the node inherits from the group, it would automatically be created and based on the network, automatically assigned an IP address, which can be changed if desired.
Say we want to setup a bond, that only applies to a node and automatically assign an IP address:
luna node change -if bond0 -B balance-rr -A 'ens192,ens224' -N cluster node001
We can also set an IP address right away in a single shot:
luna node change -if bond0 -B balance-rr -A 'ens192,ens224' -N cluster -I 10.141.100.1 node001
or just tuned when the interface is inherited:
luna node change -if bond0 -I 10.141.100.1 node001
Unknown which interface will be BOOTIF
In the scenario where BOOTIF is used as a member of the bond, there might be cases where depending on the cabling, BIOS or switch configuration, the order of booting, the used interface to provision might alter between nodes. It might not always be possible to determine which of the interfaces e.g. ens192 or ens224 is used for booting.
In this case we can configure the bond as such:
luna group change -if BOOTIF -B balance-rr -A 'BOOTIF,ens192,ens224' -N cluster compute
or on a node level:
luna node change -if BOOTIF -B balance-rr -A 'BOOTIF,ens192,ens224' -N cluster node001
Luna will resolve which of the slaves are duplicate during provisioning time.
Mac address can also be used as member identifier. This however can only be done on a node level:
luna node change -if BOOTIF -B balance-rr -A 'BOOTIF,00:11:22:33:44:55' -N cluster node001
+-------------------------------------------------------------------------------+
| Node => node001 |
+---------------------+---------------------------------------------------------+
| name | node001 |
| hostname | node001.cluster |
| group | compute |
| osimage | compute (compute) |
| osimagetag | default (default) |
| kerneloptions | net.ifnames=0 biosdevname=0 (compute) |
| interfaces | interface = BOOTIF |
| | ipaddress = 10.141.0.1 |
| | macaddress = 00:50:56:b3:b2:3b <- detected at boot time
| | network = cluster |
| | bond_mode = balance-rr |
| | bond_slaves = BOOTIF,00:11:22:33:44:55 |
| | interface = BMC |
| | ipaddress = 10.148.0.1 |
| | macaddress = None |
| | network = ipmi |
...
+---------------------+---------------------------------------------------------+
Note: Using duplicates or mac addresses only works for distributions where NetworkManager is used. Ubuntu uses netplan and requires the actual interface names.
VLANs for groups and nodes
Previous releases of luna did support vlans, but it would only support it on the same parent interface as where the vlan was configured for. This would limit the functionality of vlans. This however has changed and vlans can now be configured using the the same parent device, but also configured to use a different parent device.
Before we configure vlans, we configure a network first where the vlan will be used for. We already have the default cluster network for provisioning and we have one additional, e.g. storagenet:
+----------------------------------------------------------------------------------------------------------------+
| << Network >> |
+---+-------------+---------------+------------+--------+------------------+----------------+--------------------+
| # | name | network | type | dhcp | dhcp_range_begin | dhcp_range_end | dhcp_nodes_in_pool |
+---+-------------+---------------+------------+--------+------------------+----------------+--------------------+
| 1 | cluster | 10.141.0.0/16 | ethernet | True | 10.141.10.0 | 10.141.255.253 | True |
| 2 | storagenet | 10.151.0.0/16 | ethernet | False | | | False |
+---+-------------+---------------+------------+--------+------------------+----------------+--------------------+
Group level tagged interfaces
For example, setting a tagged interface for group compute to use vlan id 1024 on top of the provisioning interface BOOTIF:
luna group change -if vlan1024 -L 1024 -P BOOTIF -N storagenet compute
This would create a new interface called vlan1024 in network storagenet, which uses the BOOTIF as a parent. Of course any other interface can be used as a parent as well. All nodes that are member of the group compute will inherit this interface and assigns an IP address automatically, which can be changed on a node level.
Node level tagged interfaces
Of course, vlans can be configured on nodes as well. It typically is inherited from the group and can be overridden or configured:
luna node change -if vlan1024 -L 1024 -P BOOTIF -N storagenet node001
If an IP address is not supplied, one will be automatically provided.
When an specific IP address is desired, it can be configured with the vlan in a single shot for a node:
luna node change -if vlan1024 -L 1024 -P BOOTIF -N storagenet -I 10.151.100.1 node001
or when the interface is already configured on a group level, merely tuned:
luna node change -if vlan1024 -I 10.151.100.1 node001
Vlans on top of bonds
An example how to configure a vlan on top of a bond:
luna group change -if bond0 -B balance-rr -A 'ens192,ens224' -N cluster compute
luna group change -if vlan1024 -L 1024 -P bond0 -N storagenet compute
luna node change -if bond0 -B balance-rr -A 'ens192,ens224' -N cluster node001
luna node change -if vlan1024 -L 1024 -P bond0 -N storagenet node001
Bonds on top of vlans
An example how to configure a bond on top of two tagged interfaces:
luna group change -if vlan1024.1 -L 1024 -P ens192 -N storagenet compute
luna group change -if vlan1024.2 -L 1024 -P ens224 -N storagenet compute
luna group change -if bond0 -B balance-rr -A 'vlan1024.1,vlan1024.2' -N storagenet compute
luna node change -if vlan1024.1 -L 1024 -P ens192 -N storagenet node001
luna node change -if vlan1024.2 -L 1024 -P ens224 -N storagenet node001
luna node change -if bond0 -B balance-rr -A 'vlan1024.1,vlan1024.2' -N storagenet node001