Running CoreOS Container Linux on Rackspace

These instructions will walk you through running Container Linux on the Rackspace OpenStack cloud, which differs slightly from the generic OpenStack instructions. There are two ways to launch a Container Linux cluster: launch an entire cluster with Heat or launch machines with Nova.

Choosing a channel

Container Linux is designed to be updated automatically with different schedules per channel. You can disable this feature, although we don't recommend it. Read the release notes for specific features and bug fixes.

The Alpha channel closely tracks master and is released frequently. The newest versions of system libraries and utilities will be available for testing. The current version is Container Linux 1562.1.0.

The following command can be used to determine the image IDs for Alpha:

supernova production image-list | grep 'CoreOS (Alpha)'

The Beta channel consists of promoted Alpha releases. The current version is Container Linux 1548.2.0.

The following command can be used to determine the image IDs for Beta:

supernova production image-list | grep 'CoreOS (Beta)'

The Stable channel should be used by production clusters. Versions of Container Linux are battle-tested within the Beta and Alpha channels before being promoted. The current version is Container Linux 1520.6.0.

The following command can be used to determine the image IDs for Stable:

supernova production image-list | grep 'CoreOS (Stable)'

Cloud-config

Container Linux allows you to configure machine parameters, launch systemd units on startup and more via cloud-config. Jump over to the docs to learn about the supported features. Cloud-config is intended to bring up a cluster of machines into a minimal useful state and ideally shouldn't be used to configure anything that isn't standard across many hosts. Once a machine is created on Rackspace, the cloud-config can't be modified.

You can provide cloud-config data via both Heat and Nova APIs. You cannot provide cloud-config via the Control Panel. If you launch machines via the UI, you will have to do all configuration manually.

The most common Rackspace cloud-config looks like:

 #cloud-config

coreos:
  etcd2:
    # generate a new token for each unique cluster from https://discovery.etcd.io/new?size=3
    # specify the initial size of your cluster with ?size=X
    discovery: https://discovery.etcd.io/<token>
    # multi-region and multi-cloud deployments need to use $public_ipv4
    advertise-client-urls: http://$private_ipv4:2379,http://$private_ipv4:4001
    initial-advertise-peer-urls: http://$private_ipv4:2380
    # listen on both the official ports and the legacy ports
    # legacy ports can be omitted if your application doesn't depend on them
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
    listen-peer-urls: http://$private_ipv4:2380
  units:
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start
CoreOS cloud-configs can validated using the online validator.

The $private_ipv4 and $public_ipv4 substitution variables are fully supported in cloud-config on Rackspace.

Mount data disk

Certain server flavors have separate system and data disks. To utilize the data disks, they must be mounted with a .mount unit. Check to make sure the Where= parameter accurately reflects the location of the block device:

 #cloud-config
coreos:
  units:
    - name: media-data.mount
      command: start
      content: |
        [Mount]
        What=/dev/xvde
        Where=/media/data
        Type=ext3
CoreOS cloud-configs can validated using the online validator.

Mounting Cloud Block Storage can be done with a mount unit, but should not be included in cloud-config unless the disk is present on the first boot.

For more general information, check out mounting storage on Container Linux.

Launch with Nova

We're going to install rackspace-novaclient, upload a keypair and boot the image id from above.

Install Supernova tool

The Supernova tool requires Python and pip, a Python package manger. If you don't have pip installed, install it by running sudo easy_install pip. Now let's use pip to install Supernova, a tool that lets you easily switch Rackspace regions. Be sure to install these in the order listed:

sudo pip install keyring
sudo pip install rackspace-novaclient
sudo pip install supernova

Store account information

Edit your config file (~/.supernova) to store your Rackspace username, API key (referenced as OS_PASSWORD) and some other settings. The OS_TENANT_NAME should be set to your Rackspace account ID, which can be found by clicking on your Rackspace username in the upper right-hand corner of the cloud control panel UI.

