| Dean Troyer | 54b9732 | 2014-06-20 17:53:55 -0500 | [diff] [blame] | 1 | <!DOCTYPE html> | 
 | 2 | <html lang="en"> | 
 | 3 |   <head> | 
 | 4 |     <meta charset="utf-8"> | 
 | 5 |     <title>Multi-Node Lab Server Guide - DevStack</title> | 
 | 6 |     <meta name="description" content=""> | 
 | 7 |     <meta name="author" content=""> | 
 | 8 |  | 
 | 9 |     <!-- Le HTML5 shim, for IE6-8 support of HTML elements --> | 
 | 10 |     <!--[if lt IE 9]> | 
 | 11 |       <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> | 
 | 12 |     <![endif]--> | 
 | 13 |  | 
 | 14 |     <!-- Le styles --> | 
 | 15 |     <link href="../assets/css/bootstrap.css" rel="stylesheet"> | 
 | 16 |     <link href="../assets/css/local.css" rel="stylesheet"> | 
 | 17 |     <style type="text/css"> | 
 | 18 |       body { padding-top: 60px; } | 
 | 19 |       dd { padding: 10px; } | 
 | 20 |     </style> | 
 | 21 |      | 
 | 22 |     <!-- Le javascripts --> | 
 | 23 |     <script src="../assets/js/jquery-1.7.1.min.js" type="text/javascript" charset="utf-8"></script> | 
 | 24 |     <script src="../assets/js/bootstrap.js" type="text/javascript" charset="utf-8"></script> | 
 | 25 |   </head> | 
 | 26 |  | 
 | 27 |   <body> | 
 | 28 |  | 
 | 29 |     <div class="navbar navbar-fixed-top"> | 
 | 30 |       <div class="navbar-inner"> | 
 | 31 |         <div class="container"> | 
 | 32 |           <a class="brand" href="/">DevStack</a> | 
 | 33 |           <ul class="nav pull-right"> | 
 | 34 |             <li><a href="../overview.html">Overview</a></li> | 
 | 35 |             <li><a href="../changes.html">Changes</a></li> | 
 | 36 |             <li><a href="../faq.html">FAQ</a></li> | 
 | 37 |             <li><a href="http://github.com/openstack-dev/devstack">GitHub</a></li> | 
 | 38 |             <li><a href="https://review.openstack.org/#/q/status:open+project:openstack-dev/devstack,n,z">Gerrit</a></li> | 
 | 39 |           </ul> | 
 | 40 |         </div> | 
 | 41 |       </div> | 
 | 42 |     </div> | 
 | 43 |  | 
 | 44 |     <div class="container"> | 
 | 45 |  | 
 | 46 |       <section id="overview"> | 
 | 47 |         <h1>Multi-Node Lab: Serious Stuff</h1> | 
 | 48 |         <p>Here is OpenStack in a realistic test configuration with multiple physical servers.</p> | 
 | 49 |       </section> | 
 | 50 |  | 
 | 51 |       <section id="prerequisites"> | 
 | 52 |         <div class="page-header"> | 
 | 53 |           <h2>Prerequisites <small>Linux & Network</small></h2> | 
 | 54 |         </div> | 
 | 55 |          | 
 | 56 |         <h3>Minimal Install</h3> | 
