docs/spec/overview.md

87 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Resource Types
The primary resources in the Elafros API are Routes, Revisions, and Configurations:
* A **Route** provides a named endpoint and a mechanism for routing traffic to
* **Revisions**, which are immutable snapshots of code + config, created by a
* **Configuration**, which acts as a stream of environments for Revisions.
![Object model](images/object_model.png)
## Route
**Route** provides a network endpoint for a user's service (which
consists of a series of software and configuration Revisions over
time). A kubernetes namespace can have multiple routes. The route
provides a long-lived, stable, named, HTTP-addressable endpoint that
is backed by one or more **Revisions**. The default configuration is
for the route to automatically route traffic to the latest revision
created by a **Configuration**. For more complex scenarios, the API
supports splitting traffic on a percentage basis, and CI tools could
maintain multiple configurations for a single route (e.g. "golden
path" and “experiments”) or reference multiple revisions directly to
pin revisions during an incremental rollout and n-way traffic
split. The route can optionally assign addressable subdomains to any
or all backing revisions.
## Revision
**Revision** is an immutable snapshot of code and configuration. A
revision can be created from a pre-built container image or built from
source. While there is a history of previous revisions, only those
currently referenced by a Route are addressable or routable. Older
inactive revisions need not be backed by underlying resources, they
exist only as the revision metadata in storage. Revisions are created
by updates to a **Configuration**.
## Configuration
A **Configuration** describes the desired latest Revision state, and
creates and tracks the status of Revisions as the desired state is
updated. A configuration might include instructions on how to transform
a source package (either git repo or archive) into a container by
referencing a [Build](https://github.com/elafros/build), or might
simply reference a container image and associated execution metadata
needed by the Revision. On updates to a Configuration, a new build
and/or deployment (creating a Revision) may be performed; the
Configuration's controller will track the status of created Revisions
and makes both the most recently created and most recently *ready*
(i.e. healthy) Revision available in the status section.
# Orchestration
The system will be configured to not allow customer mutations to
Revisions. Instead, the creation of immutable Revisions through a
Configuration provides:
* a single referenceable resource for the route to perform automated
rollouts
* a single resource that can be watched to see a history of all the
revisions created
* (but doesnt mandate) PATCH semantics for new revisions to be done
on the server, minimizing read-modify-write implemented across
multiple clients, which could result in optimistic concurrency
errors
* the ability to rollback to a known good configuration
In the conventional single live revision scenario, a route has a
single configuration with the same name as the route. Update
operations on the configuration enable scenarios such as:
* *"Push code, keep config":* Specifying a new revision with updated
source, inheriting configuration such as env vars from the
configuration.
* *"Update config, keep code"*: Specifying a new revision as just a
change to configuration, such as updating an env variable,
inheriting all other configuration and source/image.
When creating an initial route and performing the first deployment,
the two operations of creating a Route and an associated Configuration
can be done in parallel, which streamlines the use case of deploying
code initially from a button. The
[sample API usage](normative_examples.md) section illustrates
conventional usage of the API.