| Cody A.W. Somerville | baa35d0 | 2016-02-11 01:23:14 -0500 | [diff] [blame] | 1 | ================================ | 
|  | 2 | All-In-One Single LXC Container | 
|  | 3 | ================================ | 
|  | 4 |  | 
|  | 5 | This guide walks you through the process of deploying OpenStack using devstack | 
|  | 6 | in an LXC container instead of a VM. | 
|  | 7 |  | 
|  | 8 | The primary benefits to running devstack inside a container instead of a VM is | 
|  | 9 | faster performance and lower memory overhead while still providing a suitable | 
|  | 10 | level of isolation. This can be particularly useful when you want to simulate | 
|  | 11 | running OpenStack on multiple nodes. | 
|  | 12 |  | 
|  | 13 | .. Warning:: Containers do not provide the same level of isolation as a virtual | 
|  | 14 | machine. | 
|  | 15 |  | 
|  | 16 | .. Note:: Not all OpenStack features support running inside of a container. See | 
|  | 17 | `Limitations`_ section below for details. :doc:`OpenStack in a VM <single-vm>` | 
|  | 18 | is recommended for beginners. | 
|  | 19 |  | 
|  | 20 | Prerequisites | 
|  | 21 | ============== | 
|  | 22 |  | 
|  | 23 | This guide is written for Ubuntu 14.04 but should be adaptable for any modern | 
|  | 24 | Linux distribution. | 
|  | 25 |  | 
|  | 26 | Install the LXC package:: | 
|  | 27 |  | 
|  | 28 | sudo apt-get install lxc | 
|  | 29 |  | 
|  | 30 | You can verify support for containerization features in your currently running | 
|  | 31 | kernel using the ``lxc-checkconfig`` command. | 
|  | 32 |  | 
|  | 33 | Container Setup | 
|  | 34 | =============== | 
|  | 35 |  | 
|  | 36 | Configuration | 
|  | 37 | --------------- | 
|  | 38 |  | 
|  | 39 | For a successful run of ``stack.sh`` and to permit use of KVM to run the VMs you | 
|  | 40 | launch inside your container, we need to use the following additional | 
|  | 41 | configuration options. Place the following in a file called | 
|  | 42 | ``devstack-lxc.conf``:: | 
|  | 43 |  | 
|  | 44 | # Permit access to /dev/loop* | 
|  | 45 | lxc.cgroup.devices.allow = b 7:* rwm | 
|  | 46 |  | 
|  | 47 | # Setup access to /dev/net/tun and /dev/kvm | 
|  | 48 | lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 0 0 | 
|  | 49 | lxc.mount.entry = /dev/kvm dev/kvm none bind,create=file 0 0 | 
|  | 50 |  | 
|  | 51 | # Networking | 
|  | 52 | lxc.network.type = veth | 
|  | 53 | lxc.network.flags = up | 
|  | 54 | lxc.network.link = lxcbr0 | 
|  | 55 |  | 
|  | 56 |  | 
|  | 57 | Create Container | 
|  | 58 | ------------------- | 
|  | 59 |  | 
|  | 60 | The configuration and rootfs for LXC containers are created using the | 
|  | 61 | ``lxc-create`` command. | 
|  | 62 |  | 
|  | 63 | We will name our container ``devstack`` and use the ``ubuntu`` template which | 
|  | 64 | will use ``debootstrap`` to build a Ubuntu rootfs. It will default to the same | 
|  | 65 | release and architecture as the host system. We also install the additional | 
|  | 66 | packages ``bsdmainutils`` and ``git`` as we'll need them to run devstack:: | 
|  | 67 |  | 
|  | 68 | sudo lxc-create -n devstack -t ubuntu -f devstack-lxc.conf -- --packages=bsdmainutils,git | 
|  | 69 |  | 
|  | 70 | The first time it builds the rootfs will take a few minutes to download, unpack, | 
|  | 71 | and configure all the necessary packages for a minimal installation of Ubuntu. | 
|  | 72 | LXC will cache this and subsequent containers will only take seconds to create. | 
|  | 73 |  | 
|  | 74 | .. Note:: To speed up the initial rootfs creation, you can specify a mirror to | 
|  | 75 | download the Ubuntu packages from by appending ``--mirror=`` and then the URL | 
|  | 76 | of a Ubuntu mirror. To see other other template options, you can run | 
|  | 77 | ``lxc-create -t ubuntu -h``. | 
|  | 78 |  | 
|  | 79 | Start Container | 
|  | 80 | ---------------- | 
|  | 81 |  | 
|  | 82 | To start the container, run:: | 
|  | 83 |  | 
|  | 84 | sudo lxc-start -n devstack | 
|  | 85 |  | 
|  | 86 | A moment later you should be presented with the login prompt for your container. | 
|  | 87 | You can login using the username ``ubuntu`` and password ``ubuntu``. | 
|  | 88 |  | 
|  | 89 | You can also ssh into your container. On your host, run | 
|  | 90 | ``sudo lxc-info -n devstack`` to get the IP address (e.g. | 
| bhargavaregalla | 69d3b79 | 2016-05-17 09:34:26 +0100 | [diff] [blame] | 91 | ``ssh ubuntu@$(sudo lxc-info -n devstack | awk '/IP/ { print $2 }')``). | 
| Cody A.W. Somerville | baa35d0 | 2016-02-11 01:23:14 -0500 | [diff] [blame] | 92 |  | 
|  | 93 | Run Devstack | 
|  | 94 | ------------- | 
|  | 95 |  | 
|  | 96 | You should now be logged into your container and almost ready to run devstack. | 
|  | 97 | The commands in this section should all be run inside your container. | 
|  | 98 |  | 
|  | 99 | .. Tip:: You can greatly reduce the runtime of your initial devstack setup by | 
|  | 100 | ensuring you have your apt sources.list configured to use a fast mirror. | 
|  | 101 | Check and update ``/etc/apt/sources.list`` if necessary and then run | 
|  | 102 | ``apt-get update``. | 
|  | 103 |  | 
|  | 104 | #. Download DevStack | 
|  | 105 |  | 
|  | 106 | :: | 
|  | 107 |  | 
|  | 108 | git clone https://git.openstack.org/openstack-dev/devstack | 
|  | 109 |  | 
|  | 110 | #. Configure | 
|  | 111 |  | 
|  | 112 | Refer to :ref:`minimal-configuration` if you wish to configure the behaviour | 
|  | 113 | of devstack. | 
|  | 114 |  | 
|  | 115 | #. Start the install | 
|  | 116 |  | 
|  | 117 | :: | 
|  | 118 |  | 
|  | 119 | cd devstack | 
|  | 120 | ./stack.sh | 
|  | 121 |  | 
|  | 122 | Cleanup | 
|  | 123 | ------- | 
|  | 124 |  | 
|  | 125 | To stop the container:: | 
|  | 126 |  | 
|  | 127 | lxc-stop -n devstack | 
|  | 128 |  | 
|  | 129 | To delete the container:: | 
|  | 130 |  | 
|  | 131 | lxc-destroy -n devstack | 
|  | 132 |  | 
|  | 133 | Limitations | 
|  | 134 | ============ | 
|  | 135 |  | 
|  | 136 | Not all OpenStack features may function correctly or at all when ran from within | 
|  | 137 | a container. | 
|  | 138 |  | 
|  | 139 | Cinder | 
|  | 140 | ------- | 
|  | 141 |  | 
|  | 142 | Unable to create LVM backed volume | 
|  | 143 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  | 144 |  | 
|  | 145 | In our configuration, we have not whitelisted access to device-mapper or LVM | 
|  | 146 | devices. Doing so will permit your container to have access and control of LVM | 
|  | 147 | on the host system. To enable, add the following to your | 
|  | 148 | ``devstack-lxc.conf`` before running ``lxc-create``:: | 
|  | 149 |  | 
|  | 150 | lxc.cgroup.devices.allow = c 10:236 rwm | 
|  | 151 | lxc.cgroup.devices.allow = b 252:* rwm | 
|  | 152 |  | 
|  | 153 | Additionally you'll need to set ``udev_rules = 0`` in the ``activation`` | 
|  | 154 | section of ``/etc/lvm/lvm.conf`` unless you mount devtmpfs in your container. | 
|  | 155 |  | 
|  | 156 | Unable to attach volume to instance | 
|  | 157 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | 
|  | 158 |  | 
|  | 159 | It is not possible to attach cinder volumes to nova instances due to parts of | 
|  | 160 | the Linux iSCSI implementation not being network namespace aware. This can be | 
|  | 161 | worked around by using network pass-through instead of a separate network | 
|  | 162 | namespace but such a setup significantly reduces the isolation of the | 
|  | 163 | container (e.g. a ``halt`` command issued in the container will cause the host | 
|  | 164 | system to shutdown). |