An exokernel is a specific kind of kernel that focuses on providing as few abstractions of hardware as possible.
Exokernels take the opposite philosophy of many other kernel designs: absolute minimalism. Most kernels take a 'bigger is better' approach when it comes to exposed services, but exokernels simply try to ensure that all processes stay out of each other's way.
Essentially, this relegates the exokernel's task to something akin to a traffic light, referee, or benevolent communist dictatorship: properly allocate resources among everyone who needs them.
Most applications require higher-level access to services than an exokernel would provide. After all, most of us don't want to re-write a filesystem every time we write a new program! To this end, libraries are written that use the exokernel to present a more 'usual' set of services to applications. These libraries are called 'libOSes', since they provide the kinds of things most other kinds of operating systems do.
Flexibility is the primary reason that exokernel designs are chosen. By allowing different programs to utilize different libOSes, an exokernel can provide several different APIs to applications, giving them the best one for their needs. Two different libOSes could provide the same API, but different performance characteristics through implementation details.
Comparison to other kernel designs
MIT Parallel and Distributed OS lab original exokernel publications