libStorage
provides a vendor agnostic storage orchestration model, API, and
reference client and server implementations.
libStorage
enables storage consumption by leveraging methods commonly
available, locally and/or externally, to an operating system (OS).
The libStorage
project and its architecture represents a culmination of
experience gained from the project authors' building of
several
different
storage
orchestration tools. While created using
different languages and targeting disparate storage platforms, all the tools
were architecturally aligned and embedded functionality directly inside the
tools and affected storage platforms.
This shared design goal enabled tools that natively consumed storage, sans external dependencies.
Today libStorage
focuses on adding value to container runtimes and storage
orchestration tools such as Docker
and Mesos
, however the libStorage
framework is available abstractly for more general usage across:
- Operating systems
- Storage platforms
- Hardware platforms
- Virtualization platforms
The client side implementation, focused on operating system activities, has a minimal set of dependencies in order to avoid a large, runtime footprint.
Today there are many storage orchestration and abstraction tools relevant to to container runtimes. These tools often must be installed locally and run alongside the container runtime.
The solid green lines represent active communication paths. The dotted black lines represent passive paths. The orange volume represents a operating system device and volume path available to the container runtime.
Embedding libStorage
client and server components enable container
runtimes to communicate directly with storage platforms, the ideal
architecture. This design requires minimal operational dependencies and is
still able to provide volume management for container runtimes.
In a centralized architecture, libStorage
is hosted as a service, acting as a
go-between for container runtimes and backend storage platforms.
The libStorage
endpoint is advertised by a tool like REX-Ray, run from anywhere, and is
responsible for all control plane operations to the storage platform along with
maintaining escalated credentials for these platforms. All client based
processes within the operating system are still embedded in the container
runtime.
Similar to the centralized architecture, this implementation design involves
running a separate libStorage
process alongside each container runtime, across
one or several hosts.
Central to libStorage
is the HTTP
/JSON
API. It defines the control plane
calls that occur between the client and server. While the libStorage
package
includes reference implementations of the client and server written using Go,
both the client and server could be written using any language as long as both
adhere to the published libStorage
API.
The libStorage
client is responsible for discovering a host's instance ID
and the next, available device name. The client's reference implementation is
written using Go and is compatible with C++.
The design goal of the client is to be lightweight, portable, and avoid obsolescence by minimizing dependencies and focusing on deferring as much of the logic as possible to the server.
The libStorage
server implements the libStorage
API and is responsible for
coordinating requests between clients and backend orchestration packages. The
server's reference implementation is also written using Go.
The libStorage
model
defines several data structures that are easily represented using Go structs or
a portable format such as JSON.
The libStorage
documentation is available at
libstorage.rtfd.org.