OpenStack Affinity and Anti-Affinity

Configure OpenStack server groups with affinity and anti-affinity policies to control instance placement across compute hosts using CLI commands.

Server groups with affinity and anti-affinity policies dictate how the Nova scheduler places instances across compute hosts.

Prerequisites

  • OpenStack Version: 2024.2 Dalmatian or later.
  • Compute Hosts: Minimum 2 hosts for anti-affinity.
  • Scheduler: FilterScheduler with ServerGroupAffinityFilter and ServerGroupAntiAffinityFilter enabled.

Step 1: Enable Scheduler Filters

Edit /etc/nova/nova.conf on the controller node:

[filter_scheduler]
enabled_filters = AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

Restart the Nova scheduler service:

sudo systemctl restart nova-scheduler

Step 2: Create an Anti-Affinity Server Group

Create a group to enforce instance distribution across hosts:

openstack server group create \
  --policy anti-affinity \
  ha-web-group

Step 3: Launch Instances in the Group

Launch instances using the --server-group flag:

GROUP_ID=$(openstack server group list -c ID -f value | head -n 1)

openstack server create \
  --flavor m1.medium \
  --image "Ubuntu 22.04" \
  --network tenant-net \
  --server-group $GROUP_ID \
  web-01

openstack server create \
  --flavor m1.medium \
  --image "Ubuntu 22.04" \
  --network tenant-net \
  --server-group $GROUP_ID \
  web-02

openstack server create \
  --flavor m1.medium \
  --image "Ubuntu 22.04" \
  --network tenant-net \
  --server-group $GROUP_ID \
  web-03

Step 4: Verify Placement

Confirm instances are distributed across different hosts:

openstack server list --long -c Name -c Host

Step 5: Create an Affinity Server Group

Force instances to co-locate on a single host:

openstack server group create \
  --policy affinity \
  colocated-group

GROUP_ID=$(openstack server group list -c ID -f value | grep colocated-group | awk '{print $1}')

openstack server create \
  --flavor m1.small \
  --image "Ubuntu 22.04" \
  --network tenant-net \
  --server-group $GROUP_ID \
  app-01

openstack server create \
  --flavor m1.small \
  --image "Ubuntu 22.04" \
  --network tenant-net \
  --server-group $GROUP_ID \
  app-02

Step 6: Use Soft Policies

Use soft policies to allow fallback when strict constraints cannot be met:

openstack server group create --policy soft-anti-affinity flexible-ha-group
openstack server group create --policy soft-affinity flexible-colocated-group

Real-World Patterns

Database HA Cluster

openstack server group create --policy anti-affinity db-cluster
GROUP_ID=$(openstack server group list -c ID -f value | grep db-cluster | awk '{print $1}')

for i in 1 2 3; do
  openstack server create --flavor m1.xlarge \
    --image "Ubuntu 22.04" \
    --network db-net \
    --server-group $GROUP_ID \
    db-node-$i
done

Application + Cache Colocation

openstack server group create --policy affinity app-cache
GROUP_ID=$(openstack server group list -c ID -f value | grep app-cache | awk '{print $1}')

openstack server create --flavor m1.medium \
  --image "Ubuntu 22.04" \
  --network app-net \
  --server-group $GROUP_ID \
  app-server

openstack server create --flavor m1.small \
  --image "Ubuntu 22.04" \
  --network app-net \
  --server-group $GROUP_ID \
  redis-cache

Managing Server Groups

openstack server group list
openstack server group show <group-id>
openstack server group delete <group-id>

Troubleshooting

  • No valid host: Use soft-anti-affinity or soft-affinity, or add compute capacity.
  • Policy ignored: Verify ServerGroupAffinityFilter and ServerGroupAntiAffinityFilter are in enabled_filters and restart nova-scheduler.
  • Cannot add existing VM: Delete and recreate the instance with the --server-group flag.
  • Soft policy always colocates: Enable additional compute hosts or verify nova-compute service status.