[production]
OS_AUTH_URL = https://identity.api.rackspacecloud.com/v2.0/
OS_USERNAME = username
OS_PASSWORD = fd62afe2-4686-469f-9849-ceaa792c55a6
OS_TENANT_NAME = 123456
OS_REGION_NAME = DFW
OS_AUTH_SYSTEM = rackspace

We're ready to create a keypair then boot a server with it.

Create keypair

For this guide, I'm assuming you already have a public key you use for your Container Linux servers. Note that only RSA keypairs are supported. Load the public key to Rackspace:

supernova production keypair-add --pub-key ~/.ssh/coreos.pub coreos-key

Check you make sure the key is in your list by running supernova production keypair-list

+------------+-------------------------------------------------+
| Name       | Fingerprint                                     |
+------------+-------------------------------------------------+
| coreos-key | d0:6b:d8:3a:3e:6a:52:43:32:bc:01:ea:c2:0f:49:59 |
+------------+-------------------------------------------------+

Boot a server

Boot a new Cloud Server with our new keypair and specify optional cloud-config data:

supernova production boot --image <image-id> --flavor performance1-2 --key-name coreos-key --user-data ~/cloud_config.yml --config-drive true My_Container_Linux_Server

Boot a new OnMetal Server with our new keypair and specify optional cloud-config data:

supernova production boot --image <image-id> --flavor onmetal-compute1 --key-name coreos-key --user-data ~/cloud_config.yml --config-drive true My_Container_Linux_Server

Boot a new Cloud Server with our new keypair and specify optional cloud-config data:

supernova production boot --image <image-id> --flavor performance1-2 --key-name coreos-key --user-data ~/cloud_config.yml --config-drive true My_Container_Linux_Server

Boot a new Cloud Server with our new keypair and specify optional cloud-config data:

supernova production boot --image <image-id> --flavor performance1-2 --key-name coreos-key --user-data ~/cloud_config.yml --config-drive true My_Container_Linux_Server

You should now see the details of your new server in your terminal and it should also show up in the control panel:

+------------------------+--------------------------------------+
| Property               | Value                                |
+------------------------+--------------------------------------+
| status                 | BUILD                                |
| updated                | 2013-11-02T19:43:45Z                 |
| hostId                 |                                      |
| key_name               | coreos-key                           |
| image                  | CoreOS                               |
| OS-EXT-STS:task_state  | scheduling                           |
| OS-EXT-STS:vm_state    | building                             |
| flavor                 | 512MB Standard Instance              |
| id                     | 82dbe66d-0762-4cba-a286-8c1af8431e47 |
| user_id                | 3c55bca772ba4a4bb6a4eb5b25754738     |
| name                   | My_Container_Linux_Server            |
| adminPass              | mgNqEx7I9pQA                         |
| tenant_id              | 833111                               |
| created                | 2013-11-02T19:43:44Z                 |
| OS-DCF:diskConfig      | MANUAL                               |
| accessIPv4             |                                      |
| accessIPv6             |                                      |
| progress               | 0                                    |
| OS-EXT-STS:power_state | 0                                    |
| metadata               | {}                                   |
+------------------------+--------------------------------------+

Launching more servers

To launch more servers and have them join your cluster, simply provide the same cloud-config.

Launch via control panel

You can also launch servers with either the alpha and beta channel versions via the web-based Control Panel, although you can't provide cloud-config via the UI. To do so:

  1. Log into your Rackspace Control Panel
  2. Click on 'Servers'
  3. Click on 'Create Server'
  4. Choose server name and region
  5. Click on 'Linux', then on 'CoreOS' and finally choose '(alpha)' or '(beta)' version
  6. Choose flavor and use 'Advanced Options' to select SSH Key – if available
  7. Click on 'Create Server'

Using CoreOS Container Linux

Now that you have a machine booted it is time to play around. Check out the Container Linux Quickstart guide or dig into more specific topics.