VkInstance is an instance of a program
VkPhysicalDevice represents a physical device. So if I have an Intel HD Graphics and a GTX 1660 there will be one VkPhysicalDevice for each
QueueFamily, for now, will be a queue that helps in sending and receiving things from the GPU. There are many queues, like one for transfering data from memory, other that processes computation commands, etc.
A VkDevice is a VkPhysicalDevice associated with a queue family. It makes sense that we can have multiple VkDevices for the same VkPhysicalDevice. We may use a GPU for lots of things simultaneously like decode video and render a 3D scene. I guess that's what it's for.
We need a VkSurfaceKHR to display things, because Vulkan is device agnostic, so it makes sense that we need to pass a window to it.
Now comes the concept of SwapChain. I can't differentiate it from a Queue (from a QueueFamily). Wasn't the Queue the structure to send and receive images from the GPU? Why not simply use a Queue to present images on the VkSurfaceKHR?
There's also the concept of framebuffers. For me a framebuffer would be the rendered image that is displayed on screen, so it'd be an image of the SwapChain.