Jiva provides highly available iSCSI block storage Persistent Volumes for Kubernetes Stateful Applications, by making use of the host filesystem.
Jiva comprises of two components:
- A Target ( or a Storage Controller) that exposes iSCSI, while synchronously replicating the data to one or more Replicas.
- A set of Replicas that a Target uses to read/write data. Each of the replica will be on a different node to ensure high availabiliby against node or network failures. The Replicas save the data into sparse files on the host filesystem directories.
Jiva is containerized storage controller. The docker images are available at:
The docker container can be used directly to spin up volume. OpenEBS Control Plane makes it easy to manage Jiva Volumes.
When using Jiva volumes with OpenEBS, the Jiva volumes is composed of the following Kubernetes native objects.
- A Kubernetes Service pointing to Jiva iSCSI Target
- A Kubernetes Deployment for Jiva Target with Replicas=1
- A Kubernetes Deployment for Jiva Replicas with Replica=n and Pod Anti-affinity set to have each Replica pod on different node
The Jiva Replica Pods are provided with Jiva iSCSI Target Service - Cluster IP and can auto-connect/register with the Targets. The Jiva Target helps in determining the consistency of data across the replicas, by taking care of rebuilding the replicas when required. A Volume will be marked as online for Read and Write - if at least more than 51% of the Replicas are online.
The number of replicas and other attributes of the Jiva volumes can be configured via Storage Class - OpenEBS annotations.
For further info, checkout OpenEBS Documentation or join the slack#
Rancher Longhorn, which helped with the significant portion of the code in this repo, helped us to validate that Storage controllers can be run as microservices and they can be coded in Go. The iSCSI functionality is derived from gostor/gotgt.