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:
FilterSchedulerwithServerGroupAffinityFilterandServerGroupAntiAffinityFilterenabled.
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: Usesoft-anti-affinityorsoft-affinity, or add compute capacity.- Policy ignored: Verify
ServerGroupAffinityFilterandServerGroupAntiAffinityFilterare inenabled_filtersand restartnova-scheduler. - Cannot add existing VM: Delete and recreate the instance with the
--server-groupflag. - Soft policy always colocates: Enable additional compute hosts or verify
nova-computeservice status.