Correct me if i am wrong.
Openstack components (nova, cinder, glance) controls libvirt to provide visualization and libvirt use qemu-kvm as the hypervisor. The reason openstack don’t control the qemu-kvm directly is because libvirt provides better cross VM functionality (it can adopt to xen, vmware, etc…) and it provides high-end function such pool management and column management.
KVM is the hypervisor, is emulate the CPU but it don’t do anything about networking and I/O peripheral control. That’s why we need to use qemu-kvm as the emulator to emulator all the peripherals, rather than use KVM directly.
The following diagram is the relationship between kvm, qemu-kvm, libvirt and openstack components.