Run CoreOS on OpenStack

Written by Christoph Hartmann

This guide will walk you through downloading CoreOS for OpenStack, importing in OpenStack with glance and start your first CoreOS cluster with the nova tool.

Upload the Image

Personally, I use the OpenStack Docker CLI image, that provides the nova and glance tool and is described here. Once you are able to connect to OpenStack, you need to download the CoreOS image and bunzip it.

# download stable channel
$ wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_openstack_image.img.bz2
# extract image
$ bunzip2 coreos_production_openstack_image.img.bz2

Now, upload the CoreOS image via glance:

$ glance image-create --name CoreOS \
  --container-format bare \
  --disk-format qcow2 \
  --progress \
  --file coreos_production_openstack_image.img \
  --is-public True
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | ed8eef431a77f11c3bea501574c590fe     |
| container_format | bare                                 |
| created_at       | 2015-04-22T13:24:42                  |
| deleted          | False                                |
| deleted_at       | None                                 |
| disk_format      | qcow2                                |
| id               | 5f6add97-7f21-407b-8f17-c887603efacb |
| is_public        | True                                 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | CoreOS                               |
| owner            | eef34004eb0f4f5ca722a29efd292d70     |
| protected        | False                                |
| size             | 420413440                            |
| status           | active                               |
| updated_at       | 2015-04-22T13:31:49                  |
| virtual_size     | None                                 |
+------------------+--------------------------------------+

Verify your image

Verify that your newly uploaded image is available in glance.

$ glance image-list
+--------------------------------------+---------------------------------+-------------+------------------+-------------+--------+
| ID                                   | Name                            | Disk Format | Container Format | Size        | Status |
+--------------------------------------+---------------------------------+-------------+------------------+-------------+--------+
| 5f6add97-7f21-407b-8f17-c887603efacb | CoreOS                          | qcow2       | bare             | 420413440   | active |
+--------------------------------------+---------------------------------+-------------+------------------+-------------+--------+

Retrieve a new discovery token for the CoreOS cluster

This guide used the etcd instance provided by CoreOS to manage the cluster. This eases the quickstart of a CoreOS cluster. Request a new cluster token via:

$ curl -w "\n" 'https://discovery.etcd.io/new?size=3'
https://discovery.etcd.io/24a9bafd557e8c45f89f547de6564ae5

Create a cloud config file

Create a local cloud-config.yaml and replace the https://discovery.etcd.io/<token> with your discovery url like ‘https://discovery.etcd.io/24a9bafd557e8c45f89f547de6564ae5

#cloud-config

coreos:
  etcd:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new?size=3
    # specify the intial size of your cluster with ?size=X
    discovery: https://discovery.etcd.io/<token>
    # multi-region and multi-cloud deployments need to use $public_ipv4
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
ssh_authorized_keys:
  # include one or more SSH public keys
  - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0g+ZTxC7weoIJLUafOgrm+h...

More detailed configuration options are available at CoreOS Docs

Create a new CoreOS cluster

With the cloud-init file ready, we start a 3-instance cluster via nova. You may need to adapt the the flavor or security group names for your setup.

nova boot \
--user-data ./cloud-config.yaml \
--image CoreOS \
--key-name coreos \
--flavor m1.medium \
--num-instances 3 \
--security-groups default coreos

After a successful run, all three instances are ready in OpenStack.

$ nova list
+--------------------------------------+---------------------------------------------+--------+------------+-------------+-------------------------------------+
| ID                                   | Name                                        | Status | Task State | Power State | Networks                            |
+--------------------------------------+---------------------------------------------+--------+------------+-------------+-------------------------------------+
| 2ed7d9ac-0449-4841-a780-cf9131740475 | coreos-2ed7d9ac-0449-4841-a780-cf9131740475 | ACTIVE | -          | Running     | default=192.168.0.12                |
| b919702e-be2f-4fcb-96c2-88fe9d14d320 | coreos-b919702e-be2f-4fcb-96c2-88fe9d14d320 | ACTIVE | -          | Running     | default=192.168.0.11                |
| c65cf227-05e3-46e6-9f11-a16ee6f13f4d | coreos-c65cf227-05e3-46e6-9f11-a16ee6f13f4d | ACTIVE | -          | Running     | default=192.168.0.13, 185.27.183.99 |
+--------------------------------------+---------------------------------------------+--------+------------+-------------+-------------------------------------+

Verify the CoreOS cluster is registered in fleet

SSH into CoreOS:

ssh core@185.27.183.99
Last login: Wed Apr 22 14:03:50 2015 from 217.247.74.212
CoreOS stable (633.1.0)
core@coreos-c65cf227-05e3-46e6-9f11-a16ee6f13f4d ~ $

and verify that all nodes are registered properly in fleet:

core@coreos-c65cf227-05e3-46e6-9f11-a16ee6f13f4d ~ $ fleetctl list-machines
MACHINE     IP      METADATA
2ed7d9ac... 192.168.0.12    -
b919702e... 192.168.0.11    -
c65cf227... 192.168.0.13    -

Now you have a running CoreOS Cluster on OpenStack.

References: