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