| Dean Troyer | 1c42599 | 2014-07-28 17:51:13 -0500 | [diff] [blame] | 57 |         <p>You need to have a system with a fresh install of Linux.  You can download the <a href="https://help.ubuntu.com/community/Installation/MinimalCD">Minimal CD</a> for Ubuntu releases since DevStack will download & install all the additional dependencies.  The netinstall ISO is available for <a href="http://mirrors.kernel.org/fedora/releases/18/Fedora/x86_64/iso/Fedora-20-x86_64-netinst.iso">Fedora</a> and <a href="http://mirrors.kernel.org/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-netinstall.iso">CentOS/RHEL</a>.</p> | 
| Dean Troyer | 54b9732 | 2014-06-20 17:53:55 -0500 | [diff] [blame] | 58 |  | 
 | 59 |         <p>Install a couple of packages to bootstrap configuration:</p> | 
 | 60 |         <pre>apt-get install -y git sudo || yum install -y git sudo</pre> | 
 | 61 |  | 
 | 62 |         <h3>Network Configuration</h3> | 
 | 63 |         <p>The first iteration of the lab uses OpenStack's FlatDHCP network controller so | 
 | 64 |         only a single network will be required.  It should be on its own subnet without DHCP; | 
 | 65 |         the host IPs and floating IP pool(s) will come out of this block. This example  | 
 | 66 |         uses the following:</p> | 
 | 67 |         <ul> | 
 | 68 |           <li>Gateway: 192.168.42.1</li> | 
 | 69 |           <li>Physical nodes: 192.168.42.11-192.168.42.99</li> | 
 | 70 |           <li>Floating IPs: 192.168.42.128-192.168.42.254</li> | 
 | 71 |         </ul> | 
 | 72 |         <p>Configure each node with a static IP. | 
 | 73 |         For Ubuntu edit <code>/etc/network/interfaces</code>:</p> | 
 | 74 |  | 
 | 75 |         <pre>auto eth0 | 
 | 76 | iface eth0 inet static | 
 | 77 |     address 192.168.42.11 | 
 | 78 |     netmask 255.255.255.0 | 
 | 79 |     gateway 192.168.42.1 | 
 | 80 | </pre> | 
 | 81 |         <p>For Fedora and CentOS/RHEL edit | 
 | 82 |         <code>/etc/sysconfig/network-scripts/ifcfg-eth0</code>:</p> | 
 | 83 |  | 
 | 84 |         <pre>BOOTPROTO=static | 
 | 85 | IPADDR=192.168.42.11 | 
 | 86 | NETMASK=255.255.255.0 | 
 | 87 | GATEWAY=192.168.42.1 | 
 | 88 | </pre> | 
 | 89 |  | 
 | 90 | <!-- save these for the VLAN version | 
 | 91 |    auto eth0.926 | 
 | 92 |    iface eth0.926 inet static | 
 | 93 |            address 10.4.144.3 | 
 | 94 |            netmask 255.255.240.0 | 
 | 95 |            #gateway 10.4.144.1 | 
 | 96 |            up ifconfig eth0.926 | 
 | 97 |     | 
 | 98 |    auto eth0.605 | 
 | 99 |    iface eth0.605 inet static | 
 | 100 |            address 172.16.103.3 | 
 | 101 |            netmask 255.255.255.0 | 
 | 102 |            #gateway 172.16.103.1 | 
 | 103 |            up ifconfig eth0.605 up | 
 | 104 | --> | 
 | 105 |  | 
 | 106 |       </section> | 
 | 107 |  | 
 | 108 |       <section id="installation"> | 
 | 109 |         <div class="page-header"> | 
 | 110 |           <h2>Installation <small>shake and bake</small></h2> | 
 | 111 |         </div> | 
 | 112 |  | 
 | 113 |         <h3>Add the DevStack User</h3> | 
 | 114 |         <p>OpenStack runs as a non-root user that has sudo access to root.  There is nothing special | 
 | 115 |         about the name, we'll use <code>stack</code> here. Every node must use the same name and | 
 | 116 |         preferably uid. If you created a user during the OS install you can use it and give it | 
 | 117 |         sudo priviledges below.  Otherwise create the stack user:</p> | 
 | 118 |         <pre>groupadd stack | 
 | 119 | useradd -g stack -s /bin/bash -d /opt/stack -m stack</pre> | 
 | 120 |         <p>This user will be making many changes to your system during installation and operation | 
 | 121 |         so it needs to have sudo priviledges to root without a password:</p> | 
 | 122 |         <pre>echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers</pre> | 
 | 123 |         <p>From here on use the <code>stack</code> user.  <b>Logout</b> and <b>login</b> as the  | 
 | 124 |         <code>stack</code> user.</p> | 
 | 125 |  | 
 | 126 |         <h3>Set Up Ssh</h3> | 
 | 127 |         <p>Set up the stack user on each node with an ssh key for access:</p> | 
 | 128 |         <pre>mkdir ~/.ssh; chmod 700 ~/.ssh | 
 | 129 | echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyYjfgyPazTvGpd8OaAvtU2utL8W6gWC4JdRS1J95GhNNfQd657yO6s1AH5KYQWktcE6FO/xNUC2reEXSGC7ezy+sGO1kj9Limv5vrvNHvF1+wts0Cmyx61D2nQw35/Qz8BvpdJANL7VwP/cFI/p3yhvx2lsnjFE3hN8xRB2LtLUopUSVdBwACOVUmH2G+2BWMJDjVINd2DPqRIA4Zhy09KJ3O1Joabr0XpQL0yt/I9x8BVHdAx6l9U0tMg9dj5+tAjZvMAFfye3PJcYwwsfJoFxC8w/SLtqlFX7Ehw++8RtvomvuipLdmWCy+T9hIkl+gHYE4cS3OIqXH7f49jdJf jesse@spacey.local" > ~/.ssh/authorized_keys</pre> | 
 | 130 |  | 
 | 131 |         <h3>Download DevStack</h3> | 
 | 132 |         <p>Grab the latest version of DevStack from github:</p> | 
 | 133 |         <pre>git clone https://github.com/openstack-dev/devstack.git | 
 | 134 | cd devstack</pre> | 
 | 135 |  | 
 | 136 |         <p>Up to this point all of the steps apply to each node in the cluster.  From here on | 
 | 137 |         there are some differences between the cluster controller (aka 'head node') and the | 
 | 138 |         compute nodes.</p> | 
 | 139 |  | 
 | 140 |         <h3>Configure Cluster Controller</h3> | 
 | 141 |         <p>The cluster controller runs all OpenStack services.  Configure the cluster controller's DevStack in <code>local.conf</code>:</p> | 
 | 142 |         <pre>[[local|localrc]] | 
 | 143 | HOST_IP=192.168.42.11 | 
 | 144 | FLAT_INTERFACE=eth0 | 
 | 145 | FIXED_RANGE=10.4.128.0/20 | 
 | 146 | FIXED_NETWORK_SIZE=4096 | 
 | 147 | FLOATING_RANGE=192.168.42.128/25 | 
 | 148 | MULTI_HOST=1 | 
 | 149 | LOGFILE=/opt/stack/logs/stack.sh.log | 
 | 150 | ADMIN_PASSWORD=labstack | 
 | 151 | MYSQL_PASSWORD=supersecret | 
 | 152 | RABBIT_PASSWORD=supersecrete | 
 | 153 | SERVICE_PASSWORD=supersecrete | 
 | 154 | SERVICE_TOKEN=xyzpdqlazydog</pre> | 
 | 155 | <!-- save for vlan | 
 | 156 | FLAT_INTERFACE=eth0.926 | 
 | 157 | --> | 
 | 158 |  | 
 | 159 |         <p>In the multi-node configuration the first 10 or so IPs in the private subnet are usually reserved.  Add this to <code>local.sh</code> to have it run after every <code>stack.sh</code> run:</p> | 
 | 160 |         <pre>for i in `seq 2 10`; do /opt/stack/nova/bin/nova-manage fixed reserve 10.4.128.$i; done</pre> | 
 | 161 |  | 
 | 162 |         <p>Fire up OpenStack:</p> | 
 | 163 |         <pre>./stack.sh</pre> | 
 | 164 |         <p>A stream of activity ensues.  When complete you will see a summary of | 
 | 165 |         <code>stack.sh</code>'s work, including the relevant URLs, accounts and passwords to poke at your | 
 | 166 |         shiny new OpenStack.  The most recent log file is available in <code>stack.sh.log</code>.</p> | 
 | 167 |  | 
 | 168 |         <h3>Configure Compute Nodes</h3> | 
 | 169 |         <p>The compute nodes only run the OpenStack worker services.  For additional machines, create a <code>local.conf</code> with:</p> | 
 | 170 |         <pre>HOST_IP=192.168.42.12 # change this per compute node | 
 | 171 | FLAT_INTERFACE=eth0 | 
 | 172 | FIXED_RANGE=10.4.128.0/20 | 
 | 173 | FIXED_NETWORK_SIZE=4096 | 
 | 174 | FLOATING_RANGE=192.168.42.128/25 | 
 | 175 | MULTI_HOST=1 | 
 | 176 | LOGFILE=/opt/stack/logs/stack.sh.log | 
 | 177 | ADMIN_PASSWORD=labstack | 
 | 178 | MYSQL_PASSWORD=supersecret | 
 | 179 | RABBIT_PASSWORD=supersecrete | 
 | 180 | SERVICE_PASSWORD=supersecrete | 
 | 181 | SERVICE_TOKEN=xyzpdqlazydog | 
 | 182 | DATABASE_TYPE=mysql | 
 | 183 | SERVICE_HOST=192.168.42.11 | 
 | 184 | MYSQL_HOST=192.168.42.11 | 
 | 185 | RABBIT_HOST=192.168.42.11 | 
 | 186 | GLANCE_HOSTPORT=192.168.42.11:9292 | 
| Robbie Harwood (frozencemetery) | 4e07fdc | 2014-07-14 18:11:39 -0400 | [diff] [blame] | 187 | ENABLED_SERVICES=n-cpu,n-net,n-api,c-sch,c-api,c-vol | 
 | 188 | NOVA_VNC_ENABLED=True | 
 | 189 | NOVNCPROXY_URL="http://192.168.42.11:6080/vnc_auto.html" | 
 | 190 | VNCSERVER_LISTEN=$HOST_IP | 
 | 191 | VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN | 
 | 192 | </pre> | 
 | 193 |  | 
| Dean Troyer | 54b9732 | 2014-06-20 17:53:55 -0500 | [diff] [blame] | 194 | <!-- save for vlan | 
 | 195 | FLAT_INTERFACE=eth0.926 | 
 | 196 | --> | 
 | 197 |  | 
 | 198 |         <p>Fire up OpenStack:</p> | 
 | 199 |         <pre>./stack.sh</pre> | 
 | 200 |         <p>A stream of activity ensues.  When complete you will see a summary of | 
 | 201 |         <code>stack.sh</code>'s work, including the relevant URLs, accounts and passwords to poke at your | 
 | 202 |         shiny new OpenStack.  The most recent log file is available in <code>stack.sh.log</code>.</p> | 
 | 203 |  | 
 | 204 |         <h3>Cleaning Up After DevStack</h3> | 
 | 205 |         <p>Shutting down OpenStack is now as simple as running the included <code>unstack.sh</code> script:</p> | 
 | 206 |         <pre>./unstack.sh</pre> | 
 | 207 |  | 
 | 208 |         <p>A more aggressive cleanup can be performed using <code>clean.sh</code>.  It removes certain troublesome packages and attempts to leave the system in a state where changing the database or queue manager can be reliably performed. | 
 | 209 |         <pre>./clean.sh</pre> | 
 | 210 |  | 
 | 211 |         <p>Sometimes running instances are not cleaned up.  DevStack attempts to do this when it | 
 | 212 |         runs but there are times it needs to still be done by hand:</p> | 
 | 213 |         <pre>sudo rm -rf /etc/libvirt/qemu/inst* | 
 | 214 | sudo virsh list | grep inst | awk '{print $1}' | xargs -n1 virsh destroy</pre> | 
 | 215 |  | 
 | 216 |       </section> | 
 | 217 |  | 
 | 218 |       <section id="options"> | 
 | 219 |         <div class="page-header"> | 
 | 220 |           <h2>Options <small>pimp your stack</small></h2> | 
 | 221 |         </div> | 
 | 222 |  | 
 | 223 |         <h3>Additional Users</h3> | 
 | 224 |         <p>DevStack creates two OpenStack users (<code>admin</code> and <code>demo</code>) and two tenants (also <code>admin</code> and <code>demo</code>).  <code>admin</code> is exactly what it sounds like, a priveleged administrative account that is a member of both the <code>admin</code> and <code>demo</code> tenants.  <code>demo</code> is a normal user account that is only a member of the <code>demo</code> tenant.  Creating additional OpenStack users can be done through the dashboard, sometimes it is easier to do them in bulk from a script, especially since they get blown away every time | 
 | 225 |         <code>stack.sh</code> runs.  The following steps are ripe for scripting:</p> | 
 | 226 |         <pre># Get admin creds | 
 | 227 | . openrc admin admin | 
 | 228 |          | 
 | 229 | # List existing tenants | 
 | 230 | keystone tenant-list | 
 | 231 |  | 
 | 232 | # List existing users | 
 | 233 | keystone user-list | 
 | 234 |  | 
 | 235 | # Add a user and tenant | 
 | 236 | NAME=bob | 
 | 237 | PASSWORD=BigSecrete | 
 | 238 | TENANT=$NAME | 
 | 239 | keystone tenant-create --name=$NAME | 
 | 240 | keystone user-create --name=$NAME --pass=$PASSWORD | 
 | 241 | keystone user-role-add --user-id=<bob-user-id> --tenant-id=<bob-tenant-id> --role-id=<member-role-id> | 
 | 242 | # member-role-id comes from the existing member role created by stack.sh | 
 | 243 | # keystone role-list</pre> | 
 | 244 |  | 
 | 245 |         <h3>Swift</h3> | 
 | 246 |         <p>Swift requires a significant amount of resources and is disabled by default in DevStack. | 
 | 247 |         The support in DevStack is geared toward a minimal installation but can be used for | 
 | 248 |         testing.  To implement a true multi-node test of Swift required more than DevStack provides.   | 
 | 249 |         Enabling it is as simple as enabling the <code>swift</code> service in <code>local.conf</code>: | 
 | 250 |         <pre>enable_service swift</pre> | 
 | 251 |  | 
 | 252 |         <p>Swift will put its data files in <code>SWIFT_DATA_DIR</code> (default <code>/opt/stack/data/swift</code>). | 
 | 253 |         The size of the data 'partition' created (really a loop-mounted file) is set by | 
 | 254 |         <code>SWIFT_LOOPBACK_DISK_SIZE</code>.  The Swift config files are located in  | 
 | 255 |         <code>SWIFT_CONFIG_DIR</code> (default <code>/etc/swift</code>).  All of these settings can be overridden in | 
 | 256 |         (wait for it...) <code>local.conf</code>.</p> | 
 | 257 |  | 
 | 258 |         <h3>Volumes</h3> | 
 | 259 |         <p>DevStack will automatically use an existing LVM volume group named <code>stack-volumes</code>  | 
 | 260 |         to store cloud-created volumes. If <code>stack-volumes</code> doesn't exist, DevStack  | 
 | 261 |         will set up a 5Gb loop-mounted file to contain it.  This obviously limits the | 
 | 262 |         number and size of volumes that can be created inside OpenStack.  The size can be | 
 | 263 |         overridden by setting <code>VOLUME_BACKING_FILE_SIZE</code> in <code>local.conf</code>.</p> | 
 | 264 |  | 
 | 265 |         <p><code>stack-volumes</code> can be pre-created on any physical volume supported by | 
 | 266 |         Linux's LVM.  The name of the volume group can be changed by setting <code>VOLUME_GROUP</code> | 
 | 267 |         in <code>localrc</code>. <code>stack.sh</code> deletes | 
 | 268 |         all logical volumes in <code>VOLUME_GROUP</code> that begin with  | 
 | 269 |         <code>VOLUME_NAME_PREFIX</code> as part of cleaning up from previous runs. | 
 | 270 |         It is recommended to not use the root volume group as <code>VOLUME_GROUP</code>.</p> | 
 | 271 |  | 
 | 272 |         <p>The details of creating the volume group depends on the server hardware involved  | 
 | 273 |         but looks something like this:</p> | 
 | 274 |         <pre>pvcreate /dev/sdc | 
 | 275 | vgcreate stack-volumes /dev/sdc</pre> | 
 | 276 |  | 
 | 277 |         <h3>Syslog</h3> | 
 | 278 |         <p>DevStack is capable of using <code>rsyslog</code> to agregate logging across the cluster. | 
 | 279 |         It is off by default; to turn it on set <code>SYSLOG=True</code> in <code>local.conf</code>. | 
 | 280 |         <code>SYSLOG_HOST</code> defaults to <code>HOST_IP</code>; on the compute nodes it  | 
 | 281 |         must be set to the IP of the cluster controller to send syslog output there.  In the example | 
 | 282 |         above, add this to the compute node <code>local.conf</code>:</p> | 
 | 283 |         <pre>SYSLOG_HOST=192.168.42.11</pre> | 
 | 284 |  | 
 | 285 |         <h3>Using Alternate Repositories/Branches</h3> | 
 | 286 |         <p>The git repositories for all of the OpenStack services are defined in <code>stackrc</code>. | 
 | 287 |         Since this file is a part of the DevStack package changes to it will probably be overwritten | 
 | 288 |         as updates are applied.  Every setting in <code>stackrc</code> can be redefined in | 
 | 289 |         <code>local.conf</code>.</p> | 
 | 290 |  | 
 | 291 |         <p>To change the repository or branch that a particular OpenStack service is created from, | 
 | 292 |         simply change the value of <code>*_REPO</code> or <code>*_BRANCH</code> corresponding to | 
 | 293 |         that service.</p> | 
 | 294 |  | 
 | 295 |         <p>After making changes to the repository or branch, if <code>RECLONE</code> is not set | 
 | 296 |         in <code>localrc</code> it may be necessary to remove the corresponding directory from | 
 | 297 |         <code>/opt/stack</code> to force git to re-clone the repository.</p> | 
 | 298 |  | 
 | 299 |         <p>For example, to pull Nova from a proposed release candidate in the primary Nova  | 
 | 300 |         repository:</p> | 
 | 301 |         <pre>NOVA_BRANCH=rc-proposed</pre> | 
 | 302 |  | 
 | 303 |         <p>To pull Glance from an experimental fork:</p> | 
 | 304 |         <pre>GLANCE_BRANCH=try-something-big | 
 | 305 | GLANCE_REPO=https://github.com/mcuser/glance.git</pre> | 
 | 306 |  | 
 | 307 |       </section> | 
 | 308 |  | 
 | 309 |       <section id="Notes"> | 
 | 310 |         <div class="page-header"> | 
 | 311 |           <h2>Notes <small>stuff you might need to know</small></h2> | 
 | 312 |         </div> | 
 | 313 |  | 
 | 314 |         <h3>Reset the Bridge</h3> | 
 | 315 |         <p>How to reset the bridge configuration:</p> | 
 | 316 |         <pre>sudo brctl delif br100 eth0.926 | 
 | 317 | sudo ip link set dev br100 down | 
 | 318 | sudo brctl delbr br100</pre> | 
 | 319 | <!-- | 
 | 320 |    sudo rm /etc/libvirt/qemu/*.xml | 
 | 321 | --> | 
 | 322 |  | 
 | 323 |         <h3>Set MySQL Password</h3> | 
 | 324 |         <p>If you forgot to set the root password you can do this:</p> | 
 | 325 |         <pre>mysqladmin -u root -pnova password 'supersecret'</pre> | 
 | 326 |  | 
 | 327 |       </section> | 
 | 328 |  | 
 | 329 |       <footer> | 
 | 330 |         <p>© Openstack Foundation 2011-2014 — An <a href="https://www.openstack.org/">OpenStack</a> <a href="https://wiki.openstack.org/wiki/Programs">program</a></p> | 
 | 331 |       </footer> | 
 | 332 |  | 
 | 333 |     </div> <!-- /container --> | 
 | 334 |  | 
 | 335 |   </body> | 
 | 336 | </html> |