Skip to content
Lokomotive is a 100% open-source Kubernetes distribution from the folks at Kinvolk
Branch: master
Clone or download
Latest commit a71ced4 Jun 7, 2019


Lokomotive is an open source project by Kinvolk which distributes pure upstream Kubernetes.



Lokomotive provides a Terraform Module for each supported operating system and platform. Flatcar Linux is a mature and reliable choice.

Platform Operating System Terraform Module Status
AWS Flatcar Linux aws/flatcar-linux/kubernetes stable
Azure Flatcar Linux azure/flatcar-linux/kubernetes alpha
Bare-Metal Flatcar Linux bare-metal/flatcar-linux/kubernetes stable
Packet Flatcar Linux packet/flatcar-linux/kubernetes beta



Define a Kubernetes cluster by using the Terraform module for your chosen platform and operating system. Here's a minimal example.

module "aws-tempest" {
  source = "git::"

  providers = {
    aws = "aws.default"
    local = "local.default"
    null = "null.default"
    template = "template.default"
    tls = "tls.default"

  # AWS
  cluster_name = "yavin"
  dns_zone     = ""
  dns_zone_id  = "Z3PAABBCFAKEC0"

  # configuration
  ssh_authorized_key = "ssh-rsa AAAAB3Nz..."
  asset_dir          = "/home/user/.secrets/clusters/yavin"

  # optional
  worker_count = 2
  worker_type  = "t3.small"

Initialize modules, plan the changes to be made, and apply the changes.

$ terraform init
$ terraform plan
Plan: 64 to add, 0 to change, 0 to destroy.
$ terraform apply
Apply complete! Resources: 64 added, 0 changed, 0 destroyed.

In 4-8 minutes (varies by platform), the cluster will be ready. This AWS example creates a DNS record to resolve to a network load balancer backed by controller instances.

$ export KUBECONFIG=/home/user/.secrets/clusters/yavin/auth/kubeconfig
$ kubectl get nodes
NAME                                       ROLES              STATUS  AGE  VERSION
yavin-controller-0.c.example-com.internal  controller,master  Ready   6m   v1.14.1
yavin-worker-jrbf.c.example-com.internal   node               Ready   5m   v1.14.1
yavin-worker-mzdm.c.example-com.internal   node               Ready   5m   v1.14.1

List the pods.

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY  STATUS    RESTARTS  AGE
kube-system   calico-node-1cs8z                         2/2    Running   0         6m
kube-system   calico-node-d1l5b                         2/2    Running   0         6m
kube-system   calico-node-sp9ps                         2/2    Running   0         6m
kube-system   coredns-1187388186-dkh3o                  1/1    Running   0         6m
kube-system   kube-apiserver-zppls                      1/1    Running   0         6m
kube-system   kube-controller-manager-3271970485-gh9kt  1/1    Running   0         6m
kube-system   kube-controller-manager-3271970485-h90v8  1/1    Running   1         6m
kube-system   kube-proxy-117v6                          1/1    Running   0         6m
kube-system   kube-proxy-9886n                          1/1    Running   0         6m
kube-system   kube-proxy-njn47                          1/1    Running   0         6m
kube-system   kube-scheduler-3895335239-5x87r           1/1    Running   0         6m
kube-system   kube-scheduler-3895335239-bzrrt           1/1    Running   1         6m
kube-system   pod-checkpointer-l6lrt                    1/1    Running   0         6m
kube-system   pod-checkpointer-l6lrt-controller-0       1/1    Running   0         6m

Try Flatcar Edge

Flatcar Edge is a Flatcar Linux channel that includes experimental bleeding-edge features.

To try it just add the following configuration option to the example above.

os_image = "flatcar-edge"


Ask questions on the IRC #lokomotive-k8s channel on

You can’t perform that action at this time.