Kubernetes can use Docker as the container runtime engine and all the code to work with Docker was embedded within the Kubernetes source code with other container runtimes (rkt and cri-o).
It was important to open up and extend support to work with different container runtimes and not be dependent on the Kubernetes source code. That is why Container runtime interface came.
The Container Runtime Interface is a standard that defines how an orchestration solution like Kubernetes would communicate with Container runtime interface is developed they can simply follow Container Runtime Interface Standards and that new container runtime would work with Kubernetes
Also, There is a Container networking interface. Any new networking Venders can simply develop their plugin based on the Container networking interface standards to make their solution work with Kubernetes.
AND There is Container Storage Interface that was developed to support multiple storage solutions(Amazon EBS, portworx, DELL EMC, GlusterFS etc) with Container Storage Interface.
With Container Storage Interface, you can now write your own drivers for your own storage to work with Kubernetes. Container Storage Interface is not a specific standard. It is meant to be a universal standard and if implemented allows any container orchestration tool to work with any storage vendor with a supported plugIn.
- Container Storage Interface says that when a pod is created and requires a volume the Container Orchestrator that is KubernetesShould call the create volume RPC(Remote procedure call) and pass a set of details such as the volume name the storage driver should implement.
- The RPC(Remote procedure call) handles that request and provision and new volume on the storage array and returns the result of the operation.
- Container Orchestrator should call the delete volume RPC whenever the volume is to be deleted, and the storage driver should implement the code to decommission the volume from the Array.
Container Storage Interface
- call to provision a new volume
- call to delete a volume
- call to place a workload that uses the volume onto a node
- provision a new volume on the storage
- decommission a volume
- make the volume available on a node.