At its core, Kubernetes is an orchestration engine used for managing containerized workloads. Note that, here, the keyword is containerized. Kubernetes doesn't care what the workloads are as long as they are packaged in containers; it knows how to handle them. Initially, Kubernetes only supported Docker images, and then, later, it added support for other runtimes. Then, Kubernetes 1.5 introduced the Container Runtime Interface (CRI), and gradually pushed the explicit support for other runtimes out of tree. Here, Kubernetes no longer cared about which container runtime was actually deployed on the nodes and just needed to work with the CRI.
A similar story unfolded with networking, where the Container Networking Interface (CNI) was defined early. The life of Kubernetes was simple. It was left to different networking solutions to provide their CNI plugins...