fleet - a distributed init system
This project is quite low-level, and is designed as a foundation for higher order orchestration. fleet is a cluster-wide elaboration on systemd units, and is not a container manager or orchestration system. fleet supports basic scheduling of systemd units across nodes in a cluster. Those looking for more complex scheduling requirements or a first-class container orchestration system should check out Kubernetes. The fleet and kubernetes comparison table has more information about the two systems.
fleet has seen production use for some time and is largely considered stable. However, there are known scalability limitations with its architecture. As such, it is not recommended to run fleet clusters larger than 100 nodes or with more than 1000 services. The fleet project is being maintained for bug fixes but the existing maintainers do not intend to add additional major features or significantly rework fleet to address these limitations.
If you are a developer and wish to help maintain fleet and improve its scalability, please email the maintainers.
Launching a unit with fleet is as simple as running
$ fleetctl start examples/hello.service
Unit hello.service launched on 113f16a7.../172.17.8.103
fleetctl start command waits for the unit to get scheduled and actually start somewhere in the cluster.
fleetctl list-unit-files tells you the desired state of your units and where they are currently scheduled:
$ fleetctl list-unit-files
UNIT HASH DSTATE STATE TMACHINE
hello.service e55c0ae launched launched 113f16a7.../172.17.8.103
fleetctl list-units exposes the systemd state for each unit in your fleet cluster:
$ fleetctl list-units
UNIT MACHINE ACTIVE SUB
hello.service 113f16a7.../172.17.8.103 active running
Supported Deployment Patterns
fleet is not intended to be an all-purpose orchestration system, and as such supports only a few simple deployment patterns:
- Deploy a single unit anywhere on the cluster
- Deploy a unit globally everywhere in the cluster
- Automatic rescheduling of units on machine failure
- Ensure that units are deployed together on the same machine
- Forbid specific units from colocation on the same machine (anti-affinity)
- Deploy units to machines only with specific metadata
These patterns are all defined using custom systemd unit options.
Before you can deploy units, fleet must be deployed and configured on each host in your cluster. (If you are running CoreOS, fleet is already installed.)
After you have machines configured (check
fleetctl list-machines), get to work with the client.
fleet must be built with Go 1.4+ on a Linux machine. Simply run
./build and then copy the binaries out of
bin/ directory onto each of your machines. The tests can similarly be run by simply invoking
If you're on a machine without Go 1.4+ but you have Docker installed, run
./build-docker to compile the binaries instead.
The fleet API uses JSON over HTTP to manage units in a fleet cluster. See the API documentation for more information.
See the releases tab for more information on each release.
See CONTRIBUTING for details on submitting patches and contacting developers via IRC and mailing lists.
fleet is released under the Apache 2.0 license. See the LICENSE file for details.
Specific components of fleet use code derivative from software distributed under other licenses; in those cases the appropriate licenses are stipulated alongside the code.
Package main is a simple wrapper of the real fleet entrypoint package (located at github.com/coreos/fleet/fleetd) to ensure that fleet is still "go getable"; e.g. `go get github.com/coreos/fleet` works as expected and builds a binary in $GOBIN/fleetd
This package should NOT be extended or modified in any way; to modify the fleetd binary, work in the `github.com/coreos/fleet/fleetd` package.
Fleet functional test suite These test files must be executed as described in README.md, they are not plain old Go unit tests.
|Fleet functional test suite These test files must be executed as described in README.md, they are not plain old Go unit tests.
Package rpc is a generated protocol buffer package.
|Package rpc is a generated protocol buffer package.
Package schema provides access to the fleet API.
|Package schema provides access to the fleet API.