From f81343617ab23ec9c4084258970d0430359b0e46 Mon Sep 17 00:00:00 2001 From: ladquin Date: Tue, 18 Jun 2013 15:24:08 -0300 Subject: [PATCH] Delete openstack-ops from openstack-manuals repo The Operations Guide has its own repository now. New repository is https://github.com/openstack/operations-guide Fixes bug 1180552 Change-Id: Ic8595278a91a2b979da54e7c7a61a483f399643b --- .../openstack-ops/locale/openstack-ops.pot | 280 -- doc/src/docbkx/openstack-ops/pom.xml | 132 - .../openstack-ops/src/acknowledgements.xml | 76 - .../docbkx/openstack-ops/src/app_crypt.xml | 511 --- .../docbkx/openstack-ops/src/app_usecases.xml | 214 -- .../docbkx/openstack-ops/src/bk_ops_guide.xml | 3094 ----------------- .../src/ch_arch_cloud_controller.xml | 454 --- .../src/ch_arch_compute_nodes.xml | 359 -- .../openstack-ops/src/ch_arch_example.xml | 338 -- .../src/ch_arch_network_design.xml | 312 -- .../openstack-ops/src/ch_arch_provision.xml | 196 -- .../openstack-ops/src/ch_arch_scaling.xml | 491 --- .../openstack-ops/src/ch_arch_storage.xml | 548 --- .../openstack-ops/src/ch_arch_whats_next.xml | 43 - .../src/ch_ops_backup_recovery.xml | 196 -- .../openstack-ops/src/ch_ops_customize.xml | 1016 ------ .../openstack-ops/src/ch_ops_dochistory.xml | 22 - .../openstack-ops/src/ch_ops_lay_of_land.xml | 570 --- .../openstack-ops/src/ch_ops_log_monitor.xml | 718 ---- .../openstack-ops/src/ch_ops_maintenance.xml | 1070 ------ .../src/ch_ops_network_troubleshooting.xml | 443 --- .../src/ch_ops_projects_users.xml | 655 ---- .../openstack-ops/src/ch_ops_resources.xml | 86 - .../openstack-ops/src/ch_ops_upstream.xml | 731 ---- .../openstack-ops/src/ch_ops_user_facing.xml | 1041 ------ .../openstack-ops/src/figures/1-IMG_4895.JPG | Bin 153523 -> 0 bytes .../src/figures/Check_mark_23x20_02.png | Bin 651 -> 0 bytes .../src/figures/Check_mark_23x20_02.svg | 60 - .../src/figures/horizon-add-project.png | Bin 21006 -> 0 bytes .../src/figures/horizon-user-project.png | Bin 23526 -> 0 bytes .../src/figures/network_packet_ping.png | Bin 26203 -> 0 bytes .../src/figures/network_packet_ping.svg | 3 - .../openstack-ops/src/figures/os-ref-arch.png | Bin 65169 -> 0 bytes .../openstack-ops/src/figures/os-ref-arch.svg | 3 - .../src/figures/os_disk_partition.png | Bin 13269 -> 0 bytes .../src/figures/os_physical_network.svg | 3 - .../src/figures/os_physical_network_1.png | Bin 42185 -> 0 bytes .../figures/releasecyclegrizzlydiagram.png | Bin 60277 -> 0 bytes .../docbkx/openstack-ops/src/preface_ops.xml | 220 -- 39 files changed, 13885 deletions(-) delete mode 100644 doc/src/docbkx/openstack-ops/locale/openstack-ops.pot delete mode 100644 doc/src/docbkx/openstack-ops/pom.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/acknowledgements.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/app_crypt.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/app_usecases.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/bk_ops_guide.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_cloud_controller.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_compute_nodes.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_example.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_network_design.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_provision.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_scaling.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_storage.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_arch_whats_next.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_backup_recovery.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_customize.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_dochistory.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_lay_of_land.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_log_monitor.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_maintenance.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_network_troubleshooting.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_projects_users.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_resources.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_upstream.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/ch_ops_user_facing.xml delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/1-IMG_4895.JPG delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.svg delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/horizon-add-project.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/horizon-user-project.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.svg delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.svg delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/os_disk_partition.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/os_physical_network.svg delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/os_physical_network_1.png delete mode 100644 doc/src/docbkx/openstack-ops/src/figures/releasecyclegrizzlydiagram.png delete mode 100644 doc/src/docbkx/openstack-ops/src/preface_ops.xml diff --git a/doc/src/docbkx/openstack-ops/locale/openstack-ops.pot b/doc/src/docbkx/openstack-ops/locale/openstack-ops.pot deleted file mode 100644 index 11e65396154..00000000000 --- a/doc/src/docbkx/openstack-ops/locale/openstack-ops.pot +++ /dev/null @@ -1,280 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 2013-03-12 14:42+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-manual-how-to-use.xml:5(title) -msgid "How to use this manual" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-manual-how-to-use.xml:6(para) -msgid "Intended Audience Conventions" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:5(title) -msgid "Diagnostics and Troubleshooting" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:6(para) -msgid "If this happens, then do this" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:10(title) -msgid "Tips, Tricks, and Traps" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:11(para) -msgid "Configuration settings that should not remain defaults Making sensible scheduler choices Figuring out how to find out what flags do" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:19(title) -msgid "Monitoring" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-diagnostic-troubleshooting.xml:20(para) -msgid "Sources of information and alerts Monitoring Hardware Monitoring the Network Monitoring the Cloud" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:5(title) -msgid "Day to Day Operations" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:6(para) -msgid "This chapter aims to describe \"A day in the life of an operator, by detailing the common tasks that every OpeStack administrator could expect to perform." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:11(title) -msgid "Watch the Queues" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:15(para) -msgid "Something!" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:12(para) -msgid "A core part of OpenStack Compute is the message queue, provided by RabbitMQ, or QPID. The queue is responsible for: " -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:18(para) -msgid "In general, if the queue has no messages this means that they are reaching their destination. One of the common signs of trouble in Compute is if there are pileups of messages for certain destinations. In cases like this, unless you are actively checking the queues, tasks can sit silently without being processed." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:26(para) -msgid "You can check the state of the queues with: " -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:33(title) -msgid "Network issues" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:34(para) -msgid "Openstack provides and relies on broad access to the network, so when trouble occurs here the issues can be wide reaching. Thankfully there are some common tools you can use to determine the location of problems." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:38(para) -msgid "Pings, traceroutes, nslookups for networking issues TCP dumps Look for pings with high latency" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:46(title) -msgid "Resource Utilisation" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:47(para) -msgid "Disk I/O - look for 100% utilization spots CPU Straces" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:55(title) -msgid "Working with Instances" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:60(para) -msgid "Instances stuck in \"build\" state" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:61(para) -msgid "Instances can't be \"ping\"ed" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:62(para) -msgid "Instances can't be accessed through a VNC console" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:56(para) -msgid "Running virtual machines is a complex business, and many different points of failure can be realised. It is worth paying attention to these common cases: " -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:68(title) -msgid "Working with Users" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:69(para) -msgid "Direct users of OpenStack's Infrastructure-as-a-Service and Object Storage capabilities are likely to be technically competent developers. You may find your Tier 1 support (if any!) relies on you more to provide user support for these cases." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:73(para) -msgid "Here are some example types of \"tickets\" generated by OpenStack users, and some tips for working the service into your support workflow" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:79(title) -msgid "Daily monitoring practices" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:80(para) -msgid "No one likes a spammy nagios, or having tail -f of a log file scroll past like the matrix. Metrics to follow with alarm settting Syslog trolling" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:87(title) -msgid "Summary of Operational Tools" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-day-to-day.xml:88(para) -msgid "Available tools modified or used in Openstack Euca Nova.conf Curl etc. Nagios" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-quick-start.xml:5(title) -msgid "Operations Quick Start" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-quick-start.xml:6(para) -msgid "Administrative starting tasks - first time operator on an OpenStack cloud, what do they need to know? New Hire Operator who needs to get up to speed quickly." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-periodic.xml:5(title) -msgid "Periodic Operations" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-periodic.xml:6(para) -msgid "Things that need to be done sometimes Cleanup of databases Rebuilding/Balancing the ring Log file rotation checks Capacity planning" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:10(title) -msgid "OpenStack Operations Manual - Red HatUbuntu" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:20(orgname) ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:29(productname) -msgid "OpenStack" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:24(year) -msgid "2012" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:25(year) -msgid "2013" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:26(holder) -msgid "OpenStack Foundation" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:28(releaseinfo) -msgid "trunk" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:30(pubdate) -msgid "2012-09-10" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:33(remark) -msgid "Copyright details are filled in by the template." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:37(para) -msgid "The OpenStack™ system has several key projects that are separate installations but can work together depending on your cloud needs: OpenStack Compute, OpenStack Object Storage, OpenStack Identity Service, and OpenStack Image Service. This manual provides operational pointers using packages available through Ubuntu 12.04.This manual provides operational pointers using packages available through Fedora 17 as well as on RHEL and derivatives through the EPEL repository. It offers suggestions for common operational practices and aims to get new operators quickly up to speed." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:58(date) -msgid "2012-07-29" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/bk_openstackopsmanual.xml:62(para) -msgid "Initial structure." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:5(title) -msgid "Operations Management Practices" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:6(para) -msgid "This chapter discusses best practices for operations management." -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:11(title) -msgid "Starting Up" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:12(para) ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:17(para) ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:29(para) ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:50(para) -msgid "Text" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:16(title) -msgid "Database Management" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:21(title) -msgid "Storage Management" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:22(para) -msgid "- volumes attached to compute instances Backups for volumes" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:28(title) -msgid "User Management" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:33(title) -msgid "Security Management" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:34(para) -msgid "Security is important!" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:38(title) -msgid "DevOps principles" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:39(para) -msgid "Dev/Ops principals and how they work in the Ops environment" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:44(title) -msgid "Migration and Upgrades" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:45(para) -msgid "Migrations are hard!" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:49(title) -msgid "Failover Planning" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:54(title) -msgid "Disaster Recovery, Business Continuity Planning" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:55(para) -msgid "DCs in flames" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:59(title) -msgid "Automation" -msgstr "" - -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:60(para) -msgid "Automation - What to automate and how to do it" -msgstr "" - -#. Put one translator per line, in the form of NAME , YEAR1, YEAR2 -#: ./doc/src/docbkx/openstack-ops/ch_ops-mgmt-practices.xml:0(None) -msgid "translator-credits" -msgstr "" - diff --git a/doc/src/docbkx/openstack-ops/pom.xml b/doc/src/docbkx/openstack-ops/pom.xml deleted file mode 100644 index f8be5526c3b..00000000000 --- a/doc/src/docbkx/openstack-ops/pom.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - 4.0.0 - - org.openstack.docs - openstack-ops-manual - 1.0.0 - jar - OpenStack Manuals - - - - local - 1 - - - - - - - - - - com.rackspace.cloud.api - clouddocs-maven-plugin - 1.8.0 - - - - generate-webhelp - - generate-webhelp - - generate-sources - - - - ${comments.enabled} - src - openstack-ops - 1 - UA-17511903-1 - - 1 - 1 - 0 - 1 - 0 - - appendix toc,title - article/appendix nop - article toc,title - book toc,title,figure,table,equation - chapter toc - part toc,title - acknowledgements toc,title - preface toc - qandadiv toc - qandaset toc - reference toc,title - section toc - set toc,title - - - target/docbkx/webhelp/${release.path.name} - openstack-ops - openstack-ops-manual-${release.path.name} - 7.44in - 9.68in - 1 - 1 - - - - cleanup - - generate-webhelp - - generate-sources - - dummy.xml - - - - - - - - - - - - - - true - src - bk_ops_guide.xml - reviewer - openstack - - - - - - - - - Rackspace Research Repositories - - true - - - - rackspace-research - Rackspace Research Repository - http://maven.research.rackspacecloud.com/content/groups/public/ - - - - - rackspace-research - Rackspace Research Repository - http://maven.research.rackspacecloud.com/content/groups/public/ - - - - - - \ No newline at end of file diff --git a/doc/src/docbkx/openstack-ops/src/acknowledgements.xml b/doc/src/docbkx/openstack-ops/src/acknowledgements.xml deleted file mode 100644 index 2f21391c59d..00000000000 --- a/doc/src/docbkx/openstack-ops/src/acknowledgements.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - -GET'> -PUT'> -POST'> -DELETE'> -]> - - Acknowledgments - The OpenStack Foundation supported the creation of this - book with plane tickets to Austin, lodging (including one - adventurous evening without power after a windstorm), and - delicious food. For about USD $10,000, we could - collaborate intensively for a week in the same room at the - Rackspace Austin office. The authors are all members of - the OpenStack Foundation, which you can join. Go to the - Foundation - web site at http://openstack.org/join. - We want to acknowledge our excellent host Rackers at - Rackspace in Austin: - - Emma Richards of Rackspace Guest Relations - took excellent care of our lunch orders and - even set aside a pile of sticky notes that had - fallen off the walls. - - - Betsy Hagemeier, a Fanatical Executive - Assistant, took care of a room reshuffle and - helped us settle in for the week. - - - The Real Estate team at Rackspace in Austin, - also known as "The Victors," were super - responsive. - - - Adam Powell in Racker IT supplied us with - bandwidth each day and second monitors for - those of us needing more screens. - - - On Wednesday night we had a fun happy hour - with the Austin OpenStack Meetup group and - Racker Katie Schmidt took great care of our - group. - - - We also had some excellent input from - outside of the room. Tim Bell from CERN gave - us feedback on the outline before we started - and reviewed it mid-week. - Sébastien Han has written excellent blogs - and generously gave his permission for re-use. - Oisin Feeley read it, made some edits, and - provided emailed feedback right when we asked. - - - We couldn't have pulled it off without so much - supportive help and encouragement. - - diff --git a/doc/src/docbkx/openstack-ops/src/app_crypt.xml b/doc/src/docbkx/openstack-ops/src/app_crypt.xml deleted file mode 100644 index d2e69cb48b0..00000000000 --- a/doc/src/docbkx/openstack-ops/src/app_crypt.xml +++ /dev/null @@ -1,511 +0,0 @@ - - - - - - - -]> - - Tales From the Cryp^H^H^H^H Cloud - - Herein lies a selection of takes from OpenStack cloud - operators. Read, and learn from their wisdom. - -
- Double VLAN - I was on-site in Kelowna, British Columbia, Canada - setting up a new OpenStack cloud. The deployment was fully - automated: Cobbler deployed the OS on the bare metal, - bootstrapped it, and Puppet took over from there. I had - run the deployment scenario so many times in practice and - took for granted that everything was working. - On my last day in Kelowna, I was in a conference call - from my hotel. In the background, I was fooling around on - the new cloud. I launched an instance and logged in. - Everything looked fine. Out of boredom, I ran ps aux and - all of the sudden the instance locked up. - Thinking it was just a one-off issue, I terminated the - instance and launched a new one. By then, the conference - call ended and I was off to the data center. - At the data center, I was finishing up some tasks and - remembered the lock-up. I logged into the new instance and - ran ps aux again. It worked. Phew. I decided to run it one - more time. It locked up. WTF. - After reproducing the problem several times, I came to - the unfortunate conclusion that this cloud did indeed have - a problem. Even worse, my time was up in Kelowna and I had - to return back to Calgary. - Where do you even begin troubleshooting something like - this? An instance just randomly locks when a command is - issued. Is it the image? Nope — it happens on all images. - Is it the compute node? Nope — all nodes. Is the instance - locked up? No! New SSH connections work just fine! - We reached out for help. A networking engineer suggested - it was an MTU issue. Great! MTU! Something to go on! - What's MTU and why would it cause a problem? - MTU is maximum transmission unit. It specifies the - maximum number of bytes that the interface accepts for - each packet. If two interfaces have two different MTUs, - bytes might get chopped off and weird things happen -- - such as random session lockups. - Not all packets have a size of 1500. Running the - ls command over SSH might only create a single - packets less than 1500 bytes. However, running a - command with heavy output, such as ps - aux requires several packets of 1500 - bytes. - - - Not all packets have a size of 1500. Running the ls - command over SSH might only create a single packets - less than 1500 bytes. However, running a command with - heavy output, such as ps aux - requires several packets of 1500 bytes. - - OK, so where is the MTU issue coming from? Why haven't - we seen this in any other deployment? What's new in this - situation? Well, new data center, new uplink, new - switches, new model of switches, new servers, first time - using this model of servers… so, basically everything was - new. Wonderful. We toyed around with raising the MTU at - various areas: the switches, the NICs on the compute - nodes, the virtual NICs in the instances, we even had the - data center raise the MTU for our uplink interface. Some - changes worked, some didn't. This line of troubleshooting - didn't feel right, though. We shouldn't have to be - changing the MTU in these areas. - As a last resort, our network admin (Alvaro) and myself - sat down with four terminal windows, a pencil, and a piece - of paper. In one window, we ran ping. In the second - window, we ran tcpdump on the cloud controller. In the - third, tcpdump on the compute node. And the forth had - tcpdump on the instance. For background, this cloud was a - multi-node, non-multi-host setup. - One cloud controller acted as a gateway to all compute - nodes. VlanManager was used for the network config. This - means that the cloud controller and all compute nodes had - a different VLAN for each OpenStack project. We used the - -s option of ping to change the packet size. We watched as - sometimes packets would fully return, sometimes they'd - only make it out and never back in, and sometimes the - packets would stop at a random point. We changed tcpdump - to start displaying the hex dump of the packet. We pinged - between every combination of outside, controller, compute, - and instance. - Finally, Alvaro noticed something. When a packet from - the outside hits the cloud controller, it should not be - configured with a VLAN. We verified this as true. When the - packet went from the cloud controller to the compute node, - it should only have a VLAN if it was destined for an - instance. This was still true. When the ping reply was - sent from the instance, it should be in a VLAN. True. When - it came back to the cloud controller and on its way out to - the public internet, it should no longer have a VLAN. - False. Uh oh. It looked as though the VLAN part of the - packet was not being removed. - That made no sense. - While bouncing this idea around in our heads, I was - randomly typing commands on the compute node: - $ ip a -… -10: vlan100@vlan20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br100 state UP -… - "Hey Alvaro, can you run a VLAN on top of a - VLAN?" - "If you did, you'd add an extra 4 bytes to the - packet…" - Then it all made sense… - $ grep vlan_interface /etc/nova/nova.conf -vlan_interface=vlan20 - In nova.conf, vlan_interface - specifies what interface OpenStack should attach all VLANs - to. The correct setting should have been: - vlan_interface=bond0. - As this would be the server's bonded NIC. - vlan20 is the VLAN that the data center gave us for - outgoing public internet access. It's a correct VLAN and - is also attached to bond0. - By mistake, I configured OpenStack to attach all tenant - VLANs to vlan20 instead of bond0 thereby stacking one VLAN - on top of another which then added an extra 4 bytes to - each packet which cause a packet of 1504 bytes to be sent - out which would cause problems when it arrived at an - interface that only accepted 1500! - As soon as this setting was fixed, everything - worked. -
-
- "The Issue" - At the end of August 2012, a post-secondary school in - Alberta, Canada migrated its infrastructure to an - OpenStack cloud. As luck would have it, within the first - day or two of it running, one of their servers just - disappeared from the network. Blip. Gone. - After restarting the instance, everything was back up - and running. We reviewed the logs and saw that at some - point, network communication stopped and then everything - went idle. We chalked this up to a random - occurrence. - A few nights later, it happened again. - We reviewed both sets of logs. The one thing that stood - out the most was DHCP. OpenStack, by default, sets DHCP - leases for one minute. This means that every instance - contacts the cloud controller (DHCP server) to renew its - fixed IP. For some reason, this instance could not renew - its IP. We correlated the instance's logs with the logs on - the cloud controller and put together a - conversation: - - - Instance tries to renew IP. - - - Cloud controller receives the renewal request - and sends a response. - - - Instance "ignores" the response and re-sends the - renewal request. - - - Cloud controller receives the second request and - sends a new response. - - - Instance begins sending a renewal request to - 255.255.255.255 since it hasn't - heard back from the cloud controller. - - - The cloud controller receives the - 255.255.255.255 request and sends - a third response. - - - The instance finally gives up. - - - With this information in hand, we were sure that the - problem had to do with DHCP. We thought that for some - reason, the instance wasn't getting a new IP address and - with no IP, it shut itself off from the network. - A quick Google search turned up this: DHCP lease errors in VLAN mode - (https://lists.launchpad.net/openstack/msg11696.html) - which further supported our DHCP theory. - An initial idea was to just increase the lease time. If - the instance only renewed once every week, the chances of - this problem happening would be tremendously smaller than - every minute. This didn't solve the problem, though. It - was just covering the problem up. - We decided to have tcpdump run on this - instance and see if we could catch it in action again. - Sure enough, we did. - The tcpdump looked very, very weird. In - short, it looked as though network communication stopped - before the instance tried to renew its IP. Since there is - so much DHCP chatter from a one minute lease, it's very - hard to confirm it, but even with only milliseconds - difference between packets, if one packet arrives first, - it arrived first, and if that packet reported network - issues, then it had to have happened before DHCP. - Additionally, this instance in question was responsible - for a very, very large backup job each night. While "The - Issue" (as we were now calling it) didn't happen exactly - when the backup happened, it was close enough (a few - hours) that we couldn't ignore it. - Further days go by and we catch The Issue in action more - and more. We find that dhclient is not running after The - Issue happens. Now we're back to thinking it's a DHCP - issue. Running /etc/init.d/networking restart - brings everything back up and running. - Ever have one of those days where all of the sudden you - get the Google results you were looking for? Well, that's - what happened here. I was looking for information on - dhclient and why it dies when it can't renew its lease and - all of the sudden I found a bunch of OpenStack and dnsmasq - discussions that were identical to the problem we were - seeing! - - Problem with Heavy Network IO and Dnsmasq - (http://www.gossamer-threads.com/lists/openstack/operators/18197) - - instances loosing IP address while running, due to No - DHCPOFFER - (http://www.gossamer-threads.com/lists/openstack/dev/14696) - Seriously, Google. - This bug report was the key to everything: - - KVM images lose connectivity with bridged - network - (https://bugs.launchpad.net/ubuntu/+source/qemu-kvm/+bug/997978) - It was funny to read the report. It was full of people - who had some strange network problem but didn't quite - explain it in the same way. - So it was a qemu/kvm bug. - At the same time of finding the bug report, a co-worker - was able to successfully reproduce The Issue! How? He used - iperf to spew a ton of bandwidth at an instance. Within 30 - minutes, the instance just disappeared from the - network. - Armed with a patched qemu and a way to reproduce, we set - out to see if we've finally solved The Issue. After 48 - hours straight of hammering the instance with bandwidth, - we were confident. The rest is history. You can search the - bug report for "joe" to find my comments and actual - tests. -
-
- Disappearing Images - At the end of 2012, Cybera (a nonprofit with a mandate - to oversee the development of cyberinfrastructure in - Alberta, Canada) deployed an updated OpenStack cloud for - their DAIR project - (http://www.canarie.ca/en/dair-program/about). A few days - into production, a compute node locks up. Upon rebooting - the node, I checked to see what instances were hosted on - that node so I could boot them on behalf of the customer. - Luckily, only one instance. - The nova reboot command wasn't working, so - I used virsh, but it immediately came back - with an error saying it was unable to find the backing - disk. In this case, the backing disk is the Glance image - that is copied to - /var/lib/nova/instances/_base when the - image is used for the first time. Why couldn't it find it? - I checked the directory and sure enough it was - gone. - I reviewed the nova database and saw the - instance's entry in the nova.instances table. - The image that the instance was using matched what virsh - was reporting, so no inconsistency there. - I checked Glance and noticed that this image was a - snapshot that the user created. At least that was good - news — this user would have been the only user - affected. - Finally, I checked StackTach and reviewed the user's - events. They had created and deleted several snapshots - — most likely experimenting. Although the timestamps - didn't match up, my conclusion was that they launched - their instance and then deleted the snapshot and it was - somehow removed from - /var/lib/nova/instances/_base. None of - that made sense, but it was the best I could come up - with. - It turns out the reason that this compute node locked up - was a hardware issue. We removed it from the DAIR cloud - and called Dell to have it serviced. Dell arrived and - began working. Somehow or another (or a fat finger), a - different compute node was bumped and rebooted. - Great. - When this node fully booted, I ran through the same - scenario of seeing what instances were running so I could - turn them back on. There were a total of four. Three - booted and one gave an error. It was the same error as - before: unable to find the backing disk. Seriously, - what? - Again, it turns out that the image was a snapshot. The - three other instances that successfully started were - standard cloud images. Was it a problem with snapshots? - That didn't make sense. - A note about DAIR's architecture: - /var/lib/nova/instances is a shared NFS - mount. This means that all compute nodes have access to - it, which includes the _base directory. - Another centralized area is /var/log/rsyslog - on the cloud controller. This directory collects all - OpenStack logs from all compute nodes. I wondered if there - were any entries for the file that virsh is - reporting: - - dair-ua-c03/nova.log:Dec 19 12:10:59 dair-ua-c03 - 2012-12-19 12:10:59 INFO nova.virt.libvirt.imagecache - [-] Removing base file: - /var/lib/nova/instances/_base/7b4783508212f5d242cbf9ff56fb8d33b4ce6166_10 - - Ah-hah! So OpenStack was deleting it. But why? - A feature was introduced in Essex to periodically check - and see if there were any _base files not in use. If there - were, Nova would delete them. This idea sounds innocent - enough and has some good qualities to it. But how did this - feature end up turned on? It was disabled by default in - Essex. As it should be. It was decided to be turned on in Folsom - (https://bugs.launchpad.net/nova/+bug/1029674). I cannot - emphasize enough that: - - Actions which delete things should not be - enabled by default. - - Disk space is cheap these days. Data recovery is - not. - Secondly, DAIR's shared - /var/lib/nova/instances directory - contributed to the problem. Since all compute nodes have - access to this directory, all compute nodes periodically - review the _base directory. If there is only one instance - using an image, and the node that the instance is on is - down for a few minutes, it won't be able to mark the image - as still in use. Therefore, the image seems like it's not - in use and is deleted. When the compute node comes back - online, the instance hosted on that node is unable to - start. -
-
- The Valentine's Day Compute Node Massacre - Although the title of this story is much more dramatic - than the actual event, I don't think, or hope, that I'll - have the opportunity to use "Valentine's Day Massacre" - again in a title. - This past Valentine's Day, I received an alert that a - compute node was no longer available in the cloud - — meaning, - $ nova-manage service list - showed this particular node with a status of - XXX. - I logged into the cloud controller and was able to both - ping and SSH into the problematic compute node which - seemed very odd. Usually if I receive this type of alert, - the compute node has totally locked up and would be - inaccessible. - After a few minutes of troubleshooting, I saw the - following details: - - - A user recently tried launching a CentOS - instance on that node - - - This user was the only user on the node (new - node) - - - The load shot up to 8 right before I received - the alert - - - The bonded 10gb network device (bond0) was in a - DOWN state - - - The 1gb NIC was still alive and active - - - I looked at the status of both NICs in the bonded pair - and saw that neither was able to communicate with the - switch port. Seeing as how each NIC in the bond is - connected to a separate switch, I thought that the chance - of a switch port dying on each switch at the same time was - quite improbable. I concluded that the 10gb dual port NIC - had died and needed replaced. I created a ticket for the - hardware support department at the data center where the - node was hosted. I felt lucky that this was a new node and - no one else was hosted on it yet. - An hour later I received the same alert, but for another - compute node. Crap. OK, now there's definitely a problem - going on. Just like the original node, I was able to log - in by SSH. The bond0 NIC was DOWN but the 1gb NIC was - active. - And the best part: the same user had just tried creating - a CentOS instance. Wat? - I was totally confused at this point, so I texted our - network admin to see if he was available to help. He - logged in to both switches and immediately saw the - problem: the switches detected spanning tree packets - coming from the two compute nodes and immediately shut the - ports down to prevent spanning tree loops: - Feb 15 01:40:18 SW-1 Stp: %SPANTREE-4-BLOCK_BPDUGUARD: Received BPDU packet on Port-Channel35 with BPDU guard enabled. Disabling interface. (source mac fa:16:3e:24:e7:22) -Feb 15 01:40:18 SW-1 Ebra: %ETH-4-ERRDISABLE: bpduguard error detected on Port-Channel35. -Feb 15 01:40:18 SW-1 Mlag: %MLAG-4-INTF_INACTIVE_LOCAL: Local interface Port-Channel35 is link down. MLAG 35 is inactive. -Feb 15 01:40:18 SW-1 Ebra: %LINEPROTO-5-UPDOWN: Line protocol on Interface Port-Channel35 (Server35), changed state to down -Feb 15 01:40:19 SW-1 Stp: %SPANTREE-6-INTERFACE_DEL: Interface Port-Channel35 has been removed from instance MST0 -Feb 15 01:40:19 SW-1 Ebra: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet35 (Server35), changed state to down - He re-enabled the switch ports and the two compute nodes - immediately came back to life. - Unfortunately, this story has an open ending... we're - still looking into why the CentOS image was sending out - spanning tree packets. Further, we're researching a proper - way on how to mitigate this from happening. It's a bigger - issue than one might think. While it's extremely important - for switches to prevent spanning tree loops, it's very - problematic to have an entire compute node be cut from the - network when this happens. If a compute node is hosting - 100 instances and one of them sends a spanning tree - packet, that instance has effectively DDOS'd the other 99 - instances. - This is an ongoing and hot topic in networking circles - — especially with the raise of virtualization and virtual - switches. -
-
- Down the Rabbit Hole - Users being able to retrieve console logs from running - instances is a boon for support — many times they can - figure out what's going on inside their instance and fix - what's going on without bothering you. Unfortunately, - sometimes overzealous logging of failures can cause - problems of its own. - A report came in: VMs were launching slowly, or not at - all. Cue the standard checks — nothing on the nagios, but - there was a spike in network towards the current master of - our RabbitMQ cluster. Investigation started, but soon the - other parts of the queue cluster were leaking memory like - a sieve. Then the alert came in — the master rabbit server - went down. Connections failed over to the slave. - At that time, our control services were hosted by - another team and we didn't have much debugging information - to determine what was going on with the master, and - couldn't reboot it. That team noted that it failed without - alert, but managed to reboot it. After an hour, the - cluster had returned to its normal state and we went home - for the day. - Continuing the diagnosis the next morning was kick - started by another identical failure. We quickly got the - message queue running again, and tried to work out why - Rabbit was suffering from so much network traffic. - Enabling debug logging on nova-api quickly brought - understanding. A tail -f - /var/log/nova/nova-api.log was scrolling by - faster than we'd ever seen before. CTRL+C on that and we - could plainly see the contents of a system log spewing - failures over and over again - a system log from one of - our users' instances. - After finding the instance ID we headed over to - /var/lib/nova/instances to find the - console.log: - adm@cc12:/var/lib/nova/instances/instance-00000e05# wc -l console.log - 92890453 console.log - adm@cc12:/var/lib/nova/instances/instance-00000e05# ls -sh console.log - 5.5G console.log - Sure enough, the user had been periodically refreshing - the console log page on the dashboard and the 5G file was - traversing the rabbit cluster to get to the - dashboard. - We called them and asked them to stop for a while, and - they were happy to abandon the horribly broken VM. After - that, we started monitoring the size of console - logs. - To this day, the issue - (https://bugs.launchpad.net/nova/+bug/832507) doesn't have - a permanent resolution, but we look forward to the - discussion at the next summit. -
-
diff --git a/doc/src/docbkx/openstack-ops/src/app_usecases.xml b/doc/src/docbkx/openstack-ops/src/app_usecases.xml deleted file mode 100644 index 3dc07edabf6..00000000000 --- a/doc/src/docbkx/openstack-ops/src/app_usecases.xml +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - -]> - - - Use Cases - This section contains a small selection of use cases from - the community with more technical detail than usual. Further - examples can be found on the OpenStack Website - (https://www.openstack.org/user-stories/) -
- NeCTAR - Who uses it: Researchers from the Australian publicly - funded research sector. Use is across a wide variety of - disciplines, with the purpose of instances being from - running simple web servers to using hundreds of cores for - high throughput computing. -
- Deployment - Using OpenStack Compute Cells, the NeCTAR Cloud - spans eight sites with approximately 4,000 cores per - site. - Each site runs a different configuration, as - resource cells in an OpenStack - Compute cells setup. Some sites span multiple data - centers, some use off compute node storage with a - shared file system and some use on compute node - storage with a non-shared file system. Each site - deploys the Image Service with an Object Storage - back-end. A central Identity Service, Dashboard and - Compute API Service is used. Login to the Dashboard - triggers a SAML login with Shibboleth, that creates an - account in the Identity - Service with an SQL back-end. - Compute nodes have 24 to 48 cores, with at least 4 - GB of RAM per core and approximately 40 GB of - ephemeral storage per core. - All sites are based on Ubuntu 12.04 with KVM as the - hypervisor. The OpenStack version in use is typically - the current stable version, with 5 to 10% back ported - code from trunk and modifications. -
-
- Resources - - - - OpenStack.org Case Study - (https://www.openstack.org/user-stories/nectar/) - - - - NeCTAR-RC GitHub - (https://github.com/NeCTAR-RC/) - - - - NeCTAR Website - (https://www.nectar.org.au/) - - -
-
-
- MIT CSAIL - Who uses it: Researchers from the MIT Computer Science - and Artificial Intelligence Lab. -
- Deployment - The CSAIL cloud is currently 64 physical nodes with - a total of 768 physical cores and 3,456 GB of RAM. - Persistent data storage is largely outside of the - cloud on NFS with cloud resources focused on compute - resources. There are 65 users in 23 projects with - typical capacity utilization nearing 90% we are - looking to expand. - The software stack is Ubuntu 12.04 LTS with - OpenStack Folsom from the Ubuntu Cloud Archive. KVM is - the hypervisor, deployed using FAI - (http://fai-project.org/) and Puppet for configuration - management. The FAI and Puppet combination is used lab - wide, not only for OpenStack. There is a single cloud - controller node, with the remainder of the server - hardware dedicated to compute nodes. Due to the - compute intensive nature of the use case, the ratio of - physical CPU and RAM to virtual is 1:1 in nova.conf. - Although hyper-threading is enabled so, given the way - Linux counts CPUs, this is actually 2:1 in - practice. - On the network side, physical systems have two - network interfaces and a separate management card for - IPMI management. The OpenStack network service uses - multi-host networking and the FlatDHCP. -
-
- -
- DAIR - Who uses it: DAIR is an integrated virtual environment - that leverages the CANARIE network to develop and test new - information communication technology (ICT) and other - digital technologies. It combines such digital - infrastructure as advanced networking, and cloud computing - and storage to create an environment for develop and test - of innovative ICT applications, protocols and services, - perform at-scale experimentation for deployment, and - facilitate a faster time to market. -
- Deployment - DAIR is hosted at two different data centres across - Canada: one in Alberta and the other in Quebec. It - consists of a cloud controller at each location, - however, one is designated as the "master" controller - that is in charge of central authentication and - quotas. This is done through custom scripts and light - modifications to OpenStack. DAIR is currently running - Folsom. - For Object Storage, each region has a Swift - environment. - A NetApp appliance is used in each region for both - block storage and instance storage. There are future - plans to move the instances off of the NetApp - appliance and onto a distributed file system such as - Ceph or GlusterFS. - VlanManager is used extensively for network - management. All servers have two bonded 10gb NICs that - are connected to two redundant switches. DAIR is set - up to use single-node networking where the cloud - controller is the gateway for all instances on all - compute nodes. Internal OpenStack traffic (for - example, storage traffic) does not go through the - cloud controller. -
-
- Resources - - - - DAIR Homepage - (http://www.canarie.ca/en/dair-program/about) - - -
-
-
- CERN - Who uses it: Researchers at CERN (European Organization - for Nuclear Research) conducting high-energy physics - research. -
- Deployment - The environment is largely based on Scientific Linux - 6, which is Red Hat compatible. We use KVM as our - primary hypervisor although tests are ongoing with - Hyper-V on Windows Server 2008. - We use the Puppet Labs OpenStack modules to - configure Compute, Image Service, Identity Service and - Dashboard. Puppet is used widely for instance - configuration and Foreman as a GUI for reporting and - instance provisioning. - Users and Groups are managed through Active - Directory and imported into the Identity Service using - LDAP. CLIs are available for Nova and Euca2ools to do - this. - CERN is currently running around 250 Nova Compute - nodes with approximately 1,000 instances. -
-
- Resources - - - - San Diego 2012 - Summit (http://www.slideshare.net/noggin143/20121017-openstack-accelerating-science) - - - - Review - of CERN Data Centre - Infrastructure (http://cern.ch/go/N8wp) - - - - CERN Cloud Infrastructure User - Guide (http://information-technology.web.cern.ch/book/cern-private-cloud-user-guide) - - -
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/bk_ops_guide.xml b/doc/src/docbkx/openstack-ops/src/bk_ops_guide.xml deleted file mode 100644 index f2bfbb92c47..00000000000 --- a/doc/src/docbkx/openstack-ops/src/bk_ops_guide.xml +++ /dev/null @@ -1,3094 +0,0 @@ - - - - - - - -]> - - OpenStack Operations Guide - - OpenStack Ops Guide - - - - - - - - OpenStack Foundation - - - - - 2013 - OpenStack Foundation - - OpenStack - - - - - Copyright details are filled in by the - template. - - - - This book provides information about designing and - operating OpenStack clouds. - - - - - 2013-05-13 - - - - Updated description of availability zones. - - - - - 2013-04-02 - - - - Fixes to ensure samples fit in page - size and notes are formatted. - - - - - - 2013-03-22 - - - - Stopped chunking in HTML - output. - - - - - - - - 2013-03-20 - - - - Editorial changes. - - - Added glossterm - tags to glossary terms. - - - Cleaned up formatting in code - examples. - - - Removed future tense. - - - - - - - - 2013-03-11 - - - - Moved files to OpenStack github - repository. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Glossary - Use this glossary to get definitions of - OpenStack-related words and phrases. - To add to this glossary, fork the openstack/openstack-manuals repository on - github.com and update the source files through the - OpenStack contribution process. - - A - - account - - The swift context of an account, or a user - account from an identity service such as - Active Directory, /etc/passwd, OpenLDAP, - keystone, and so on. - - - - account auditor - - Checks for missing replicas, incorrect, and - corrupted objects in a specified swift account - by running queries against the back-end SQLite - database. - - - - account database - - An SQLite database that contains swift - accounts and related metadata and is accessed - by the accounts server. Alternately, the - keystone back-end which contains - accounts. - - - - account reaper - - A swift worker that scans for and deletes - account databases that are marked for deletion - on an account server. - - - - account server - - Lists containers in swift and stores - container information in the account - database. - - - - account service - - Component of swift that provides account - services such as list, create, modify, and - audit. Do not confuse with keystone, OpenLDAP, - or similar user account services. - - - - Active Directory - - Authentication and Identity Service by - Microsoft, based on LDAP. Supported in - OpenStack. - - - - address pool - - A group of fixed and/or floating IP - addresses that are assigned to a nova project - and can be used by or assigned to the VM - instances in a project. - - - - admin API - - A subset of API calls that are accessible to - authorized administrators and are generally - not accessible to end users or the public - internet, can exist as a separate service - (keystone) or can be a subset of another API - (nova). - - - - Amazon Kernel Image (AKI) - - Both a VM container format and a VM disk - format. Supported by glance. - - - - Amazon Machine Image (AMI) - - Both a VM container format and a VM disk - format. Supported by glance. - - - - Amazon Ramdisk Image (ARI) - - Both a VM container format and a VM disk - format. Supported by glance. - - - - Apache - - The most common web server software - currently used on the Internet, known as - HTTPd. - - - - Apache License 2.0 - - All OpenStack core projects are provided - under the terms of the Apache License 2.0 - license. - - - - API endpoint - - The daemon, worker, or service that a client - communicates with to access an API. In - OpenStack, API endpoints can provide services - such as authentication, adding images, booting - virtual machines, and attaching - volumes. - - - - API extension - - A feature of nova and quantum that allows - custom modules to extend the core APIs. - - - - API extension plug-in - - Alternative term for a quantum plug-in or - quantum API extension. - - - - API server - - Any node running a daemon or worker that - provides an API endpoint. - - - - API version - - In OpenStack, a the API version for a - project is part of the URL. For example, - example.com/nova/v1/foobar. - - - - Application Programming Interface - (API) - - A collection of specifications used to - access a service, application, or program. - Includes service calls, required parameters - for each call, and the expected return - values. - - - - arptables - - Used along with iptables, ebtables, and - ip6tables in nova to provide firewall - services. - - - - Asynchronous JavaScript and XML - (AJAX) - - A group of interrelated web development - techniques used on the client-side to create - asynchronous web applications. Used - extensively in horizon. - - - - attachment (network) - - Association of an interface ID to a logical - port. Plugs an interface into a port. - - - - auditor - - A worker process that verifies the integrity - of swift objects, containers, and accounts. - Auditors is the collective term for the swift - account auditor, container auditor, and object - auditor. - - - - Austin - - Project name for the initial release of - OpenStack. - - - - authentication - - The process that confirms that the user, - process, or client is really who they say they - are through private key, secret token, - password, fingerprint, or similar method. - Abbreviated as AuthN. - - - - authentication token - - A string of text provided to the client - after authentication. Must be provided by the - user or process in subsequent requests to the - API endpoint. - - - - authorization - - The act of verifying that a user, process, - or client is authorized to perform an action, - such as delete a swift object, list a swift - container, start a nova VM, reset a password, - and so on. Abbreviate as AuthZ. - - - - availability zone - - A segregated area of a cloud - deployment. - - - - - B - - back-end catalog - - The storage method used by the keystone - catalog service to store and retrieve - information about API endpoints that are - available to the client. Examples include a - SQL database, LDAP database, or KVS - back-end. - - - - back-end store - - The persistent data store used that glance - uses to retrieve and store VM images. Options - include swift, local file system, S3, and - HTTP. - - - - bare - - A glance container format that indicates - that no container exists for the VM - image. - - - - Bexar - - A grouped release of projects related to - OpenStack that came out in February of 2011. - It included Compute (nova) and Object Storage - (swift) only. - - - - block device - - A device that moves data in the form of - blocks. These device nodes interface the - devices, such as hard disks, CD-ROM drives, - flash drives, and other addressable regions of - memory. - - - - block migration - - A method of VM live migration used by KVM to - evacuate instances from one host to another - with very little downtime during a - user-initiated switch-over. Does not require - shared storage. Supported by nova. - - - - bootable disk image - - A type of VM image that exists as a single, - bootable file. - - - - builder file - - Contains configuration information for a - swift ring, and is used to re-configure the - ring or to recreate it from scratch after a - serious failure. - - - - - -   - - - - - C - - cache pruner - - An executable program that is used to keep a - glance VM image cache at or below its - configured maximum size. - - - - Cactus - - An OpenStack grouped release of projects - that came out in the spring of 2011. It - included Compute (nova), Object Storage - (swift), and the Image service - (glance). - - - - capability - - Defines resources for a cell, including CPU, - storage, and networking. Can apply to the - specific services within a cell or a whole - cell. - - - - capacity cache - - A table within the nova back-end database - that contains the current workload, amount of - free RAM, number of VMs running on each host. - Used to determine on which VM a host - starts. - - - - capacity updater - - A notification driver that monitors VM - instances and updates the capacity cache as - needed. - - - - catalog - - Contains a list of available API endpoints - to a user after they authenticate to - keystone. - - - - catalog service - - A keystone service that provides a list of - available API endpoints to a user after they - authenticate to keystone. - - - - ceilometer - - An incubated project that provides metering - and billing facilities for OpenStack. - - - - cell - - Provides logical partitioning of nova - resources in a child and parent relationship. - Requests are passed from parent cells to child - cells if the parent cannot provide the - requested resource. - - - - cell forwarding - - A nova option that allows parent cells to - pass resource requests to child cells if the - parent cannot provide the requested - resource. - - - - cell manager - - The nova component that contains a list of - the current capabilities of each host within - the cell and routes requests as - appropriate. - - - - Ceph - - Massively scalable distributed storage - system that consists of an object store, block - store, and POSIX-compatible distributed file - system. Compatible with OpenStack. - - - - CephFS - - The POSIX-compliant file system provided by - Ceph. - - - - certificate authority - - A simple certificate authority provided by - nova for cloudpipe VPNs and VM image - decryption. - - - - chance scheduler - - A scheduling method used by nova that - randomly chooses an available host from the - pool. - - - - changes-since - - A nova API parameter that allows you to - download changes to the requested item since - your last request, instead of downloading a - new, fresh set of data and comparing it - against the old data. - - - - Chef - - A configuration management tool that - supports OpenStack. - - - - child cell - - If a requested resource such as CPU time, - disk storage, or memory is not available in - the parent cell, the request is forwarded to - its associated child cells. If the child cell - can fulfill the request, it does. Otherwise, - it attempts to pass the request to any of its - children. - - - - cinder - - The OpenStack Block Storage service that - maintains the block devices that can be - attached to virtual machine instances. - - - - cloud architect - - A person who plans, designs, and oversees - the creation of clouds. - - - - cloud controller node - - A node that runs network, volume, API, - scheduler and image services. Each service may - be broken out into separate nodes for - scalability or availability. - - - - cloud-init - - A package commonly installed in VM images - that performs initialization of an instance - after boot using information that it retrieves - from the metadata service such as the SSH - public key and user data. - - - - cloudpipe - - A service in nova used to create VPNs on a - per-project basis. - - - - cloudpipe image - - A pre-made VM image that serves as a - cloudpipe server. Essentially, OpenVPN running - on Linux. - - - - command filter - - Lists allowed commands within the nova - rootwrap facility. - - - - community project - - A project that is not officially endorsed by - the OpenStack Foundation. If the project is - successful enough, it might be elevated to an - incubated project and then to a core project, - or it might be merged with the main code - trunk. - - - - Compute API - - The nova-api daemon that provides access to - the nova services. Can also communicate with - some outside APIs such as the Amazons EC2 - API. - - - - Compute API extension - - Alternative term for a nova API - extension. - - - - compute controller - - The nova component that chooses suitable - hosts on which to start VM instances. - - - - compute node - - A node that runs the nova-compute daemon and - the virtual machine instances. - - - - compute service - - Alternative term for the nova component that - manages VMs. - - - - concatenated object - - A segmented large object within swift that - is put back together again and then sent to - the client. - - - - consistency window - - The amount of time it takes for a new swift - object to become accessible to all - clients. - - - - console log - - Contains the output from a Linux VM console - in nova. - - - - container - - Used to organize and store objects within - swift, similar to the concept as a Linux - directory but cannot be nested. Alternative - term for a glance container format. - - - - container auditor - - Checks for missing replicas or incorrect - objects in the specified swift containers - through queries to the SQLite back-end - database. - - - - container database - - A SQLite database that contains swift - containers and related metadata and is - accessed by the container server - - - - container format - - The "envelope" used by glance to store a VM - image and its associated metadata, such as - machine state, OS disk size, and so on. - - - - container server - - Component of swift that manages - containers. - - - - container service - - The swift component that provides container - services, such as create, delete, list, and so - on. - - - - controller node - - Alternative term for a cloud controller - node. - - - - core API - - Depending on context, the core API is either - the OpenStack API or the main API of a - specific core project, such as nova, quantum, - glance, and so on. - - - - core project - - An official OpenStack project. Currently - consists of Compute (nova), Object Storage - (swift), Image Service (glance), Identity - (keystone), Dashboard (horizon), Networking - (quantum), and Volume (cinder). - - - - credentials - - Data that is only known to or accessible by - a user that is used to verify the user is who - they say they are and presented to the server - during authentication. Examples include a - password, secret key, digital certificate, - fingerprint, and so on. - - - - Crowbar - - An open source community project by Dell - that aims to provide all necessary services to - quickly deploy clouds. - - - - current workload - - An element of the nova capacity cache that - is calculated based on the number of build, - snapshot, migrate, and resize operations - currently in progress on a given host. - - - - customization module - - A user-created Python module that is loaded - by horizon to change the look and feel of the - dashboard. - - - - - -   - - - - - D - - dashboard - - The web-based management interface for - OpenStack. An alternative name for - horizon. - - - - database replicator - - The component of swift that copies changes - in the account, container, and object - databases to other nodes. - - - - default panel - - The panel that is displayed when a user - accesses the horizon dashboard. - - - - default tenant - - New users are assigned to this keystone - tenant if no tenant is specified when a user - is created. - - - - default token - - A keystone token that is not associated with - a specific tenant and is exchanged for a - scoped token. - - - - delayed delete - - An option within glance so that rather than - immediately delete an image, it is deleted - after a pre-defined number of seconds. - - - - delivery mode - - Setting for the nova RabbitMQ message - delivery mode, can be set to either transient - or persistent. - - - - device - - In the context of swift this refers to the - underlying storage device. - - - - device ID - - Maps swift partitions to physical storage - devices. - - - - device weight - - Used to distribute the partitions among - swift devices. The distribution is usually - proportional to the storage capacity of the - device. - - - - DevStack - - Community project that uses shell scripts to - quickly deploy complete OpenStack development - environments. - - - - Diablo - - A grouped release of projects related to - OpenStack that came out in the fall of 2011, - the fourth release of OpenStack. It included - Compute (nova 2011.3), Object Storage (swift - 1.4.3), and the Image service (glance). - - - - disk format - - The underlying format that a disk image for - a VM is stored as within the glance back-end - store. For example, AMI, ISO, QCOW2, VMDK, and - so on. - - - - dispersion - - In swift, tools to test and ensure - dispersion of objects and containers to ensure - fault tolerance. - - - - Django - - A web framework used extensively in - horizon. - - - - dnsmasq - - Daemon that provides DNS, DHCP, BOOTP, and - TFTP services, used by the nova VLAN manager - and FlatDHCP manager. - - - - DNS record - - A record that specifies information about a - particular domain and belongs to the - domain. - - - - Dynamic Host Configuration Protocol - (DHCP) - - A method to automatically configure - networking for a host at boot time. Provided - by both quantum and nova. - - - - - E - - ebtables - - Used in nova along with arptables, iptables, - and ip6tables to create firewalls and to - ensure isolation of network - communications. - - - - EC2 - - The Amazon Elastic Compute Cloud, a public - cloud run by Amazon that provides similar - functionality to nova. - - - - EC2 access key - - Used along with an EC2 secret key to access - the nova EC2 API. - - - - EC2 API - - OpenStack supports accessing the Amazon EC2 - API through nova. - - - - EC2 Compatibility API - - A nova component that allows OpenStack to - communicate with Amazon EC2 - - - - EC2 secret key - - Used along with an EC2 access key when - communicating with the nova EC2 API, is used - to digitally sign each request. - - - - Elastic Block Storage (EBS) - - The Amazon commercial block storage product, - similar to cinder. - - - - endpoint - - See API endpoint. - - - - endpoint registry - - Alternative term for a keystone - catalog. - - - - endpoint template - - A list of URL and port number endpoints that - indicate where a service, such as object - storage, compute, identity, and so on, can be - accessed. - - - - entity - - Any piece of hardware or software that wants - to connect to the network services provided by - quantum, the Network Connectivity service. An - entity can make use of quantum by implementing - a VIF. - - - - ephemeral storage - - A storage volume attached to a virtual - machine instance that does not persist after - the instance is terminated. - - - - Essex - - A grouped release of projects related to - OpenStack that came out in April 2012, the - fifth release of OpenStack. It included - Compute (nova 2012.1), Object Storage (swift - 1.4.8), Image (glance), Identity (keystone), - and Dashboard (horizon). - - - - ESX - - An OpenStack-supported hypervisor, owned by - VMware. - - - - ESXi - - An OpenStack-supported hypervisor, owned by - VMware. - - - - ETag - - MD5 hash of an object within swift, used to - ensure data integrity. - - - - euca2ools - - A collection of command line tools for - administering VMs, most are compatible with - OpenStack. - - - - evacuate - - The process of migrating one or all virtual - machine (VM) instances from one host to - another, compatible with both shared storage - live migration and block migration. - - - - extension - - Alternative term for a nova API extension or - plug-in. In the context of keystone this is a - call that is specific to the implementation, - such as adding support for OpenID. - - - - extra specs - - Additional requirements that a user can - specify when requesting a new instance, - examples include a minimum amount of network - bandwidth or a GPU. - - - - - F - - FakeLDAP - - An easy method to create a local LDAP - directory for testing keystone and nova. - Requires Redis. - - - - fill-first scheduler - - The nova scheduling method that attempts to - fill a host with VMs rather than starting new - VMs on a variety of hosts. - - - - filter - - The step of the nova scheduling process - where hosts that cannot run the VMs are - eliminated and are not chosen. - - - - firewall - - Used to restrict communications between - hosts and/or nodes, implemented in nova using - iptables, arptables, ip6tables and - etables. - - - - Fixed IP address - - An IP address that is associated with the - same instance each time that instance boots, - generally not accessible to end users or the - public internet, used for management of the - instance. - - - - FlatDHCP Manager - - A nova networking manager that provides a - single Layer 2 domain for all subnets in the - OpenStack cloud. Provides a single DHCP server - for each instance of nova-network to assign - and manage IP addresses for all - instances. - - - - Flat Manager - - The nova component that gives IP addresses - to authorized nodes and assumes DHCP, DNS, and - routing configuration and services are - provided by something else. - - - - flat mode injection - - A nova networking method where the OS - network configuration information is injected - into the VM (VM) image before the instance - starts. - - - - flat network - - A nova network configuration where all of - the instances have IP addresses on the same - subnet. Flat networks do not use VLANs. - - - - flavor - - Describes the parameters of the various - virtual machine images that are available to - users, includes parameters such as CPU, - storage, and memory. Also known as instance - type. - - - - flavor ID - - UUID for each nova or glance VM flavor or - instance type. - - - - Floating IP address - - An IP address that a nova project can - associate with a VM so the instance has the - same public IP address each time that it - boots. You create a pool of floating IP - addresses and assign them to instances as they - are launched to maintain a consistent IP - address for maintaining DNS assignment. - - - - Folsom - - A grouped release of projects related to - OpenStack that came out in the fall of 2012, - the sixth release of OpenStack. It includes - Compute (nova), Object Storage (swift), - Identity (keystone), Networking (quantum), - Image service (glance) and Volumes or Block - Storage (cinder). - - - - FormPost - - swift middleware that allows users to upload - (post) an image through a form on a web - page. - - - - - G - - glance - - A core project that provides the OpenStack - Image Service. - - - - glance API server - - Processes client requests for VMs, updates - glance metadata on the registry server, and - communicates with the store adapter to upload - VM images from the back-end store. - - - - global endpoint template - - The keystone endpoint template that contains - services available to all tenants. - - - - GlusterFS - - An open-source, distributed, shared file - system, - - - - Grizzly - - Project name for the seventh release of - OpenStack. - - - - guest OS - - An operating system instance running under - the control of a hypervisor. - - - - - H - - handover - - An object state in swift where a new replica - of the object is automatically created due to - a drive failure. - - - - hard reboot - - A type of reboot where a physical or virtual - power button is pressed as opposed to a - graceful, proper shutdown of the operating - system. - - - - Heat - - An integrated project that aims to - orchestrate multiple cloud applications for - OpenStack. - - - - horizon - - The project that provides the OpenStack - Dashboard. - - - - host - - A physical computer, also known as a node. - Contrast with: instance. - - - - host aggregate - - A method to further subdivide availability - zones into a collection of hosts. - - - - Hyper-V - - One of the hypervisors supported by - OpenStack, developed by Microsoft. - - - - hypervisor - - Software that arbitrates and controls VM - access to the actual underlying - hardware. - - - - hypervisor pool - - A collection of hypervisors grouped together - through host aggregates. - - - - - -   - - - - - I - - ID number - - Unique numeric ID associated with each user - in keystone, conceptually similar to a Linux - or LDAP UID. - - - - Identity API - - Alternative term for the Identity Service - API. - - - - Identity back-end - - The source used by keystone to retrieve user - information an OpenLDAP server for - example. - - - - Identity Service - - Provides authentication services, also known - as keystone. - - - - Identity Service API - - The API used to access the OpenStack - Identity Service provided through - keystone. - - - - image - - A collection of files for a specific - operating system (OS) that you use to create - or rebuild a server. You can also create - custom images, or snapshots, from servers that - you have launched. - - - - Image API - - The glance API endpoint for management of VM - images. - - - - image cache - - Used by glance to allow images on the local - host to be used rather than re-downloading - them from the image server each time one is - requested. - - - - image ID - - Combination of URI and UUID used to access - glance VM images through the image API. - - - - image membership - - A list of tenants that can access a given VM - image within glance. - - - - image owner - - The keystone tenant who owns a glance - virtual machine image. - - - - image registry - - A list of VM images that are available - through glance. - - - - Image Service API - - Alternative name for the glance image - API. - - - - image status - - The current status of a VM image in glance, - not to be confused with the status of a - running instance. - - - - image store - - The back-end store used by glance to store - VM images, options include swift, local file - system, S3, or HTTP. - - - - image UUID - - The UUID used by glance to uniquely identify - each VM image. - - - - incubated project - - A community project may be elevated to this - status and is then promoted to a core - project. - - - - ingress filtering - - The process of filtering incoming network - traffic. Supported by nova. - - - - injection - - The process of putting a file into a virtual - machine image before the instance is - started. - - - - instance - - A running VM, or a VM in a known state such - as suspended that can be used like a hardware - server. - - - - instance ID - - Unique ID that is specific to each running - nova VM instance. - - - - instance state - - The current state of a nova VM image. - - - - instance type - - Alternative term for flavor. - - - - instance type ID - - Alternative term for a flavor ID. - - - - instance UUID - - Unique ID assigned to each nova VM - instance. - - - - interface ID - - Unique ID for a quantum VIF or vNIC in the - form of a UUID. - - - - ip6tables - - Used along with arptables, ebtables, and - iptables to create firewalls in nova. - - - - iptables - - Used along with arptables, ebtables, and - ip6tables to create firewalls in nova. - - - - - -   - - - - - J - - JavaScript Object Notation - (JSON) - - One of the supported response formats for - the OpenStack API. - - - - Jenkins - - Tool used for OpenStack development to run - jobs automatically. - - - - - -   - - - - - K - - kernel-based VM (KVM) - - An OpenStack-supported hypervisor - - - - keystone - - The project that provides OpenStack Identity - services. - - - - Kickstart - - A tool to automate system configuration and - installation on Red Hat, Fedora, and CentOS - based Linux distributions. - - - - - L - - large object - - An object within swift that is larger than 5 - GBs. - - - - Launchpad - - The collaboration site for OpenStack. - - - - Layer-2 network - - Term used for OSI network architecture for - the data link layer. - - - - libvirt - - Virtualization API library used by OpenStack - to interact with many of its supported - hypervisors, including KVM, QEMU and - LXC. - - - - Linux bridge - - Software used to allow multiple VMs to share - a single physical NIC within nova. - - - - Linux bridge quantum plug-in - - Plugin that allows a Linux bridge to - understand a quantum port, interface - attachment, and other abstractions. - - - - Linux containers (LXC) - - An OpenStack-supported hypervisor. - - - - live migration - - The ability within nova to move running - virtual machine instances from one host to - another with only a small service interruption - during switch-over. - - - - - -   - - - - - M - - management API - - Alternative term for an admin API. - - - - management network - - A network segment used for administration, - not accessible to the public internet. - - - - manifest - - Used to track segments of a large object - within swift. - - - - manifest object - - A special swift object that contains the - manifest for a large object. - - - - membership - - The association between a glance VM image - and a tenant, allows images to be shared with - specified tenant(s). - - - - membership list - - Contains a list of tenants that can access a - given VM image within glance. - - - - memory overcommit - - The ability to start new VM instances based - on the actual memory usage of a host, as - opposed to basing the decision on the amount - of RAM each running instance thinks it has - available. Also known as RAM - overcommit. - - - - message broker - - The software package used to provide AMQP - messaging capabilities within nova, default is - RabbitMQ. - - - - message bus - - The main virtual communication line used by - all AMQP messages for inter-cloud - communications within nova. - - - - message queue - - Passes requests from clients to the - appropriate workers and returns the output to - the client once the job is complete. - - - - migration - - The process of moving a VM instance from one - host to another. - - - - multinic - - Facility in nova that allows each virtual - machine instance to have more than one VIF - connected to it. - - - - - -   - - - - - N - - network ID - - Unique ID assigned to each network segment - within quantum. - - - - network manager - - The nova component that manages various - network components, such as firewall rules, IP - address allocation, and so on. - - - - network node - - Any nova node that runs the network worker - daemon. - - - - network segment - - Represents a virtual, isolated OSI layer 2 - subnet in quantum. - - - - network UUID - - Unique ID for a quantum network - segment. - - - - network worker - - The nova-network worker daemon, provides - services such as giving an IP address to a - booting nova instance. - - - - non-persistent volume - - Alternative term for an ephemeral - volume. - - - - nova - - The OpenStack project that provides compute - services. - - - - nova API - - Alternative term for the nova Compute - API. - - - - nova-network - - A nova component that manages IP address - allocation, firewalls, and other - network-related tasks. - - - - - O - - object - - A BLOB of data held by swift, can be in any - format. - - - - Object API - - Alternative term for the swift object - API. - - - - object auditor - - Opens all objects for an object server and - verifies the MD5 hash, size, and metadata for - each object. - - - - object expiration - - A configurable option within swift to - automatically delete objects after a specified - amount of time has passed or a certain date is - reached. - - - - object hash - - Uniquely ID for a swift object. - - - - object path hash - - Used by swift to determine the location of - an object in the ring. Maps objects to - partitions. - - - - object replicator - - Component of swift that copies and object to - remote partitions for fault tolerance. - - - - object server - - Component of swift that is responsible for - managing objects. - - - - Object Service API - - Alternative term for the swift object - API. - - - - object storage - - Provides eventually consistent and redundant - storage and retrieval of fixed digital - content. - - - - object versioning - - Allows a user to set a flag on a swift - container so all objects within the container - are versioned. - - - - operator - - The person responsible for planning and - maintaining an OpenStack installation. - - - - - P - - parent cell - - If a requested resource, such as CPU time, - disk storage, or memory, is not available in - the parent cell, the request is forwarded to - associated child cells. - - - - partition - - A unit of storage within swift used to store - objects, exists on top of devices, replicated - for fault tolerance. - - - - partition index - - Contains the locations of all swift - partitions within the ring. - - - - partition shift value - - Used by swift to determine which partition - data should reside on. - - - - pause - - A VM state where no changes occur (no - changes in memory, network communications - stop, etc), the VM is frozen but not shut - down. - - - - persistent volume - - Disk volumes that persist beyond the - lifetime of individual virtual machine - instances. Contrast with: ephemeral - storage - - - - plugin - - Software component providing the actual - implementation for quantum APIs, or for - Compute APIs, depending on the context. - - - - policy service - - Component of keystone that provides a rule - management interface and a rule based - authorization engine. - - - - port - - A virtual network port within quantum, VIFs - / vNICs are connected to a port. - - - - port UUID - - Unique ID for a quantum port. - - - - preseed - - A tool to automate system configuration and - installation on Debian based Linux - distributions. - - - - private image - - A glance VM image that is only available to - specified tenants. - - - - project - - A logical grouping of users within nova, - used to define quotas and access to VM - images. - - - - project ID - - User defined alpha-numeric string in nova, - the name of a project. - - - - project VPN - - Alternative term for a cloudpipe. - - - - proxy node - - A node that provides the swift proxy - service. - - - - proxy server - - Users of swift interact with the service - through the proxy server which in-turn looks - up the location of the requested data within - the ring and returns the results to the - user. - - - - public API - - An API endpoint used for both service to - service communication and end user - interactions. - - - - public image - - A glance VM image that is available to all - tenants. - - - - public IP address - - An IP address that is accessible to - end-users. - - - - public network - - The Network Controller provides virtual - networks to enable compute servers to interact - with each other and with the public network. - All machines must have a public and private - network interface. The public network - interface is controlled by the - public_interface option. - - - - Puppet - - A configuration management tool that - supports OpenStack. - - - - Python - - Programming language used extensively in - OpenStack. - - - - - Q - - quantum - - A core OpenStack project that provides a - network connectivity abstraction layer to - OpenStack Compute. - - - - quantum API - - API used to access quantum, provides and - extensible architecture to allow custom plugin - creation. - - - - quantum manager - - Allows nova and quantum integration thus - allowing quantum to perform network management - for nova VMs. - - - - quantum plugin - - Interface within quantum that allows - organizations to create custom plugins for - advanced features such as QoS, ACLs, or - IDS. - - - - quarantine - - If swift finds objects, containers, or - accounts that are corrupt they are placed in - this state, are not replicated, cannot be read - by clients, and a correct copy is - re-replicated. - - - - Quick EMUlator (QEMU) - - One of the hypervisors supported by - OpenStack, generally used for development - purposes. - - - - quota - - In nova, the ability to set resource limits - on a per-project basis. - - - - - R - - RAM filter - - The nova setting that allows or disallows - RAM overcommitment. - - - - RAM overcommit - - The ability to start new VM instances based - on the actual memory usage of a host, as - opposed to basing the decision on the amount - of RAM each running instance thinks it has - available. Also known as memory - overcommit. - - - - rate limit - - Configurable option within swift to limit - database writes on a per-account and/or - per-container basis. - - - - rebalance - - The process of distributing swift partitions - across all drives in the ring, used during - initial ring creation and after ring - reconfiguration. - - - - Recon - - A component of swift used to collect - metrics. - - - - record ID - - A number within a database that is - incremented each time a change is made. Used - by swift when replicating. - - - - registry server - - A glance service that provides VM image - metadata information to clients. - - - - replica - - Provides data redundancy and fault tolerance - by creating copies of swift objects, accounts, - and containers so they are not lost when the - underlying storage fails. - - - - replica count - - The number of replicas of the data in a - swift ring. - - - - replication - - The process of copying data to a separate - physical device for fault tolerance and - performance. - - - - replicator - - The swift back-end process that creates and - manages object replicas. - - - - request ID - - Unique ID assigned to each request sent to - nova. - - - - ring - - An entity that maps swift data to - partitions. A separate ring exists for each - service, such as account, object, and - container. - - - - ring builder - - Builds and manages rings within swift, - assigns partitions to devices, and pushes the - configuration to other storage nodes. - - - - role ID - - Alpha-numeric ID assigned to each keystone - role. - - - - rootwrap - - A feature of nova that allows the - unprivileged "nova" user to run a specified - list of commands as the Linux root - user. - - - - RPC driver - - Modular system that allows the nova - underlying message queue software to be - changed. For example, from RabbitMQ to ZeroMQ - or Qpid. - - - - - S - - S3 - - Object storage service by Amazon, similar in - function to swift, can act as a back-end store - for glance VM images. - - - - scheduler manager - - A nova component that determines where VM - instances should start. Uses modular design to - support a variety of scheduler types. - - - - scoped token - - A keystone API access token that is - associated with a specific tenant. - - - - secret key - - String of text only known by the user, used - along with an access key to make requests to - the nova API. - - - - security group - - A set of network traffic filtering rules - that are applied to a nova instance. - - - - segmented object - - A swift large object that has been broken up - into pieces, the re-assembled object is called - a concatenated object. - - - - server image - - Alternative term for a VM image. - - - - server UUID - - Unique ID assigned to each nova VM - instance. - - - - service catalog - - Alternative term for the keystone - catalog. - - - - service ID - - Unique ID assigned to each service that is - available in the keystone catalog. - - - - service registration - - A keystone feature that allows services such - as nova to automatically register with the - catalog. - - - - service tenant - - Special keystone tenant that contains all - services that are listed in the - catalog. - - - - service token - - An administrator defined token used by nova - to communicate securely with keystone. - - - - session back-end - - The method of storage used by horizon to - track client sessions such as local memory, - cookies, a database, or memcached. - - - - session persistence - - A feature of the load balancing service. It - attempts to force subsequent connections to a - service to be redirected to the same node as - long as it is online. - - - - session storage - - A horizon component that stores and tracks - client session information. Implemented - through the Django sessions framework. - - - - shared storage - - Block storage that is simultaneously - accessible by multiple clients. For example, - NFS. - - - - SmokeStack - - Runs automated tests against the core - OpenStack API, written in Rails. - - - - snapshot - - A point-in-time copy of an OpenStack storage - volume or image. Use storage volume snapshots - to back up volumes. Use image snapshots to - back up data, or as "gold" images for - additional servers. - - - - spread-first scheduler - - The nova VM scheduling algorithm that - attempts to start new VM on the host with the - least amount of load. - - - - SQLAlchemy - - An open source SQL toolkit for Python, used - in OpenStack. - - - - SQLite - - A lightweight SQL database, used as the - default persistent storage method in many - OpenStack services. - - - - StackTach - - Community project that captures nova AMQP - communications, useful for debugging. - - - - static IP address - - Alternative term for a fixed IP - address. - - - - StaticWeb - - WSGI middleware component of swift that - serves container data as a static web - page. - - - - storage back-end - - The method that a service uses for - persistent storage such as iSCSI, NFS, or - local disk. - - - - storage node - - A swift node that provides container - services, account services, and object - services, controls the account databases, - container databases, and object - storage. - - - - storage manager - - Component of XenAPI that provides a - pluggable interface to support a wide variety - of persistent storage back-ends. - - - - storage manager back-end - - A persistent storage method supported by - XenAPI such as iSCSI or NFS. - - - - storage services - - Collective name for the swift object - services, container services, and account - services. - - - - swift - - An OpenStack core project that provides - object storage services. - - - - swift All in One (SAIO) - - Creates a full swift development environment - within a single VM. - - - - swift middleware - - Collective term for components within swift - that allows for additional - functionality. - - - - swift proxy server - - Acts as the gatekeeper to swift and is - responsible for authenticating the - user. - - - - swift storage node - - A node that runs swift account, container, - and object services. - - - - sync point - - Point in time since the last container and - accounts database sync among nodes within - swift. - - - - - T - - TempAuth - - An authentication facility within swift that - allows swift itself to perform authentication - and authorization, frequently used in testing - and development. - - - - Tempest - - Automated software test suite designed to - run against the trunk of the OpenStack core - project. - - - - TempURL - - A swift middleware component that allows a - user to create URLs for temporary object - access. - - - - tenant - - A group of users, used to isolate access to - nova resources. An alternative term for a nova - project. - - - - tenant endpoint - - A keystone API endpoint that is associated - with one or more tenants. - - - - tenant ID - - Unique ID assigned to each tenant within - keystone, the nova project IDs map to the - keystone tenant IDs. - - - - token - - An alpha-numeric string of text used to - access OpenStack APIs and resources. - - - - tombstone - - Used to mark swift objects that have been - deleted, ensures the object is not updated on - another node after it has been deleted. - - - - transaction ID - - Unique ID assigned to each swift request, - used for debugging and tracing. - - - - - -   - - - - - U - - unscoped token - - Alternative term for a keystone default - token. - - - - updater - - Collective term for a group of swift - components that process queued and failed - updates for containers and objects. - - - - user - - In keystone each user is associated with one - or more tenants, and in nova they can be - associated with roles, projects, or - both. - - - - user data - - A blob of data that can be specified by the - user when launching an instance. This data can - be accessed by the instance through the - metadata service or config drive. Commonly - used for passing a shell script that is - executed by the instance on boot. - - - - - V - - VIF UUID - - Unique ID assigned to each quantum - VIF. - - - - Virtual Central Processing Unit - (vCPU) - - Allows physical CPUs to be sub-divided and - those divisions are then used by instances. - Also known as virtual cores. - - - - Virtual Machine (VM) - - An operating system instance that runs on - top of a hypervisor. Multiple VMs can run at - the same time on the same physical - host. - - - - virtual network - - An L2 network segment within quantum. - - - - Virtual Network InterFace (VIF) - - An interface that is plugged into a port in - a quantum network. Typically a virtual network - interface belonging to a VM. - - - - virtual port - - Attachment point where a virtual interface - connects to a virtual network. - - - - virtual private network (VPN) - - Provided by nova in the form of cloudpipes, - specialized instances that are used to create - VPNs on a per-project basis. - - - - virtual server - - Alternative term for a VM or guest. - - - - virtual switch (vSwitch) - - Software that runs on a host or node and - provides the features and functions of a - hardware based network switch. - - - - virtual VLAN - - Alternative term for a virtual - network. - - - - VLAN manager - - A nova networking manager that divides - subnet and tenants into different VLANs - allowing for Layer 2 segregation. Provides a - DHCP server for each VLAN to assign IP - addresses for instances. - - - - VLAN network - - The Network Controller provides virtual - networks to enable compute servers to interact - with each other and with the public network. - All machines must have a public and private - network interface. A VLAN network is a private - network interface, which is controlled by the - vlan_interface option with VLAN - managers. - - - - VM image - - Alternative term for an image. - - - - VNC proxy - - A nova component that provides users access - to the consoles of their VM instances through - VNC or VMRC. - - - - volume - - Disk-based data storage generally - represented as an iSCSI target with a file - system that supports extended attributes, can - be persistent or ephemeral. Commonly used as a - synonym for block device. - - - - Volume API - - An API on a separate endpoint for attaching, - detaching, and creating block storage for - compute VMs. - - - - volume controller - - A nova component that oversees and - coordinates storage volume actions. - - - - volume driver - - Alternative term for a volume plugin. - - - - volume ID - - Unique ID applied to each storage volume - under the nova control. - - - - volume manager - - A nova component that creates, attaches, and - detaches persistent storage volumes. - - - - volume node - - A nova node that runs the cinder-volume - daemon. - - - - volume plugin - - A plugin for the nova volume manager. - Provides support for a new and specialized - types of back-end storage. - - - - Volume Service API - - Alternative term for the Block Storage - API. - - - - volume worker - - The nova component that interacts with - back-end storage to manage the creation and - deletion of volumes and the creation of - compute volumes, provided by the nova-volume - daemon. - - - - - W - - weight - - Used by swift storage devices to determine - which storage devices are suitable for the - job. Devices are weighted by size. - - - - weighted cost - - The sum of each cost used when deciding - where to start a new VM instance in - nova. - - - - weighing - - A nova process that determines the - suitability of the VM instances for a job for - a particular host. For example, not enough RAM - on the host, too many CPUs on the host, and so - on. - - - - worker - - A daemon that carries out tasks. For - example, the nova-volume worker attaches - storage to an VM instance. Workers listen to a - queue and take action when new messages - arrive. - - - - - Z - - Zuul - - Tool used in OpenStack development to ensure - correctly ordered testing of changes in - parallel. - - - - - - diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_cloud_controller.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_cloud_controller.xml deleted file mode 100644 index bb00813f858..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_cloud_controller.xml +++ /dev/null @@ -1,454 +0,0 @@ - - - - - - - - -]> - - - Cloud Controller Design - OpenStack is designed to be massively horizontally scalable, - which allows all services to be distributed widely. However, - to simplify this guide we have decided to discuss services of - a more central nature using the concept of a single - cloud controller. - For more details about the overall architecture, see the - . - As described in this guide, the cloud controller is a single - node that hosts the databases, message queue service, - authentication and authorization service, image management - service, user dashboard, and API - endpoints. - The cloud controller provides the central management system - for multi-node OpenStack deployments. Typically the cloud - controller manages authentication and sends messaging to all - the systems through a message queue. - For our example, the cloud controller has a collection of - nova-* components that represent the global - state of the cloud, talks to services such as authentication, - maintains information about the cloud in a database, - communicates to all compute nodes and storage - workers through a queue, and - provides API access. Each service running on a designated - cloud controller may be broken out into separate nodes for - scalability or availability. -
- - Hardware Considerations - A cloud controller's hardware can be the same as a - compute node, though you may want to further specify based - on the size and type of cloud that you run. - It's also possible to use virtual machines for all or - some of the services that the cloud controller manages, - such as the message queuing. In this guide, we assume that - all services are running directly on the cloud - controller. - To size the server correctly, and determine whether to - virtualize any part of it, you should estimate: - - - The number of instances that you expect to - run - - - The number of compute nodes that you have - - - The number of users who will access the compute - or storage services - - - Whether users interact with your cloud through - the REST API or the dashboard - - - Whether users authenticate against an external - system (such as, LDAP or Active - Directory) - - - How long you expect single instances to - run - - - - - - - - Consideration - Ramification - - - - - How many instances will run at - once? - Size your database server - accordingly, and scale out beyond one - cloud controller if many instances will - report status at the same time and - scheduling where a new instance starts up - needs computing power. - - - How many compute nodes will run at - once? - Ensure that your messaging queue - handles requests successfully and size - accordingly. - - - How many users will access the - API? - If many users will make multiple - requests, make sure that the CPU load for - the cloud controller can handle. - it. - - - How many users will access the - dashboard? - The dashboard makes many requests, - even more than the API access, so add even - more CPU if your dashboard is the main - interface for your users. - - - How many nova-api - services do you run at once for your - cloud? - You need to size the controller - with a core per service. - - - How long does a single instance - run? - Starting instances and deleting - instances is demanding on the compute node - but also demanding on the controller node - because of all the API queries and - scheduling needs. - - - Does your authentication system - also verify externally? - Ensure network connectivity between - the cloud controller and external - authentication system are good and that - the cloud controller has the CPU power to - keep up with requests. - - - -
- -
- Separation of Services - While our example contains all central services in a - single location, it is possible and indeed often a good - idea to separate services onto different physical servers. - The following is a list of deployment scenarios we've - seen, and their justifications. - - - - - - Run glance-* servers - on the swift-proxy - server - This deployment felt the spare I/O - on the Object Storage proxy server was - sufficient, and the Image Delivery portion - of Glance benefited from being on physical - hardware and having good connectivity to - the Object Storage back-end it was - using. - - - - - Run a central dedicated database - server - This deployment made a central - dedicated server to provide the databases - for all services. This simplified - operations by isolating database server - updates, and allowed for the simple - creation of slave database servers for - failover. - - - Run one VM per service - This deployment ran central - services on a set of servers running KVM. - A dedicated VM was created for each - service (nova-scheduler, rabbitmq, - database etc). This assisted the - deployment with scaling as they could tune - the resources given to each virtual - machine based on the load they received - (something that was not well understood - during installation). - - - Use an external load - balancer - This deployment had an expensive - hardware load balancer in their - organisation. They ran multiple - nova-api and - swift-proxy servers on - different physical servers and used the - load balancer to switch between - them. - - - - - One choice that always comes up is whether to virtualize - or not. Some services, such as nova-compute, swift-proxy - and swift-object servers, should not be virtualized. - However, control servers can often be happily virtualized - - the performance penalty can usually be offset by simply - running more of the service. -
-
- Database - Most OpenStack Compute central services, and currently - also the nova-compute nodes, use the database for stateful - information. Loss of this ability leads to errors. As a - result, we recommend that you cluster your databases in - some way to make them failure tolerant. -
-
- Message Queue - Most OpenStack Compute services communicate with each - other using the Message Queue. In general, if the message - queue fails or becomes inaccessible, the cluster grinds to - a halt and ends up in a "read only" state, with - information stuck at the point where the last message was - sent. Accordingly, we recommend that you cluster the - message queue - and RabbitMQ has in-build abilities to do - this. -
- -
- Application Programming Interface (API) - All public access, whether direct, through a command - line client, or through the web-based dashboard, uses the - API service. Find the API reference at http://api.openstack.org/. - You must choose whether you want to support the Amazon - EC2 compatibility APIs, or just the OpenStack APIs. One - issue you might encounter when running both APIs is an - inconsistent experience when referring to images and - instances. - For example, the EC2 API refers to instances using IDs - that contain hexadecimal whereas the OpenStack API uses - names and digits. Similarly, the EC2 API tends to rely on - DNS aliases for contacting virtual machines, as opposed to - OpenStack which typically lists IP addresses. - If OpenStack is not set up in the right way, it is - simple to have scenarios where users are unable to contact - their instances due to only having an incorrect DNS alias. - Despite this, EC2 compatibility can assist users migrating - to your cloud. - Like databases and message queues, having more than one - API server is a good thing. - Traditional HTTP load balancing techniques can be used to - achieve a highly available nova-api - service. -
-
- Extensions - The API Specifications - (http://docs.openstack.org/api/api-specs.html) define the - core actions, capabilities, and media-types of the - OpenStack API. A client can always depend on the - availability of this core API and implementers are always - required to support it in its entirety. Requiring strict - adherence to the core API allows clients to rely upon a - minimal level of functionality when interacting with - multiple implementations of the same API. - The OpenStack Compute API is extensible. An extension - adds capabilities to an API beyond those defined in the - core. The introduction of new features, MIME types, - actions, states, headers, parameters, and resources can - all be accomplished by means of extensions to the core - API. This allows the introduction of new features in the - API without requiring a version change and allows the - introduction of vendor-specific niche - functionality. -
- -
- Scheduler - Fitting various sized virtual machines (different - flavors) into different sized - physical nova-compute nodes is a challenging problem - - researched generically in Computer Science as a packing - problem. - You can use various techniques to handle this problem, - one of which is to have flavor sizes scale linearly, be a - proportional fraction of your physical node capacity, - though solving this problem is out of the scope of this - book. To support your scheduling choices, OpenStack - Compute provides several different types of scheduling - drivers, a full discussion of which is found in the reference manual - (http://docs.openstack.org/folsom/openstack-compute/admin/content/ch_scheduling.html). - For availability purposes, or for very large or - high-schedule frequency installations, you should consider - running multiple nova-scheduler services. No special load - balancing is required, as the nova-scheduler communicates - entirely using the message queue. -
-
- Images - The OpenStack Image Catalog and Delivery service - consists of two parts - glance-api and - glance-registry. The former is - responsible for the delivery of images and the compute - node uses it to download images from the back-end. The - latter maintains the metadata information associated with - virtual machine images and requires a database. - The glance-api part is an abstraction layer - that allows a choice of back-end. Currently, it - supports: - - - OpenStack Object Storage. Allows you to store - images as objects. - - - File system. Uses any traditional file system to - store the images as files. - - - S3. Allows you to fetch images from Amazon S3. - - - HTTP. Allows you to fetch images from a web - server. You cannot write images by using this - mode. - - - If you have an OpenStack Object Storage service, we recommend using this as a scalable - place to store your images. You can also use a file system with sufficient performance - or Amazon S3 - unless you do not need the ability to upload new images through - OpenStack. -
-
- Dashboard - The OpenStack Dashboard is implemented as a Python web - application that runs in Apache - httpd. Therefore, you may treat it the same - as any other web application, provided it can reach the - API servers (including their admin endpoints) over the - network. -
- -
- Authentication and Authorization - The concepts supporting OpenStack's authentication and - authorization are derived from well understood and widely - used systems of a similar nature. Users have credentials - they can use to authenticate, and they can be a member of - one or more groups (known as projects or tenants - interchangeably). - For example, a cloud administrator might be able to list - all instances in the cloud, whereas a user can only see - those in their current group. Resources quotas, such as - the number of cores that can be used, disk space, and so - on, are associated with a project. - The OpenStack Identity Service (Keystone) is the point - that provides the authentication decisions and user - attribute information, which is then used by the other - OpenStack services to perform authorization. Policy is set - in the policy.json file. For information on how to - configure these, see . - The Identity Service supports different plugins for - back-end authentication decisions, and storing - information. These range from pure storage choices to - external systems and currently include: - - - In-memory Key-Value Store - - - SQL database - - - PAM - - - LDAP - - - Many deployments use the SQL database, however LDAP is - also a popular choice for those with existing - authentication infrastructure that needs to be - integrated. -
- -
- Network Considerations - Because the cloud controller handles so many different - services, it must be able to handle the amount of traffic - that hits it. For example, if you choose to host the - OpenStack Imaging Service on the cloud controller, the - cloud controller should be able to support the - transferring of the images at an acceptable speed. - As another example, if you choose to use single-host - networking where the cloud controller is the network - gateway for all instances, then the Cloud Controller must - support the total amount of traffic that travels between - your cloud and the public Internet. - We recommend that you use a fast NIC, such as 10 GB. You - can also choose to use two 10 GB NICs and bond them - together. While you might not be able to get a full bonded - 20 GB speed, different transmission streams use different - NICs. For example, if the Cloud Controller transfers two - images, each image uses a different NIC and gets a full 10 - GB of bandwidth. -
- - -
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_compute_nodes.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_compute_nodes.xml deleted file mode 100644 index a5abfbc17a9..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_compute_nodes.xml +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - - - -]> - - - Compute Nodes - Compute nodes form the resource core of the OpenStack - Compute cloud, providing the processing, memory, network and - storage resources to run instances. -
- CPU Choice - The type of CPU in your compute node is a very important - choice. First, ensure the CPU supports virtualization by - way of VT-x for Intel chips and - AMD-v for AMD chips. - The number of cores that the CPU has also affects the - decision. It's common for current CPUs to have up to 12 - cores. Additionally, if the CPU supports Hyper-threading, - those 12 cores are doubled to 24 cores. If you purchase a - server that supports multiple CPUs, the number of cores is - further multiplied. - Whether you should enable hyper-threading on your CPUs - depends upon your use case. We recommend you do - performance testing with your local workload with both - hyper-threading on and off to determine what is more - appropriate in your case. -
- -
- Hypervisor Choice - OpenStack Compute supports many hypervisors to various - degrees, including KVM, LXC, - QEMU, - UML, VMWare ESX/ESXi, Xen, PowerVM, Hyper-V. - Probably the most important factor in your choice of - hypervisor is your current usage or experience. Aside from - that, there are practical concerns to do with feature - parity, documentation, and the level of community - experience. - For example, KVM is the most widely adopted hypervisor - in the OpenStack community. Besides KVM, more deployments - exist running Xen, LXC, VMWare and Hyper-V than the others - listed — however, each of these are lacking some feature - support or the documentation on how to use them with - OpenStack is out of date. - The best information available to support your choice is - found on the Hypervisor Support Matrix - (https://wiki.openstack.org/wiki/HypervisorSupportMatrix), - and in the reference manual - (http://docs.openstack.org/folsom/openstack-compute/admin/content/ch_hypervisors.html). - - It is also possible to run multiple hypervisors in a - single deployment using Host Aggregates or Cells. - However, an individual compute node can only run a - single hypervisor at a time. - -
- -
- Instance Storage Solutions - As part of the procurement for a compute cluster, you - must specify some storage for the disk on which the - instantiated instance runs. There are three main - approaches to providing this temporary-style storage, and - it is important to understand the implications of the - choice. - They are: - - - Off compute node storage – shared file - system - - - On compute node storage – shared file - system - - - On compute node storage – non-shared file - system - - - In general, the questions you should be asking when - selecting the storage are as follows: - - - What is the platter count you can - achieve? - - - Do more spindles result in better I/O despite - network access? - - - Which one results in the best cost-performance - scenario you're aiming for? - - - How do you manage the storage - operationally? - - -
- Off Compute Node Storage – Shared File - System - Many operators use separate compute and storage - hosts. Compute services and storage services have - different requirements, compute hosts typically - require more CPU and RAM than storage hosts. - Therefore, for a fixed budget, it makes sense to have - different configurations for your compute nodes and - your storage nodes with compute nodes invested in CPU - and RAM, and storage nodes invested in block - storage. - Also, if you use separate compute and storage hosts - then you can treat your compute hosts as "stateless". - This simplifies maintenance for the compute hosts. As - long as you don't have any instances currently running - on a compute host, you can take it offline or wipe it - completely without having any effect on the rest of - your cloud. - However, if you are more restricted in the number of - physical hosts you have available for creating your - cloud and you want to be able to dedicate as many of - your hosts as possible to running instances, it makes - sense to run compute and storage on the same - machines. - In this option, the disks storing the running - instances are hosted in servers outside of the compute - nodes. There are also several advantages to this - approach: - - - If a compute node fails, instances are - usually easily recoverable. - - - Running a dedicated storage system can be - operationally simpler. - - - Being able to scale to any number of - spindles. - - - It may be possible to share the external - storage for other purposes. - - - - The main downsides to this approach are: - - - Depending on design, heavy I/O usage from - some instances can affect unrelated - instances. - - - Use of the network can decrease - performance. - - -
-
- On Compute Node Storage – Shared File - System - In this option, each nova-compute node - is specified with a significant amount of disks, but a - distributed file system ties the disks from each - compute node into a single mount. The main advantage - of this option is that it scales to external storage - when you require additional storage. - However, this option has several downsides: - - - Running a distributed file system can make - you lose your data locality compared with - non-shared storage. - - - Recovery of instances is complicated by - depending on multiple hosts. - - - The chassis size of the compute node can - limit the number of spindles able to be used - in a compute node. - - - Use of the network can decrease - performance. - - -
- -
- On Compute Node Storage – Non-shared File - System - In this option, each nova-compute node - is specified with enough disks to store the instances - it hosts. There are two main reasons why this is a - good idea: - - - Heavy I/O usage on one compute node does not - affect instances on other compute - nodes. - - - Direct I/O access can increase - performance. - - - - This has several downsides: - - - If a compute node fails, the instances - running on that node are lost. - - - The chassis size of the compute node can - limit the number of spindles able to be used - in a compute node. - - - Migrations of instances from one node to - another are more complicated, and rely on - features which may not continue to be - developed. - - - If additional storage is required, this - option does not to scale. - - -
-
- Issues with Live Migration - We consider live migration an integral part of the - operations of the cloud. This feature provides the - ability to seamlessly move instances from one physical - host to another, a necessity for performing upgrades - that require reboots of the compute hosts, but only - works well with shared storage. - Live migration can be also done with non-shared storage, using a feature known as - KVM live block migration. While an earlier implementation - of block-based migration in KVM and QEMU was considered unreliable, there is a - newer, more reliable implementation of block-based live migration as of QEMU 1.4 and - libvirt 1.0.2 that is also compatible with OpenStack. However, none of the authors - of this guide have first-hand experience using live block migration. -
-
- Choice of File System - If you want to support shared storage live - migration, you'll need to configure a distributed file - system. - Possible options include: - - - NFS (default for Linux) - - - GlusterFS - - - MooseFS - - - Lustre - - - We've seen deployments with all, and recommend you - choose the one you are most familiar with - operating. -
-
- -
- Overcommitting - OpenStack allows you to overcommit CPU and RAM on - compute nodes. This allows you to increase the number of - instances you can have running on your cloud, at the cost - of reducing the performance of the instances. OpenStack - Compute uses the following ratios by default: - - - CPU allocation ratio: 16 - - - RAM allocation ratio: 1.5 - - - The default CPU allocation ratio of 16 means that the - scheduler allocates up to 16 virtual cores on a node per - physical cores. For example, if a physical node has 12 - cores, and each virtual machine instance uses 4 virtual - cores, the scheduler allocates up to 192 virtual cores to - instances (such as, 48 instances, in the case where each - instance has 4 virtual cores). - Similarly, the default RAM allocation ratio of 1.5 means - that the scheduler allocates instances to a physical node - as long as the total amount of RAM associated with the - instances is less than 1.5 times the amount of RAM - available on the physical node. - For example, if a physical node has 48 GB of RAM, the - scheduler allocates instances to that node until the sum - of the RAM associated with the instances reaches 72 GB - (such as nine instances, in the case where each instance - has 8 GB of RAM). - You must select the appropriate CPU and RAM allocation - ratio for your particular use case. -
-
- Logging - Logging is detailed more fully in . However it is an important design - consideration to take into account before commencing - operations of your cloud. - OpenStack produces a great deal of useful logging - information, however, in order for it to be useful for - operations purposes you should consider having a central - logging server to send logs to, and a log parsing/analysis - system (such as logstash). -
-
- Networking - Networking in OpenStack is a complex, multi-faceted - challenge. See . -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_example.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_example.xml deleted file mode 100644 index a4ca5d8581e..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_example.xml +++ /dev/null @@ -1,338 +0,0 @@ - - - - - - - -]> - - - Example Architecture - Because OpenStack is highly configurable, with many - different back-ends and network - configuration options, it is difficult to write documentation - that covers all possible OpenStack deployments. Therefore, - this guide defines an example - architecture to simplify the task of - documenting, as well as to scope this guide so that it is - focused on a configuration where the authors have direct - deployment experience. -
- Overview - - - - - - OpenStack release - Folsom - - - Host operating system - Ubuntu 12.04 LTS - - - OpenStack package repository - Ubuntu Cloud Archive - (https://wiki.ubuntu.com/ServerTeam/CloudArchive) - * - - - Hypervisor - KVM - - - Database - MySQL* - - - Message queue - RabbitMQ - - - Networking service - nova-network - - - Network manager - FlatDHCP - - - Single nova-network or - multi-host? - multi-host* - - - Image Service (glance) - back-end - file - - - Identity Service (keystone) - driver - SQL - - - Block Storage Service (cinder) - back-end - LVM/iSCSI - - - Live Migration back-end - shared storage using NFS * - - - Object storage - OpenStack Object Storage - (swift) - - - - An asterisk (*) indicates when the example architecture - deviates from the settings of a default - installation. - - - The following features of OpenStack are supported by - the example architecture documented in this guide, but - are optional: - - dashboard - - - block - storage - - - floating IP - addresses - - - live - migration - - - object - storage - - - -
- -
- Rationale - This example architecture has been selected based on the - current default feature set of OpenStack - Folsom, with an emphasis on - stability. In particular, if none of the guide authors had - experience deploying the Folsom release of OpenStack with - a specific back-end or configuration, we did not consider - it for the example architecture. We believe that many - clouds that currently run OpenStack in production have - made similar choices. - You must first choose the operating system that runs on - all of the physical nodes. While OpenStack is supported on - several distributions of Linux, we used Ubuntu 12.04 LTS (Long Term - Support), which is used by the majority of - the development community, has feature completeness - compared with other distributions, and has clear future - support plans. - We recommend that you do not use the default Ubuntu - OpenStack install packages and instead use the Ubuntu Cloud Archive - (https://wiki.ubuntu.com/ServerTeam/CloudArchive). The - Cloud Archive is a package repository supported by - Canonical that allows you to upgrade to future OpenStack - releases while remaining on Ubuntu 12.04. - KVM as a - hypervisor complements the - choice of Ubuntu - being a matched pair in terms of - support, and also because of the significant degree of - attention it garners from the OpenStack development - community (including the authors, who mostly use KVM). It - is also feature complete, free from licensing charges and - restrictions. - MySQL follows a similar - trend. Despite its recent change of ownership, this - database is the most tested for use with OpenStack and is - heavily documented for running on Ubuntu. We deviate from - the default database, SQLite, because - SQLite is not an appropriate database for production - usage. - The choice of RabbitMQ - over other AMQP compatible options that are gaining - support in OpenStack, such as ZeroMQ and Qpid is due to - its ease of use with Ubuntu and significant testing in - production. It also is the only option which supports - features such as Compute Cells. We recommend clustering - with RabbitMQ, as it is an integral component of the - system, and fairly simple to implement due to its inbuilt - nature. - As discussed in previous chapters, there are several - options for networking in OpenStack Compute. We recommend - FlatDHCP and to use - Multi-Host networking - mode for high availability, running one - nova-network daemon per OpenStack Compute - host. This provides a robust mechanism for ensuring - network interruptions are isolated to individual compute - hosts, and allows for the direct use of hardware network - gateways. - Live Migration is - supported by way of shared storage, with NFS as the distributed file - system. - Acknowledging that many small-scale deployments see - running an Object Storage service just for the storage of - virtual machine images as too costly, we opted for the - file back-end in the OpenStack Image Catalog and Delivery - Service (Glance). If the cloud you are designing also - intends to run Object Storage, it is trivial to enable - this as the back-end instead, and a recommended - approach. - - We chose the SQL back-end for - Identity Service (keystone) over others, - such as LDAP. This back-end is simple to install and is - robust. The authors acknowledge that many installations - want to bind with existing directory services, and caution - careful understanding of the array of options available - (http://docs.openstack.org/folsom/openstack-compute/admin/content/reference-for-ldap-config-options.html) - The Block Storage service (cinder) is installed natively - on external storage nodes and uses the LVM/iSCSI plugin. Most Block - Storage Service plugins are tied to particular vendor - products and implementations limiting their use to - consumers of those hardware platforms, but LVM/iSCSI is - robust and stable on commodity hardware. - While the cloud can be run without the OpenStack Dashboard, we - consider it to be indispensable, not just for user - interaction with the cloud, but also as a tool for - operators. Additionally, the dashboard's use of Django - makes it a flexible framework for extension. - -
- Why Not Use the OpenStack Network Service - (quantum)? - We do not discuss the OpenStack Network Service - (quantum) in this guide, because the authors of this - guide only have production deployment experience using - nova-network. Additionally, it does - not yet support multi-host networking. -
-
- Why Use Multi-host Networking? - In a default OpenStack deployment, there is a single - nova-network service that runs within - the cloud (usually on the cloud controller) that - provides services such as network address translation - (NAT), DHCP, and DNS to the guest instances. If the - single node that runs the nova-network - service goes down, you cannot access your instances - and the instances cannot access the Internet. The - single node that runs the nova-network service can - become a bottleneck if excessive network traffic comes - in and goes out of the cloud. - - Multi-host - (http://docs.openstack.org/folsom/openstack-compute/admin/content/existing-ha-networking-options.html#d6e8906) - is a high-availability option for the network - configuration where the nova-network service is run on - every compute node instead of running on only a single - node. -
-
- -
- Detailed Description - The reference architecture consists of multiple compute - nodes, a cloud controller, an external NFS storage server - for instance storage and an OpenStack Block Storage server - for volume storage. A network time - service (Network Time Protocol, NTP) synchronizes time for - all the nodes. FlatDHCPManager in multi-host mode is used - for the networking. - - - - - - - - The cloud controller runs: the dashboard, the API - services, the database (MySQL), a message queue server - (RabbitMQ), the scheduler for choosing compute resources - (nova-scheduler), Identity services (keystone, - nova-consoleauth), Image services - (glance-api, - glance-registry), services for console access - of guests, and block storage services including the - scheduler for storage resources (cinder-api - and cinder-scheduler). - - Compute nodes are where the computing resources are - held, and in our example architecture they run the - hypervisor (KVM), libvirt (the driver for the hypervisor, - which enables live migration node to node), - nova-compute, - nova-api-metadata (generally only used - when running in multi-host mode, it retrieves - instance-specific metadata), nova-vncproxy, and - nova-network. - - The network consists of two switches, one for the - management or private traffic, and one which covers public - access including Floating IPs. To support this, the cloud - controller and the compute nodes have two network cards. - The OpenStack Block Storage and NFS storage servers only - need to access the private network and therefore only need - one network card, but multiple cards run in a bonded - configuration are recommended if possible. Floating IP - access is direct to the internet, whereas Flat IP access - goes through a NAT. - - - - - - - -
- -
- Optional Extensions - You can extend this reference architecture as - follows: - - - Add additional cloud controllers (see ). - - - Add an OpenStack Storage service - (http://docs.openstack.org/folsom/openstack-object-storage/admin/) - - - Add additional OpenStack Block Storage hosts - (see ). - - -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_network_design.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_network_design.xml deleted file mode 100644 index 1e6fa146308..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_network_design.xml +++ /dev/null @@ -1,312 +0,0 @@ - - - - - - - - -]> - - - Network Design - OpenStack provides a rich networking environment, and this - chapter details the requirements and options to deliberate - when designing your cloud. - If this is the first time you are deploying a cloud - infrastructure in your organisation, after reading this - section, your first conversations should be with your - networking team. Network usage in a running cloud is vastly - different from traditional network deployments, and has the - potential to be disruptive at both a connectivity and a policy - level. - For example, you must plan the number of IP addresses that - you need for both your guest instances as well as management - infrastructure. Additionally, you must research and discuss - cloud network connectivity through proxy servers and - firewalls. -
- Management Network - A management network, typically consisting of a separate - switch and separate NICs, is a recommended option. This - segregation prevents system administration and monitoring - system access from being disrupted by traffic generated by - the guests themselves. - Consider creating other private networks for - communication between internal components of OpenStack, - such as the Message Queue and OpenStack Compute. VLANs are - great for these scenarios. -
-
- Public Addressing Options - There are two main types of IP addresses for guest - virtual machines: Fixed IPs and Floating IPs. Fixed IPs - are assigned to instances on boot, whereas Floating IP - addresses can change their association between instances - by action of the user. Both types of IP addresses can - either be public or private, depending on your use - case. - Fixed IP addresses are required, whereas it is possible - to run OpenStack without Floating IPs. One of the most - common use cases for Floating IPs is to provide public IP - addresses to a private cloud, where there are a limited - number of IP addresses available. Another is for a public - cloud user to have a "static" IP address that can be - reassigned when an instance is upgraded or moved. - Fixed IP addresses can be private for private clouds, or - public for public clouds. When an instance terminates, its - Fixed IP is lost. It is worth noting that newer users of - cloud computing may find their ephemeral nature - frustrating. -
-
- IP Address Planning - An OpenStack installation can potentially have many - subnets, and different types of services in each. An IP - address plan can assist with a shared understanding of - network partition purposes and scalability. Control - services can have public and private IP addresses, and as - noted above there are a couple of options for instance's - public addresses. - An IP address plan might be broken down into the - following sections: - - - - subnet router - Packets leaving the subnet go via this - address, which could be a dedicated router - or a nova-network service. - - - control services public - interfaces - Public access to - swift-proxy, - nova-api, - glance-api and horizon - come to these addresses, which could be on - one side of a load balancer, or pointing - at individual machines. - - - Object Storage cluster internal - communications - Traffic amongst object/account/container - servers and between these and the proxy - server's internal interface uses this - private network. - - - compute and storage - communications - If ephemeral or block storage is - external to the compute node, this network - is used. - - - out-of-band remote - management - If a dedicated remote access controller - chip is included in servers, often these - are on a separate network. - - - in-band remote management - Often, an extra (such as, 1 GB) - interface on compute or storage nodes is - used for system administrators or - monitoring tools to access the host - instead of going through the public - interface. - - - spare space for future - growth - Adding more public-facing control - services, or guest instance IPs should - always be part of your plan. - - - - For example, take a deployment which has both OpenStack - Compute and Object Storage, with private ranges - 172.22.42.0/24 and 172.22.87.0/26 available. One way to - segregate the space might be: - 172.22.42.0/24 -172.22.42.1 - 172.22.42.3 - subnet routers -172.22.42.4 - 172.22.42.20 - spare for networks -172.22.42.21 - 172.22.42.104 - Compute node remote access controllers (inc spare) -172.22.42.105 - 172.22.42.188 - Compute node management interfaces (inc spare) -172.22.42.189 - 172.22.42.208 - Swift proxy remote access controllers (inc spare) -172.22.42.209 - 172.22.42.228 - Swift proxy management interfaces (inc spare) -172.22.42.229 - 172.22.42.252 - Swift storage servers remote access controllers (inc spare) -172.22.42.253 - 172.22.42.254 - spare -172.22.87.0/26: -172.22.87.1 - 172.22.87.3 - subnet routers -172.22.87.4 - 172.22.87.24 - Swift proxy server internal interfaces (inc spare) -172.22.87.25 - 172.22.87.63 - Swift object server internal interfaces (inc spare) - A similar approach can be taken with public IP - addresses, taking note that large, flat ranges are - preferred for use with guest instance IPs. Take into - account that for some OpenStack networking options, a - public IP address in the range of a guest instance public - IP address is assigned to the nova-compute host. -
- -
- Network Topology - OpenStack Compute provides several network managers, - each with their own strengths and weaknesses. The - selection of a network manager changes your network - topology, so the choice should be made carefully. - - - - Type - Strengths - Weaknesses - - - - - - Flat - Extremely simple. No DHCP - broadcasts. - Requires file injection into the - instance. Limited to certain - distributions of Linux. - Difficult to configure and is not - recommended. - - - FlatDHCP - Relatively simple to setup. - Standard networking. Works - with all operating systems. - Requires its own DHCP broadcast - domain. - - - VlanManager - Each tenant is isolated to their own - VLANs. - More complex to set up. - Requires its own DHCP broadcast - domain. Requires many VLANs - to be trunked onto a single - port. Standard VLAN number - limitation. Switches must - support 802.1q VLAN tagging. - - - FlatDHCP Multi-host HA - Networking failure is isolated to the - VMs running on the hypervisor - affected. DHCP traffic can be - isolated within an individual - host. Network traffic is - distributed to the compute - nodes. - More complex to set up. By - default, compute nodes need public IP - addresses. Options must be - carefully configured for live migration to - work with networking. - - - - -
- VLANs - VLAN configuration can be as simple or as - complicated as desired. The use of VLANs has the - benefit of allowing each project its own subnet and - broadcast segregation from other projects. to allow - OpenStack to efficiently use VLANs, you must allocate - a VLAN range (one for each project) and turn each - compute node switch port into a trunk port. - For example, if you estimate that your cloud must - support a max of 100 projects, pick a free VLAN range - that your network infrastructure is currently not - using (such as, VLAN 200 - 299). You must configure - OpenStack with this range as well as configure your - switch ports to allow VLAN traffic from that - range. -
- -
- Multi-NIC - OpenStack Compute has the ability to assign multiple - NICs to instances on a per-project basis. This is - generally an advanced feature and not an everyday - request. This can easily be done on a per-request - basis, though. However, be aware that a second NIC - uses up an entire subnet or VLAN. This decrements your - total number of supported projects by one. -
-
- Multi-host and Single-host Networking - The nova-network service has the ability to operate - in a multi-host or single-host mode. Multi-host is - when each compute node runs a copy of nova-network and - the instances on that compute node use the compute - node as a gateway to the Internet. The compute nodes - also host the Floating IPs and Security Groups for - instances on that node. Single-host is when a central - server, for example, the cloud controller, runs the - nova-network service. All compute - nodes forward traffic from the instances to the cloud - controller. The cloud controller then forwards traffic - to the Internet. The cloud controller hosts the - Floating IPs and Security Groups for all instances on - all compute nodes in the cloud. - There are benefits to both modes. Single-node has - the downside of a single point of failure. If the - cloud controller is not available, instances cannot - communicate on the network. This is not true with - multi-host, but multi-host requires that each compute - node has a public IP address to communicate on the - Internet. If you are not able to obtain a significant - block of public IP addresses, multi-host might not be - an option. -
-
-
- Services for Networking - OpenStack, like any network application, has a number of - the standard considerations to apply, such as DNS and - NTP. - -
- NTP - Time synchronisation is a critical element to ensure - continued operation of OpenStack components. Correct - time is necessary to avoid errors in instance - scheduling, replication of objects in the object - store, and even matching log timestamps for - debugging. - All servers running OpenStack components should be - able to access an appropriate NTP server. You may - decide to set one up locally, or use the public pools - available from http://www.pool.ntp.org/ -
- DNS - OpenStack does not currently provide DNS - services, aside from the dnsmasq daemon which - resides on nova-network hosts. You - could consider providing a dynamic DNS service to - allow instances to update a DNS entry with new IP - addresses. You can also consider making a generic - forward and reverse DNS mapping for instance's IP - addresses, such as - vm-203-0-113-123.example.com. -
-
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_provision.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_provision.xml deleted file mode 100644 index e6e16694292..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_provision.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - -]> - - - Provisioning and Deployment - A critical part of a cloud's scalability is the amount of - effort that it takes to run your cloud. To minimize the - operational cost of running your cloud, set up and use an - automated deployment and configuration infrastructure. - This infrastructure includes systems to automatically - install the operating system's initial configuration and later - coordinate the configuration of all services automatically and - centrally, which reduces both manual effort and chance for - error. -
- Automated Deployment - An automated deployment system installs and configures - operating systems on new servers, without intervention, - after the absolute minimum amount of manual work, - including physical racking, MAC to IP assignment, power - configuration, and so on. Typically solutions rely on - wrappers around PXE boot and TFTP servers for the basic - operating system install, then hand off to an automated - configuration management system. - Ubuntu and Red Hat Linux both include mechanisms for - configuring the operating system, including preseed and - kickstart, that you can use after a network boot. - Typically these are used to bootstrap an automated - configuration system. Alternatively, you can use an - image-based approach for deploying the operating system, - such as systemimager. You can use both approaches with a - virtualized infrastructure, such as when you run VMs to - separate your control services and physical - infrastructure. - When you create a deployment plan, focus on a few vital - areas because they are very hard to modify - post-deployment. - -
- Disk Partitioning and RAID - At the very base of any operating system are the - hard drives on which the OS is installed. - You must complete the following configurations on - the server's hard drives: - - - Partitioning - - - Adding to a RAID array - - - The simplest option is to use one hard drive with - two partitions: - - - File system - - - Swap space - - - RAID is not used in this setup. - - This option is not recommended for production - because if the hard drive fails, that entire - server is down. Instead, we recommend that you use - more than one disk. The number of disks determine - what types of RAID arrays to build. - - - We recommend that you choose one of the following - multiple disk options: - - - Option 1: - Partition all drives in the same way in a - horizontal fashion, as shown in the following - diagram: - - - - - - - With this option, you can assign different - partitions to different RAID arrays. You can - allocate partition 1 of disk one and two to - the /boot partition mirror. You - can make partition 2 of all disks the root - partition mirror. You can use partition 3 of - all disks for a cinder-volumes - LVM partition running on a RAID 10 - array. - While you might end up with unused - partitions, such as partition 1 in disk three - and four of this example, it allows for - maximum utilization of disk space. I/O - performance might be an issue due to all disks - being used for all tasks. - - - Option 2: - Add all raw disks to one large RAID array, - either hardware or software based. You can - partition this large array with the boot, - root, swap, and LVM areas. This option is - simple to implement and uses all partitions. - However, disk I/O might suffer. - - - - Option 3: - Dedicate entire disks to certain partitions. - For example, you could allocate disk one and - two entirely to the boot, root, and swap - partitions under a RAID 1 mirror. Then, - allocate disk 3 and 4 entirely to the LVM - partition, also under a RAID 1 mirror. Disk - I/O should be better because I/O is focused on - dedicated tasks. However, the LVM partition is - much smaller. - - - As with most architecture choices, the right answer - depends on your environment. -
-
- Network Configuration - Network configuration is a very large topic that - spans multiple areas of this book. For now, make sure - that your servers can PXE boot and successfully - communicate with the deployment server. - For example, you usually cannot configure NICs for - VLANs when PXE booting. Additionally, you usually - cannot PXE boot with bonded NICs. If you run into this - scenario, consider using a simple 1 GB switch in a - private network on which only your cloud - communicates. -
-
-
- Automated Configuration - The purpose of automatic configuration management is to - establish and maintain the consistency of a system with no - human intervention. You want to maintain consistency in - your deployments so you can have the same cloud every - time, repeatably. Proper use of automatic configuration - management tools ensures that components of the cloud - systems are in particular states, in addition to - simplifying deployment, and configuration change - propagation. - These tools also make it possible to test and roll back - changes, as they are fully repeatable. Conveniently, a - large body of work has been done by the OpenStack - community in this space. Puppet – a configuration - management tool – even provides official modules for - OpenStack. - An integral part of a configuration management system is - the items that it controls. You should carefully consider - all of the items that you want, or do not want, to be - automatically managed. -
- -
- Remote Management - In our experience, most operators don't sit right next - to the servers running the cloud, and many don't - necessarily enjoy visiting the data center. OpenStack - should be entirely remotely configurable, but sometimes - not everything goes according to plan. - In this instance, having an out-of-band access into - nodes running OpenStack components, is a boon. The IPMI - protocol is the de-facto standard here, and acquiring - hardware that supports it is highly recommended to achieve - that lights-out data center aim. - In addition, consider remote power control as well. - While IPMI usually controls the server's power state, - having remote access to the PDU that the server is plugged - into can really be useful for situations when everything - seems wedged. -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_scaling.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_scaling.xml deleted file mode 100644 index 516ae2b3fcc..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_scaling.xml +++ /dev/null @@ -1,491 +0,0 @@ - - - - - - - - -]> - - - Scaling - If your cloud is successful, eventually you must add - resources to meet the increasing demand. OpenStack is designed - to be horizontally scalable. Rather than switching to larger - servers, you procure more servers. Ideally, you scale out and - load balance among functionally-identical services. -
- The Starting Point - Determining the scalability of your cloud and how to - improve it is an exercise with many variables to balance. - No one solution meets everyone's scalability aims. - However, it is helpful to track a number of - metrics. - The starting point for most is the core count of your - cloud. By applying some ratios, you can gather information - about the number of virtual machines (VMs) you expect to - run ((overcommit fraction × cores) / virtual cores - per instance), how much storage is required - (flavor disk size × number of instances). - You can use these ratios to determine how much additional - infrastructure you need to support your cloud. - The default OpenStack flavors are: - - - - Name - Virtual cores - Memory - Disk - Ephemeral - - - - - m1.tiny - 1 - 512 MB - 0 GB - 0 GB - - - m1.small - 1 - 2 GB - 10 GB - 20 GB - - - m1.medium - 2 - 4 GB - 10 GB - 40 GB - - - m1.large - 4 - 8 GB - 10 GB - 80 GB - - - m1.xlarge - 8 - 16 GB - 10 GB - 160 GB - - - - - Assume that the following set-up supports (200 / 2) × 16 - = 1600 VM instances and requires 80 TB of storage for - /var/lib/nova/instances: - - - 200 physical cores - - - Most instances are size m1.medium (2 virtual - cores, 50 GB of storage) - - - Default CPU over-commit ratio - (cpu_allocation_ratio in - nova.conf) of 16:1 - - - However, you need more than the core count alone to - estimate the load that the API services, database servers, - and queue servers are likely to encounter. You must also - consider the usage patterns of your cloud. - As a specific example, compare a cloud that supports a - managed web hosting platform with one running integration - tests for a development project that creates one VM per - code commit. In the former, the heavy work of creating a - VM happens only every few months, whereas the latter puts - constant heavy load on the cloud controller. You must - consider your average VM lifetime, as a larger number - generally means less load on the cloud controller. - - Aside from the creation and termination of VMs, you must - consider the impact of users accessing the service - — particularly on nova-api and its associated database. - Listing instances garners a great deal of information and, - given the frequency with which users run this operation, a - cloud with a large number of users can increase the load - significantly. This can even occur without their knowledge - — leaving the OpenStack Dashboard instances tab open in - the browser refreshes the list of VMs every 30 - seconds. - After you consider these factors, you can determine how - many cloud controller cores you require. A typical 8 core, - 8 GB of RAM server is sufficient for up to a rack of - compute nodes — given the above caveats. - You must also consider key hardware specifications for - the performance of user VMs. You must consider both budget - and performance needs. Examples include: Storage - performance (spindles/core), memory availability - (RAM/core), network bandwidth (Gbps/core), and overall CPU - performance (CPU/core). - For which metrics to track to determine how to scale - your cloud, see . - -
- -
- Adding Controller Nodes - You can facilitate the horizontal expansion of your - cloud by adding nodes. Adding compute nodes is - straightforward — they are easily picked up by the - existing installation. However, you must consider some - important points when you design your cluster to be highly - available. - Recall that a cloud controller node runs several - different services. You can install services that - communicate only using the message queue internally - — nova-scheduler and - nova-console — on a new server for - expansion. However, other integral parts require more - care. - You should load balance user-facing services such as - Dashboard, nova-api or the Object Storage - proxy. Use any standard HTTP load balancing method (DNS - round robin, hardware load balancer, software like Pound - or HAProxy). One caveat with Dashboard is the VNC proxy, - which uses the WebSocket protocol — something that a L7 - load balancer might struggle with. See also Horizon session storage - (http://docs.openstack.org/developer/horizon/topics/deployment.html#session-storage). - You can configure some services, such as - nova-api and glance-api, to - use multiple processes by changing a flag in their - configuration file — allowing them to share work between - multiple cores on the one machine. - Several options are available for MySQL load balancing, - and RabbitMQ has in-built clustering support. Information - on how to configure these and many of the other services - can be found in the Operations - Section. - -
- -
- Segregating Your Cloud - Use one of the following OpenStack methods to segregate - your cloud: cells, - regions, - zones and host - aggregates. Each method provides different - functionality, as described in the following table: - - - - - Cells - Regions - Availability Zones - Host Aggregates - - - - - Use when you - need - - A single API - endpoint for compute, or - you require a second level of - scheduling. - Discrete regions with separate API - endpoints and no coordination between - regions. - Logical separation within your nova - deployment for physical isolation or - redundancy. - To schedule a group of hosts with common - features. - - - Example - - A cloud with multiple sites where you - can schedule VMs "anywhere" or on a - particular site. - A cloud with multiple sites, where you - schedule VMs to a particular site and you - want a shared infrastructure. - A single site cloud with equipment fed - by separate power supplies. - Scheduling to hosts with trusted - hardware support. - - - Overhead - - - - - A new service, - nova-cells - - - Each cell has a full nova - installation except - nova-api - - - - - - - A different API endpoint for - every region. - - - Each region has a full nova - installation. - - - - - - - Configuration changes to - nova.conf - - - - - - - Configuration changes to - nova.conf - - - - - - Shared - services - - Keystonenova-api - - Keystone - KeystoneAll nova - services - KeystoneAll nova - services - - - - This array of options can be best divided into two - — those which result in running separate nova deployments - (cells and regions), and those which merely divide a - single deployment (availability - zones and host aggregates). - -
- Cells and Regions - OpenStack Compute cells are designed to allow - running the cloud in a distributed fashion without - having to use more complicated technologies, or being - invasive to existing nova installations. Hosts in a - cloud are partitioned into groups called - cells. Cells are configured - in a tree. The top-level cell ("API cell") has a host - that runs the nova-api service, but no - nova-compute services. Each child - cell runs all of the other typical nova-* - services found in a regular installation, except for - the nova-api service. Each cell has its - own message queue and database service, and also runs - nova-cells — which manages the - communication between the API cell and child - cells. - This allows for a single API server being used to - control access to multiple cloud installations. - Introducing a second level of scheduling (the cell - selection), in addition to the regular - nova-scheduler selection of hosts, - provides greater flexibility to control where virtual - machines are run. - Contrast this with regions. Regions have a separate - API endpoint per installation, allowing for a more - discrete separation. Users wishing to run instances - across sites have to explicitly select a region. - However, the additional complexity of a running a new - service is not required. - The OpenStack Dashboard (Horizon) currently only - uses a single region, so one dashboard service should - be run per region. Regions are a robust way to share - some infrastructure between OpenStack Compute - installations, while allowing for a high degree of - failure tolerance. -
-
- Availability Zones and Host Aggregates - You can use availability zones, host aggregates, or - both to partition a nova deployment. - Availability zones are implemented through and - configured in a similar way to host aggregates. - However, you use an availability zone and a host - aggregate for different reasons: - - Availability - zone. Enables you to arrange - OpenStack Compute hosts into logical groups, - and provides a form of physical isolation and - redundancy from other availability zones, such - as by using separate power supply or network - equipment. - You define the availability zone in which a - specified Compute host resides locally on each - server. An availability zone is commonly used - to identify a set of servers that have a - common attribute. For instance, if some of the - racks in your data center are on a separate - power source, you can put servers in those - racks in their own availability zone. - Availability zones can also help separate - different classes of hardware. - When users provision resources, they can - specify from which availability zone they - would like their instance to be built. This - allows cloud consumers to ensure that their - application resources are spread across - disparate machines to achieve high - availability in the event of hardware - failure. - - - Host - aggregate. Enables you to - partition OpenStack Compute deployments into - logical groups for load balancing and instance - distribution. You can use host aggregates to - further partition an availability zone. For - example, you might use host aggregates to - partition an availability zone into groups of - hosts that either share common resources, such - as storage and network, or have a special - property, such as trusted computing - hardware. - A common use of host aggregates is to - provide information for use with the - nova-scheduler. For example, you might use a - host aggregate to group a set of hosts that - share specific flavors or images. - - Previously, all services had an availability zone. Currently, - only the nova-compute service has its own - availability zone. Services such as - nova-scheduler, nova-network, nova-conductor have - always spanned all availability zones.When you run any of the following operations, the services - appear in their own internal availability zone - (CONF.internal_service_availability_zone): - - nova host-list (os-hosts) - - - euca-describe-availability-zones - verbose - - - nova-manage service list - - The internal availability zone is - hidden in euca-describe-availability_zones - (non-verbose). - CONF.node_availability_zone has been renamed to - CONF.default_availability_zone and is only used by - the nova-api and nova-scheduler services. - CONF.node_availability_zone still works but is - deprecated. -
-
-
- Scalable Hardware - While several resources already exist to help with - deploying and installing OpenStack, it's very important to - make sure you have your deployment planned out ahead of - time. This guide expects at least a rack has been set - aside for the OpenStack cloud but also offers suggestions - for when and what to scale. -
- Hardware Procurement - “The Cloud” has been described as a volatile - environment where servers can be created and - terminated at will. While this may be true, it does - not mean that your servers must be volatile. Ensuring - your cloud’s hardware is stable and configured - correctly means your cloud environment remains up and - running. Basically, put effort into creating a stable - hardware environment so you can host a cloud that - users may treat as unstable and volatile. - OpenStack can be deployed on any hardware supported - by an OpenStack-compatible Linux distribution, such as - Ubuntu 12.04 as used in this books' reference - architecture. - Hardware does not have to be consistent, but should - at least have the same type of CPU to support instance - migration. - The typical hardware recommended for use with - OpenStack is the standard value-for-money offerings - that most hardware vendors stock. It should be - straightforward to divide your procurement into - building blocks such as "compute," "object storage," - and "cloud controller," and request as many of these - as desired. Alternately should you be unable to spend - more, if you have existing servers, provided they meet - your performance requirements and virtualization - technology, these are quite likely to be able to - support OpenStack. -
-
- Capacity Planning - OpenStack is designed to increase in size in a - straightforward manner. Taking into account the - considerations in the Scalability chapter — particularly on - the sizing of the cloud controller — it should be - possible to procure additional compute or object - storage nodes as needed. New nodes do not need to be - the same specification, or even vendor, as existing - nodes. - For compute nodes, nova-scheduler will - take care of differences in sizing to do with core - count and RAM amounts, however you should consider the - user experience changes with differing CPU speeds. - When adding object storage nodes, a - weight should be specified - that reflects the capability of - the node. - Monitoring the resource usage and user growth will - enable you to know when to procure. The Monitoring chapter details - some useful metrics. -
-
- Burn-in Testing - Server hardware's chance of failure is high at the - start and the end of its life. As a result, much - effort in dealing with hardware failures while in - production can be avoided by appropriate burn-in - testing to attempt to trigger the early-stage - failures. The general principle is to stress the - hardware to its limits. Examples of burn-in tests - include running a CPU or disk benchmark for several - days. -
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_storage.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_storage.xml deleted file mode 100644 index fbfc2a66e52..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_storage.xml +++ /dev/null @@ -1,548 +0,0 @@ - - - - - - - - - - -'> - -]> - - - Storage Decisions - Storage is found in many parts of the OpenStack stack, and - the differing types can cause confusion to even experienced - cloud engineers. This section focuses on persistent storage - options you can configure with your cloud. -
- OpenStack Storage Concepts - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OpenStack Storage
- Ephemeral storageBlock storageObject storage
Used to…Run operating system and scratch - spaceAdd additional persistent storage to a - virtual machine (VM)Store data, including VM - images
Accessed through…A file systemA block device - that can be partitioned, formatted and - mounted (such as, /dev/vdc)REST API
Accessible from…Within a VMWithin a VMAnywhere
Managed by…OpenStack Compute (Nova)OpenStack Block Storage - (Cinder)OpenStack Object Storage - (Swift)
Persists until…VM is terminatedDeleted by userDeleted by user
Sizing determined by…Administrator configures size settings, - known as flavors - Specified by user in initial - requestAmount of available physical - storage
Example of typical - usage…10 GB first disk, 30GB second - disk1 TB disk - 10s of TBs of dataset storage -
- If you only deploy the OpenStack Compute Service (nova), - your users do not have access to any form of persistent - storage by default. The disks associated with VMs are - "ephemeral", meaning that (from the user's point of view) - they effectively disappear when a virtual machine is - terminated. You must identify what type of persistent - storage you want to support for your users. - Today, OpenStack clouds explicitly support two types of - persistent storage: object storage - and block storage. -
- Object Storage - With object storage, users access binary objects - through a REST API. You may be familiar with Amazon - S3, which is a well-known example of an object storage - system. If your intended users need to archive or - manage large datasets, you want to provide them with - object storage. In addition, OpenStack can store your - virtual machine (VM) images inside of an object - storage system, as an alternative to storing the - images on a file system. -
- -
- Block Storage - Block storage (sometimes referred to as volume - storage) exposes a block device to the user. Users - interact with block storage by attaching volumes to - their running VM instances. - These volumes are persistent: they can be detached - from one instance and re-attached to another, and the - data remains intact. Block storage is implemented in - OpenStack by the OpenStack Block Storage (Cinder) - project, which supports multiple back-ends in the form - of drivers. Your choice of a storage back-end must be - supported by a Block Storage driver. - Most block storage drivers allow the instance to - have direct access to the underlying storage - hardware's block device. This helps increase the - overall read/write IO. - Experimental support for utilizing files as volumes - began in the Folsom release. This initially started as - a reference driver for using NFS with Cinder. By - Grizzly's release, this has expanded into a full NFS - driver as well as a GlusterFS driver. - These drivers work a little differently than a - traditional "block" storage driver. On an NFS or - GlusterFS file system, a single file is created and - then mapped as a "virtual" volume into the instance. - This mapping/translation is similar to how OpenStack - utilizes QEMU's file-based virtual machines stored in - /var/lib/nova/instances. -
-
- File-level Storage - With file-level storage, users access stored data - using the operating system's file system interface. - Most users, if they have used a network storage - solution before, have encountered this form of - networked storage. In the Unix world, the most common - form of this is NFS. In the Windows world, the most - common form is called CIFS (previously, SMB). - OpenStack clouds do not present file-level storage - to end users. However, it is important to consider - file-level storage for storing instances under - /var/lib/nova/instances when - designing your cloud, since you must have a shared - file system if you wish to support live - migration. -
-
- -
- Choosing Storage Back-ends - In general, when you select storage - back-ends, ask the following - questions: - - - Do my users need block storage? - - - Do my users need object storage? - - - Do I need to support live migration? - - - Should my persistent storage drives be contained - in my compute nodes, or should I use external - storage? - - - What is the platter count I can achieve? Do more - spindles result in better I/O despite network - access? - - - Which one results in the best cost-performance - scenario I'm aiming for? - - - How do I manage the storage - operationally? - - - How redundant and distributed is the storage? - What happens if a storage node fails? To what - extent can it mitigate my data-loss disaster - scenarios? - - - To deploy your storage by using entirely commodity - hardware, you can use a number of open-source packages, as - shown in the following table: - - - -   - Object - Block - File-level* (live migration support) - - - - - - Swift - &CHECK; -   -   - - - LVM -   - &CHECK; -   - - - Ceph - &CHECK; - &CHECK; - experimental - - - Gluster - &CHECK; -   - &CHECK; - - - NFS - - &CHECK; - &CHECK; - - - ZFS -   - &CHECK; -   - - - Sheepdog -   - experimental -   - - - - * This list of open-source file-level shared storage - solutions is not exhaustive, other open source solutions - exist (MooseFS). Your organization may already have - deployed a file-level shared storage solution which you - can use. - In addition to the open-source technologies, there are a - number of proprietary solutions that are officially - supported by OpenStack Block Storage. They are offered by - the following vendors: - - - IBM (Storwize family/SVC, XIV) - - - NetApp - - - Nexenta - - - SolidFire - - - You can find a matrix of the functionality provided by - all of the supported Block Storage drivers on the OpenStack wiki - (https://wiki.openstack.org/wiki/CinderSupportMatrix). - Also, you need to decide whether you want to support - object storage in your cloud. The two common use cases for - providing object storage in a compute cloud are: - - - To provide users with a persistent storage - mechanism - - - As a scalable, reliable data store for virtual - machine images - - -
- Commodity Storage Back-end Technologies - This section provides a high-level overview of the - differences among the different commodity storage - back-end technologies. - - - - OpenStack Object - Storage (Swift). The official - OpenStack Object Store implementation. It is a - mature technology that has been used for - several years in production by Rackspace as - the technology behind Rackspace Cloud Files. - As it is highly scalable, it is well-suited to - managing petabytes of storage. OpenStack - Object Storage's advantages are better - integration with OpenStack (integrates with - OpenStack Identity, works with OpenStack - Dashboard interface), and better support for - multiple data center deployment through - support of asynchronous eventual consistency - replication. - Therefore, if you eventually plan on - distributing your storage cluster across - multiple data centers, if you need unified - accounts for your users for both compute and - object storage, or if you want to control your - object storage with the OpenStack dashboard, - you should consider OpenStack Object Storage. - More detail can be found about OpenStack - Object Storage in the section below. - - - Ceph. A - scalable storage solution that replicates data - across commodity storage nodes. Ceph was - originally developed by one of the founders of - DreamHost and is currently used in production - there. - Ceph was designed to expose different types - of storage interfaces to the end-user: it - supports object storage, block storage, and - file system interfaces, although the file - system interface is not yet considered - production-ready. Ceph supports the same API - as Swift for object storage, can be used as a - back-end for Cinder block storage, as well as - back-end storage for Glance images. Ceph - supports "thin provisioning", implemented - using copy-on-write. - This can be useful when booting from volume - because a new volume can be provisioned very - quickly. Ceph also supports keystone-based - authentication (as of version 0.56), so it can - be a seamless swap in for the default - OpenStack Swift implementation. - Ceph's advantages are that it gives the - administrator more fine-grained control over - data distribution and replication strategies, - enables you to consolidate your object and - block storage, enables very fast provisioning - of boot-from-volume instances using thin - provisioning, and supports a distributed file - system interface, though this interface is - not yet recommended - (http://ceph.com/docs/master/faq/) for use in - production deployment by the Ceph project. - If you wish to manage your object and block - storage within a single system, or if you wish - to support fast boot-from-volume, you should - consider Ceph. - - - Gluster. A - distributed, shared file system. As of Gluster - version 3.3, you can use Gluster to - consolidate your object storage and file - storage into one unified file and object - storage solution, which is called Gluster UFO. - Gluster UFO uses a customizes version of Swift - that uses Gluster as the back-end. - The main advantage of using Gluster UFO over - regular Swift is if you also want to support a - distributed file system, either to support - shared storage live migration or to provide it - as a separate service to your end-users. If - you wish to manage your object and file - storage within a single system, you should - consider Gluster UFO. - LVM. The - Logical Volume Manager, a Linux-based system - that provides an abstraction layer on top of - physical disks to expose logical volumes to - the operating system. The LVM (Logical Volume - Manager) back-end implements block storage as - LVM logical partitions. - On each host that will house block storage, - an administrator must initially create a - volume group dedicated to Block Storage - volumes. Blocks are created from LVM logical - volumes. - - LVM does not - provide any replication. Typically, - administrators configure RAID on nodes - that use LVM as block storage to protect - against failures of individual hard - drives. However, RAID does not protect - against a failure of the entire - host. - - The Solaris iSCSI driver for OpenStack Block - Storage implements blocks as ZFS entities. ZFS - is a file system that also has functionality - of a volume manager. This is unlike on a Linux - system, where there is a separation of volume - manager (LVM) and file system (such as, ext3, - ext4, xfs, btrfs). ZFS has a number of - advantages over ext4, including improved data - integrity checking. - The ZFS back-end for OpenStack Block Storage - only supports Solaris-based systems such as - Illumos. While there is a Linux port of ZFS, - it is not included in any of the standard - Linux distributions, and it has not been - tested with OpenStack Block Storage. As with - LVM, ZFS does not provide replication across - hosts on its own, you need to add a - replication solution on top of ZFS if your - cloud needs to be able to handle storage node - failures. - We don't recommend ZFS unless you have - previous experience with deploying it, since - the ZFS back-end for Block Storage requires a - Solaris-based operating system and we assume - that your experience is primarily with - Linux-based systems. - - - Sheepdog. A - recent project that aims to provide block - storage for KVM-based instances, with support - for replication across hosts. We don't - recommend Sheepdog for a production cloud, - because its authors at NTT Labs consider - Sheepdog as an experimental technology. - - -
-
- -
- Notes on OpenStack Object Storage - OpenStack Object Storage provides a highly scalable, - highly available storage solution by relaxing some of the - constraints of traditional file systems. In designing and - procuring for such a cluster, it is important to - understand some key concepts about its operation. - Essentially, this type of storage is built on the idea - that all storage hardware fails, at every level, at some - point. Infrequently encountered failures that would - hamstring other storage systems, such as issues taking - down RAID cards, or entire servers are handled gracefully - with OpenStack Object Storage. - A good document describing the Object Storage - architecture is found within the developer documentation - (http://docs.openstack.org/developer/swift/overview_architecture.html) - - read this first. Once you have understood the - architecture, you should know what a proxy server does and - how zones work. However, some there important points that - are often missed at first glance. - When designing your cluster, you must consider - durability and availability. Understand that the - predominant source of these is the spread and placement of - your data, rather than the reliability of the hardware. - Consider the default value of the number of replicas, - which is 3. This means that when before an object is - marked as having being written at least two copies exists - - in case a single server fails to write, the third copy - may or may not yet exist when the write operation - initially returns. Altering this number increases the - robustness of your data, but reduces the amount of storage - you have available. Next look at the placement of your - servers. Consider spreading them widely throughout your - data centre's network and power failure zones. Is a zone a - rack, a server or a disk? - Object Storage's network patterns might seem unfamiliar - at first. Consider these main traffic flows: - - Among object, - container, and - account - servers - - - Between those servers and the proxies - - - Between the proxies and your users - - - - Object Storage is very 'chatty' among servers hosting - data - even a small cluster does megabytes/second of - traffic, which is predominantly "Do you have the - object?"/"Yes I have the object!." Of course, if the - answer to the aforementioned question is negative or times - out, replication of the object begins. - Consider the scenario where an entire server fails, and - 24 TB of data needs to be transferred "immediately" to - remain at three copies - this can put significant load on - the network. - Another oft forgotten fact is that when a new file is - being uploaded, the proxy server must write out as many - streams as there are replicas - giving a multiple of - network traffic. For a 3-replica cluster, 10Gbps in means - 30Gbps out. Combining this with the previous high - bandwidth demands of replication is what results in the - recommendation that your private network is of - significantly higher bandwidth than your public need be. - Oh, and OpenStack Object Storage communicates internally - with unencrypted, unauthenticated rsync for performance - - you do want the private network to be private. - The remaining point on bandwidth is the public facing - portion. swift-proxy is stateless, which means that you - can easily add more and use http load-balancing methods to - share bandwidth and availability between them. - More proxies means more bandwidth, if your storage can - keep up. -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_arch_whats_next.xml b/doc/src/docbkx/openstack-ops/src/ch_arch_whats_next.xml deleted file mode 100644 index 985b8a8186e..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_arch_whats_next.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - -]> - - - What's Next? - Congratulations! By now, you should have a solid design for - your cloud. We now recommend that you turn to the OpenStack Install and Deploy Manual - Ubuntu - (http://docs.openstack.org/folsom/openstack-compute/install/apt/content/), - which contains a step-by-step guide on how to manually install - the OpenStack packages and dependencies on your cloud. - While it is important for an operator to be familiar with - the steps involved in deploying OpenStack, we also strongly - encourage you to evaluate configuration management tools such - as Puppet or - Chef that can help automate this - deployment process. - In the remainder of the guide, we assume that you have - successfully deployed an OpenStack cloud and are able to - perform basic operations such as adding images, booting - instances, and attaching volumes. - As your focus turns to stable operations, we recommend you - do an initial skim of the remainder of the book to get a sense - of the content. Some of this content is useful to read in - advance, so that you can put best practices into effect to - simplify your life in the long run. Other content is more - useful as a reference that you might refer when an unexpected - event occurs, such a power failure or troubleshooting a - particular problem. - diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_backup_recovery.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_backup_recovery.xml deleted file mode 100644 index 9fac5f41f25..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_backup_recovery.xml +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - -]> - - - Backup and Recovery - Standard backup best practices apply when creating your - OpenStack backup policy. For example, how often to backup your - data is closely related to how quickly you need to recover - from data loss. - If you cannot have any data loss at - all, you should focus on High Availability as well as - backups. - Other backup considerations include: - - - How many backups to keep? - - - Should backups be kept off-site? - - - How often should backups be tested? - - - Just as important as a backup policy is a recovery policy - (or at least recovery testing). - - -
- What to Backup - While OpenStack is composed of many components and - moving parts, backing up the critical data is quite - simple. - This chapter describes only how to back up configuration - files and databases that the various OpenStack components - need to run. This chapter does not describe how to back up - objects inside Object Storage or data contained inside - Block Storage. Generally these areas are left for the user - to back up on their own. -
-
- Database Backups - The example OpenStack architecture designates the Cloud - Controller as the MySQL server. This MySQL server hosts - the databases for Nova, Glance, Cinder, and Keystone. With - all of these databases in one place, it's very easy to - create a database backup: - - # mysqldump --opt --all-databases > - openstack.sql - - If you only want to backup a single database, you can - instead run: - # mysqldump --opt nova > nova.sql - where nova is the database you want to back - up. - You can easily automate this process by creating a cron - job that runs the following script once per day: - #!/bin/bash -backup_dir="/var/lib/backups/mysql" -filename="${backup_dir}/mysql-`hostname`-`eval date +%Y%m%d`.sql.gz" -# Dump the entire MySQL database -/usr/bin/mysqldump --opt --all-databases | gzip > $filename -# Delete backups older than 7 days -find $backup_dir -ctime +7 -type f -delete - This script dumps the entire MySQL database and delete - any backups older than 7 days. -
-
- File System Backups - This section discusses which files and directories should be backed up regularly, organized by service. -
- Compute - The /etc/nova directory on both the - cloud controller and compute nodes should be regularly - backed up. - - /var/log/nova does not need backed up if - you have all logs going to a central area. It is - highly recommended to use a central logging server or - backup the log directory. - - /var/lib/nova is another important - directory to backup. The exception to this is the - /var/lib/nova/instances subdirectory - on compute nodes. This subdirectory contains the KVM - images of running instances. You would only want to - back up this directory if you need to maintain backup - copies of all instances. Under most circumstances, you - do not need to do this, but this can vary from cloud - to cloud and your service levels. Also be aware that - making a backup of a live KVM instance can cause that - instance to not boot properly if it is ever restored - from a backup. -
-
- Image Catalog and Delivery - - /etc/glance and - /var/log/glance follow the same rules - at the nova counterparts. - - /var/lib/glance should also be backed up. - Take special notice of - /var/lib/glance/images. If you are - using a file-based back-end of Glance, - /var/lib/glance/images is where the - images are stored and care should be taken. - There are two ways to ensure stability with this - directory. The first is to make sure this directory is - run on a RAID array. If a disk fails, the directory is - available. The second way is to use a tool such as - rsync to replicate the images to another - server: - # rsync -az --progress /var/lib/glance/images - backup-server:/var/lib/glance/images/ -
-
- Identity - - /etc/keystone and - /var/log/keystone follow the same - rules as other components. - - /var/lib/keystone, while should not - contain any data being used, can also be backed up - just in case. -
-
- Block Storage - - /etc/cinder and - /var/log/cinder follow the same rules - as other components. - - /var/lib/cinder should also be backed - up. -
-
- Object Storage - - /etc/swift is very important to have - backed up. This directory contains the Swift - configuration files as well as the ring files and ring - builder files, which if - lost render the data on your cluster inaccessible. A - best practice is to copy the builder files to all - storage nodes along with the ring files. Multiple - backups copies are spread throughout your storage - cluster. -
-
-
- Recovering Backups - Recovering backups is a fairly simple process. To begin, - first ensure that the service you are recovering is not - running. For example, to do a full recovery of nova on the - cloud controller, first stop all nova - services: - # stop nova-api - # stop nova-cert - # stop nova-consoleauth - # stop nova-novncproxy - # stop nova-objectstore - # stop nova-scheduler - Once that's done, stop MySQL: - # stop mysql - Now you can import a previously backed up - database: - # mysql nova < nova.sql - As well as restore backed up nova directories: - # mv /etc/nova{,.orig} - # cp -a /path/to/backup/nova /etc/ - Once the files are restored, start everything back - up: - # start mysql - # for i in nova-api nova-cert nova-consoleauth nova-novncproxy nova-objectstore nova-scheduler - > do - > start $i - > done - - Other services follow the same process, with their - respective directories and databases. -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_customize.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_customize.xml deleted file mode 100644 index c9765aa1351..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_customize.xml +++ /dev/null @@ -1,1016 +0,0 @@ - - - - - - - - -]> - - - Customize - OpenStack might not do everything you need it to do out of - the box. In these cases, you can follow one of two major - paths. First, you can learn How To Contribute - (https://wiki.openstack.org/wiki/How_To_Contribute), follow - the Code Review Workflow - (https://wiki.openstack.org/wiki/GerritWorkflow), make your - changes and contribute them back to the upstream OpenStack - project. This path is recommended if the feature you need - requires deep integration with an existing project. The - community is always open to contributions and welcomes new - functionality that follows the feature development - guidelines. - Alternately, if the feature you need does not require deep - integration, there are other ways to customize OpenStack. If - the project where your feature would need to reside uses the - Python Paste framework, you can create middleware for it and - plug it in through configuration. There may also be specific - ways of customizing an project such as creating a new - scheduler for OpenStack Compute or a customized Dashboard. - This chapter focuses on the second method of customizing - OpenStack. - To customize OpenStack this way you'll need a development - environment. The best way to get an environment up and running - quickly is to run DevStack within your cloud. - -
- DevStack - You can find all of the documentation at the DevStack - (http://devstack.org/) website. Depending on which project - you would like to customize, either Object Storage (swift) - or another project, you must configure DevStack - differently. For the middleware example below, you must - install with the Object Store enabled. - - - To run DevStack for the stable Folsom branch on an - instance: - - - Boot an instance from the Dashboard or the nova - command-line interface (CLI) with the following - parameters. - - - Name: devstack - - - Image: Ubuntu 12.04 LTS - - - Memory Size: 4 GB RAM (you could - probably get away with 2 GB) - - - Disk Size: minimum 5 GB - - - If you are using the nova client, - specify --flavor 6 on the nova - boot command to get adequate memory and - disk sizes. - - - If your images have only a root user, you must - create a "stack" user. Otherwise you run into - permission issues with screen if you let - stack.sh create the "stack" user - for you. If your images already have a user other - than root, you can skip this step. - - - - - ssh root@<IP Address> - - - - - adduser --gecos "" stack - - - - Enter a new password at the - prompt. - - - - adduser stack sudo - - - - - grep -q - "^#includedir.*/etc/sudoers.d" - /etc/sudoers || echo "#includedir - /etc/sudoers.d" >> - /etc/sudoers - - - - - ( umask 226 && echo "stack - ALL=(ALL) NOPASSWD:ALL" > - /etc/sudoers.d/50_stack_sh ) - - - - - exit - - - - - - - Now login as the stack user and set up - DevStack. - - - - ssh stack@<IP address> - - - - At the prompt, enter the password that - you created for the stack user.  - - - - sudo apt-get -y update - - - - - sudo apt-get -y install git - - - - - git clone - https://github.com/openstack-dev/devstack.git -b - stable/folsom devstack/ - - - - - cd devstack - - - - - vim localrc - - - For Swift only, used in the - Middleware - Example, see the - example [1] - Swift only localrc - below - - - For all other projects, used - in the Nova - Scheduler Example, see - the example [2] All other projects - localrc below - - - - - - source localrc - - - - - ./stack.sh - - - - - screen -r stack  - - - - - - The stack.sh script - takes a while to run. Perhaps take - this opportunity to join the OpenStack - foundation - (http://www.openstack.org/join/). - - - When you run - stack.sh, you might - see an error message that reads - “ERROR: at least one RPC back-end - must be enabled”. Don’t worry about - it; swift and keystone do not need - an RPC (AMQP) back-end. You can - also ignore any - ImportErrors. - - - Screen is a useful program for - viewing many related services at - once. For more information, see - GNU screen quick reference. - (http://aperiodic.net/screen/quick_reference) - - - - - - - Now that you have an OpenStack development environment, - you're free to hack around without worrying about damaging - your production deployment. Proceed to either the - Middleware Example - for a Swift-only environment, or the Nova Scheduler Example for all other - projects. - - - [1] Swift only localrc - - ADMIN_PASSWORD=devstack -MYSQL_PASSWORD=devstack -RABBIT_PASSWORD=devstack -SERVICE_PASSWORD=devstack -SERVICE_TOKEN=devstack - -SWIFT_HASH=66a3d6b56c1f479c8b4e70ab5c2000f5 -SWIFT_REPLICAS=1 - -# Uncomment the BRANCHes below to use stable versions - - -# unified auth system (manages accounts/tokens) -KEYSTONE_BRANCH=stable/folsom - # object storage -SWIFT_BRANCH=stable/folsom - -disable_all_services -enable_service key swift mysql - - [2] All other projects - localrc - - ADMIN_PASSWORD=devstack -MYSQL_PASSWORD=devstack -RABBIT_PASSWORD=devstack -SERVICE_PASSWORD=devstack -SERVICE_TOKEN=devstack - -FLAT_INTERFACE=br100 -PUBLIC_INTERFACE=eth0 - -VOLUME_BACKING_FILE_SIZE=20480M - -# For stable versions, look for branches named stable/[milestone]. - -# compute service -NOVA_BRANCH=stable/folsom - -# volume service -CINDER_BRANCH=stable/folsom - -# image catalog service -GLANCE_BRANCH=stable/folsom - -# unified auth system (manages accounts/tokens) -KEYSTONE_BRANCH=stable/folsom - -# django powered web control panel for openstack -HORIZON_BRANCH=stable/folsom -
-
- Middleware Example - Most OpenStack projects are based on the Python Paste(http://pythonpaste.org/) framework. The best - introduction to its architecture is A Do-It-Yourself Framework - (http://pythonpaste.org/do-it-yourself-framework.html). - Due to the use of this framework, you are able to add - features to a project by placing some custom code in a - project's pipeline without having to change any of the - core code. - To demonstrate customizing OpenStack like this, we'll - create a piece of middleware for swift that allows access - to a container from only a set of IP addresses, as - determined by the container's metadata items. Such an - example could be useful in many contexts. For example, you - might have public access to one of your containers, but - what you really want to restrict it to is a set of IPs - based on a whitelist. - - This example is for illustrative purposes only. It - should not be used as a container IP whitelist - solution without further development and extensive - security testing. - - When you join the screen session that - stack.sh starts with screen -r - stack, you're greeted with three screens if you - used the localrc file with just Swift installed. - 0$ shell*  1$ key  2$ swift - The asterisk * indicates which screen you are on. - - - - - 0$ shell - . A shell where you can get some work - done. - - - - - 1$ key - . The keystone service. - - - - - 2$ swift - . The swift proxy service. - - - - To create the middleware and plug it in through - Paste configuration: - - - All of the code for OpenStack lives in - /opt/stack. Go to the swift - directory in the shell screen and edit your - middleware module. - - - - cd /opt/stack/swift - - - - - vim - swift/common/middleware/ip_whitelist.py - - - - - - Copy in the following code. When you're done, - save and close the file. - # Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# - -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -# implied. -# See the License for the specific language governing permissions and -# limitations under the License. -import socket - -from swift.common.utils import get_logger -from swift.proxy.controllers.base import get_container_info -from swift.common.swob import Request, Response - -class IPWhitelistMiddleware(object): -""" -IP Whitelist Middleware - -Middleware that allows access to a container from only a set of IP -addresses as determined by the container's metadata items that start -with the prefix 'allow'. E.G. allow-dev=192.168.0.20 -""" - -def __init__(self, app, conf, logger=None): -self.app = app - -if logger: -self.logger = logger -else: -self.logger = get_logger(conf, log_route='ip_whitelist') - -self.deny_message = conf.get('deny_message', "IP Denied") -self.local_ip = socket.gethostbyname(socket.gethostname()) - -def __call__(self, env, start_response): -""" -WSGI entry point. -Wraps env in swob.Request object and passes it down. - -:param env: WSGI environment dictionary -:param start_response: WSGI callable -""" -req = Request(env) - -try: - version, account, container, obj = req.split_path(1, 4, True) - except ValueError: - return self.app(env, start_response) - - container_info = get_container_info( - req.environ, self.app, swift_source='IPWhitelistMiddleware') - - remote_ip = env['REMOTE_ADDR'] - self.logger.debug(_("Remote IP: %(remote_ip)s"), - {'remote_ip': remote_ip}) - - meta = container_info['meta'] - allow = {k:v for k,v in meta.iteritems() if k.startswith('allow')} - allow_ips = set(allow.values()) - allow_ips.add(self.local_ip) - self.logger.debug(_("Allow IPs: %(allow_ips)s"), - {'allow_ips': allow_ips}) - - if remote_ip in allow_ips: - return self.app(env, start_response) - else: - self.logger.debug( - _("IP %(remote_ip)s denied access to Account=%(account)s " - "Container=%(container)s. Not in %(allow_ips)s"), locals()) - return Response( - status=403, - body=self.deny_message, - request=req)(env, start_response) - - - def filter_factory(global_conf, **local_conf): - """ - paste.deploy app factory for creating WSGI proxy apps. - """ - conf = global_conf.copy() - conf.update(local_conf) - - def ip_whitelist(app): - return IPWhitelistMiddleware(app, conf) - return ip_whitelist - - There is a lot of useful information in - env and conf that - you can use to decide what to do with the request. - To find out more about what properties are - available, you can insert the following log - statement into the __init__ - method - self.logger.debug(_("conf = %(conf)s"), locals()) - and the following log statement into the - __call__ method - self.logger.debug(_("env = %(env)s"), locals()) - - - To plug this middleware into the Swift pipeline - you'll need to edit one configuration file. - vim /etc/swift/proxy-server.conf - - - Find the [filter:ratelimit] section - and copy in the following configuration - section. - [filter:ip_whitelist] -paste.filter_factory = swift.common.middleware.ip_whitelist:filter_factory -# You can override the default log routing for this filter here: -# set log_name = ratelimit -# set log_facility = LOG_LOCAL0 -# set log_level = INFO -# set log_headers = False -# set log_address = /dev/log -deny_message = You shall not pass! - - - Find the [pipeline:main] section - and add ip_whitelist to the list like - so. When you're done, save and close the - file. - [pipeline:main] -pipeline = catch_errors healthcheck cache ratelimit ip_whitelist authtoken keystoneauth proxy-logging proxy-server - - - Restart the Swift Proxy service to make Swift - use your middleware. Start by switching to the - swift screen. - - - Press Ctrl-A followed by pressing 2, - where 2 is the label of the screen. You - can also press Ctrl-A followed by pressing - n to go to the next screen. - - - Press Ctrl-C to kill the service. - - - Press Up Arrow to bring up the last - command. - - - Press Enter to run it. - - - - - Test your middleware with the Swift CLI. Start - by switching to the shell screen and finish by - switching back to the swift screen to check the - log output. - - - Press Ctrl-A followed by pressing - 0 - - - - cd ~/devstack - - - - - source openrc - - - - - swift post middleware-test - - - - Press Ctrl-A followed by pressing - 2 - - - - - Among the log statements you'll see the - lines. - proxy-server ... IPWhitelistMiddleware -proxy-server Remote IP: 203.0.113.68 (txn: ...) -proxy-server Allow IPs: set(['203.0.113.68']) (txn: ...) - The first three statements basically have to do - with the fact that middleware doesn't need to - re-authenticate when it interacts with other Swift - services. The last 2 statements are produced by - our middleware and show that the request was sent - from our DevStack instance and was allowed. - - - Test the middleware from outside of DevStack on - a remote machine that has access to your DevStack - instance. - - - - swift - --os-auth-url=http://203.0.113.68:5000/v2.0/ - --os-region-name=RegionOne - --os-username=demo:demo - --os-password=devstack list - middleware-test - - - - Container GET failed: - http://203.0.113.68:8080/v1/AUTH_.../middleware-test?format=json - 403 Forbidden   You shall not pass! - - - - - Check the Swift log statements again and among - the log statements you'll see the lines. - proxy-server Invalid user token - deferring reject downstream -proxy-server Authorizing from an overriding middleware (i.e: tempurl) (txn: ...) -proxy-server ... IPWhitelistMiddleware -proxy-server Remote IP: 198.51.100.12 (txn: ...) -proxy-server Allow IPs: set(['203.0.113.68']) (txn: ...) -proxy-server IP 198.51.100.12 denied access to Account=AUTH_... Container=None. Not in set(['203.0.113.68']) (txn: ...) - Here we can see that the request was denied - because the remote IP address wasn't in the set of - allowed IPs. - - - Back on your DevStack instance add some metadata - to your container to allow the request from the - remote machine. - - - Press Ctrl-A followed by pressing - 0 - - - swift post --meta - allow-dev:198.51.100.12 - middleware-test - - - - - - Now try the command from again and it - succeeds. - - - Functional testing like this is not a replacement for - proper unit and integration testing but it serves to get - you started. - A similar pattern can be followed in all other projects - that use the Python Paste framework. Simply create a - middleware module and plug it in through configuration. - The middleware runs in sequence as part of that project's - pipeline and can call out to other services as necessary. - No project core code is touched. Look for a - pipeline value in the project's - conf or ini configuration - files in /etc/<project> to identify - projects that use Paste. - When your middleware is done, we encourage you to open - source it and let the community know on the OpenStack - mailing list. Perhaps others need the same functionality. - They can use your code, provide feedback, and possibly - contribute. If enough support exists for it, perhaps you - can propose that it be added to the official Swift middleware - (https://github.com/openstack/swift/tree/master/swift/common/middleware). -
-
- Nova Scheduler Example - Many OpenStack projects allow for customization of - specific features using a driver architecture. You can - write a driver that conforms to a particular interface and - plug it in through configuration. For example, you can - easily plug in a new scheduler for nova. The existing - schedulers for nova are feature full and well documented - at Scheduling - (http://docs.openstack.org/folsom/openstack-compute/admin/content/ch_scheduling.html). - However, depending on your user's use cases, the existing - schedulers might not meet your requirements. You might - need to create a new scheduler. - To create a scheduler you must inherit from the class - nova.scheduler.driver.Scheduler. Of the - five methods that you can override, you - must override the two methods - indicated with a "*" below. - - - - update_service_capabilities - - - - - hosts_up - - - - - schedule_live_migration - - - - * schedule_prep_resize - - - - * schedule_run_instance - - - - To demonstrate customizing OpenStack, we'll create an - example of a nova scheduler that randomly places an - instance on a subset of hosts depending on the originating - IP address of the request and the prefix of the hostname. - Such an example could be useful when you have a group of - users on a subnet and you want all of their instances to - start within some subset of your hosts. - - This example is for illustrative purposes only. It - should not be used as a scheduler for Nova without - further development and testing. - - When you join the screen session that - stack.sh starts with screen -r - stack, you are greeted with many - screens. - 0$ shell*  1$ key  2$ g-reg  3$ g-api  4$ n-api  5$ n-cpu  6$ n-crt  7$ n-net  8-$ n-sch ... - - - - - shell - . A shell where you can get some work - done. - - - - - key - . The keystone service. - - - - - g-* - . The glance services. - - - - - n-* - . The nova services. - - - - - n-sch - . The nova scheduler service. - - - - - To create the scheduler and plug it in through - configuration: - - - The code for OpenStack lives in - /opt/stack so go to the nova - directory and edit your scheduler module. - - - - cd /opt/stack/nova - - - - - vim nova/scheduler/ip_scheduler.py - - - - - - Copy in the following code. When you're done, - save and close the file. - # vim: tabstop=4 shiftwidth=4 softtabstop=4 -# Copyright (c) 2013 OpenStack Foundation -# All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -IP Scheduler implementation -""" - -import random - -from nova import exception -from nova.openstack.common import log as logging -from nova import flags -from nova.scheduler import driver - -FLAGS = flags.FLAGS -LOG = logging.getLogger(__name__) - - -class IPScheduler(driver.Scheduler): -""" -Implements Scheduler as a random node selector based on -IP address and hostname prefix. - """ - -def _filter_hosts(self, hosts, hostname_prefix): -"""Filter a list of hosts based on hostname prefix.""" - -hosts = [host for host in hosts if host.startswith(hostname_prefix)] -return hosts - -def _schedule(self, context, topic, request_spec, filter_properties): - """ -Picks a host that is up at random based on -IP address and hostname prefix. -""" - -elevated = context.elevated() -hosts = self.hosts_up(elevated, topic) - -if not hosts: -msg = _("Is the appropriate service running?") -raise exception.NoValidHost(reason=msg) - -remote_ip = context.remote_address - -if remote_ip.startswith('10.1'): -hostname_prefix = 'doc' -elif remote_ip.startswith('10.2'): -hostname_prefix = 'ops' -else: -hostname_prefix = 'dev' - -hosts = self._filter_hosts(hosts, hostname_prefix) -host = hosts[int(random.random() * len(hosts))] - -LOG.debug(_("Request from %(remote_ip)s scheduled to %(host)s") -% locals()) - -return host - -def schedule_run_instance(self, context, request_spec, -admin_password, injected_files, -requested_networks, is_first_time, -filter_properties): -"""Attempts to run the instance""" -instance_uuids = request_spec.get('instance_uuids') -for num, instance_uuid in enumerate(instance_uuids): -request_spec['instance_properties']['launch_index'] = num -try: -host = self._schedule(context, 'compute', request_spec, -filter_properties) -updated_instance = driver.instance_update_db(context, -instance_uuid) -self.compute_rpcapi.run_instance(context, -instance=updated_instance, host=host, -requested_networks=requested_networks, -injected_files=injected_files, -admin_password=admin_password, -is_first_time=is_first_time, -request_spec=request_spec, -filter_properties=filter_properties) -except Exception as ex: -# NOTE(vish): we don't reraise the exception here to make sure -# that all instances in the request get set to -# error properly -driver.handle_schedule_error(context, ex, instance_uuid, -request_spec) - -def schedule_prep_resize(self, context, image, request_spec, -filter_properties, instance, instance_type, -reservations): -"""Select a target for resize.""" -host = self._schedule(context, 'compute', request_spec, -filter_properties) -self.compute_rpcapi.prep_resize(context, image, instance, -instance_type, host, reservations) - There is a lot of useful information in - context, - request_spec, and - filter_properties that you can - use to decide where to schedule the instance. To - find out more about what properties are available - you can insert the following log statements into - the schedule_run_instance method of - the scheduler above. - LOG.debug(_("context = %(context)s") % {'context': context.__dict__})LOG.debug(_("request_spec = %(request_spec)s") % locals())LOG.debug(_("filter_properties = %(filter_properties)s") % locals()) - - - To plug this scheduler into Nova you'll need to - edit one configuration file. - LOG$ vim /etc/nova/nova.conf - - - Find the compute_scheduler_driver - config and change it like so. - LOGcompute_scheduler_driver=nova.scheduler.ip_scheduler.IPScheduler - - - Restart the Nova scheduler service to make Nova - use your scheduler. Start by switching to the - n-sch screen. - - - Press Ctrl-A followed by pressing - 8 - - - Press Ctrl-C to kill the service - - - Press Up Arrow to bring up the last - command - - - Press Enter to run it - - - - - Test your scheduler with the Nova CLI. Start by - switching to the shell screen and finish by - switching back to the n-sch screen to - check the log output. - - - Press Ctrl-A followed by pressing - 0 - - - - cd ~/devstack - - - - - source openrc - - - - - IMAGE_ID=`nova image-list | egrep - cirros | egrep -v "kernel|ramdisk" | - awk '{print $2}'` - - - - - nova boot --flavor 1 --image - $IMAGE_ID scheduler-test - - - - Press Ctrl-A followed by pressing - 8 - - - - - Among the log statements you'll see the - line. - LOG2013-02-27 17:39:31 DEBUG nova.scheduler.ip_scheduler [req-... demo demo] Request from 50.56.172.78 scheduled to -devstack-nova from (pid=4118) _schedule /opt/stack/nova/nova/scheduler/ip_scheduler.py:73 - - - - - - Functional testing like this is not a replacement for - proper unit and integration testing but it serves to get - you started. - A similar pattern can be followed in all other projects - that use the driver architecture. Simply create a module - and class that conform to the driver interface and plug it - in through configuration. Your code runs when that feature - is used and can call out to other services as necessary. - No project core code is touched. Look for a "driver" value - in the project's conf configuration files in - /etc/<project> to identify projects - that use a driver architecture. - When your scheduler is done, we encourage you to open - source it and let the community know on the OpenStack - mailing list. Perhaps others need the same functionality. - They can use your code, provide feedback, and possibly - contribute. If enough support exists for it, perhaps you - can propose that it be added to the official Nova schedulers (https://github.com/openstack/nova/tree/master/nova/scheduler). -
-
- Dashboard - The Dashboard is based on the Python Django (https://www.djangoproject.com/) web - application framework. The best guide to customizing it - has already been written and can be found at Build on Horizon - (http://docs.openstack.org/developer/horizon/topics/tutorial.html). -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_dochistory.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_dochistory.xml deleted file mode 100644 index 18ce5be705f..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_dochistory.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - -]> - - - - Document Change History - - This version of the document replaces and obsoletes all - previous versions. The following table describes the most - recent changes: - - - diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_lay_of_land.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_lay_of_land.xml deleted file mode 100644 index cec3946f86b..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_lay_of_land.xml +++ /dev/null @@ -1,570 +0,0 @@ - - - - - - - - -]> - - - Lay of the Land - From this point forward in the guide, we assume that you - have an OpenStack cloud up and running. This section helps you - set up your working environment and use it to take a look - around your cloud. -
- Client Command Line Tools - We recommend using a combination of the OpenStack - command line interface (CLI) client tools and the - OpenStack Dashboard. Some users with a background in other - cloud technologies may be using the EC2 Compatibility API, - which uses somewhat different naming conventions from the - native API. We highlight those differences. - We strongly suggest that you install the command-line - clients from the Python Package - Index(PyPI) (https://pypi.python.org/) instead - of from the Ubuntu or Fedora packages. The clients are - under heavy development and it is very likely at any given - time the version of the packages distributed by your - operating system vendor are out of date. - The "pip" utility is used to manage package installation - from the PyPI archive and is available in the "python-pip" - package in most Linux distributions. Each OpenStack - project has its own client, so depending on which services - your site runs, install some or all of the following - packages: - - - python-novaclient (nova - CLI) - - - python-glanceclient - (glance CLI) - - - python-keystoneclient - (keystone CLI) - - - python-cinderclient - (cinder CLI) - - - python-swiftclient (swift - CLI) - - - python-quantumclient - (quantum CLI) - - -
- Installing the Tools - To install (or upgrade) a package from the PyPI - archive with pip, as root: - # pip install [--upgrade] <package-name> - To remove the package: - # pip uninstall <package-name> - If you need even newer versions of the clients, pip - can install directly from the upstream git repository - using the -e flag. You must specify a - name for the Python egg that is installed. For - example: - # pip install -e git+https://github.com/openstack/python-novaclient.git#egg=python-novaclient - If you support the EC2 API on your cloud you should - also install the "euca2ools" package or some other EC2 - API tool so you can get the same view your users have. - Using EC2 API based tools is mostly out of the scope - of this guide, though we discuss getting credentials - for use with it. -
-
- Administrative Command Line Tools - There are also several *-manage - command line tools: - - - nova-manage - - - glance-manage - - - keystone-manage - - - cinder-manage - - - Unlike the tools mentioned above, the - *-manage tools must be run from the - cloud controller, as root, because they need read - access to the config files such as - /etc/nova/nova.conf and make queries - directly against the database rather than against the - OpenStack API endpoints. - The existence of the *-manage tools is - a legacy issue. It is a goal of the OpenStack project - to eventually migrate all of the remaining - functionality in the *-manage tools into - the regular client tools. Until that day, you need to - SSH into the cloud controller - node to perform some maintenance - operations that require one of the - *-manage tools. -
- -
- Getting Credentials - You must have the appropriate credentials if you - wish to use the command line tools to make queries - against your OpenStack cloud. By far the easiest way - to obtain authentication - credentials to use with command line clients is to use - the horizon dashboard. From the top right navigation - row, select the Settings link to - access the user settings page where you can set your - language and timezone preferences for the dashboard - view. More importantly, this action changes the left - hand navigation column to include OpenStack - API and EC2 - Credentials links, which let you to - generate files you can source in your shell to - populate the environment variables the command line - tools need to know where your service endpoints are as - well as your authentication information. - For using the OpenStack native tools follow the - OpenStack API link. The top - section lists the URLs of your service endpoints and - below that is a section titled Download - OpenStack RC File. For looking at the - cloud as an administrator, you can choose admin from - the drop-down menu. In this section select the project - you wish to get credentials for and click - Download RC. This generates - a file called openrc.sh, which looks - something like this: - #!/bin/bash - -# With the addition of Keystone, to use an openstack cloud you should -# authenticate against keystone, which returns a **Token** and **Service -# Catalog**. The catalog contains the endpoint for all services the -# user/tenant has access to - including nova, glance, keystone, swift. -# -# *NOTE*: Using the 2.0 *auth api* does not mean that compute api is 2.0. -# We use the 1.1 *compute api* -export OS_AUTH_URL=http://203.0.113.10:5000/v2.0 - -# With the addition of Keystone we have standardized on the term **tenant** -# as the entity that owns the resources. -export OS_TENANT_ID=98333aba48e756fa8f629c83a818ad57 -export OS_TENANT_NAME="test-project" - -# In addition to the owning entity (tenant), openstack stores the entity -# performing the action as the **user**. -export OS_USERNAME=test-user - -# With Keystone you pass the keystone password. -echo "Please enter your OpenStack Password: " -read -s OS_PASSWORD_INPUT -export OS_PASSWORD=$OS_PASSWORD_INPUT - - This does not save your password in plain text, - which is a good thing. But when you source or run - the script, it prompts for your password and then - stores your response in the environment variable - OS_PASSWORD. It is important to - note that this does require interactivity. It is - possible to store a value directly in the script - if you require a non interactive operation, but - you then need to be extremely cautious with the - security and permissions of this file. - - EC2 compatibility credentials can be downloaded from - the "EC2 Credentials" link in the left hand navigation - bar, then selecting the project you want credentials - for and clicking "Download EC2 Credentials". This - generates a zip file with server x509 certificates and - a shell script fragment. Create a new directory in a - secure location as, unlike the default - openrc, these are live credentials - containing all the authentication information required - to access your cloud identity. Extract the zip file - here. You should have cacert.pem, cert.pem, ec2rc.sh - and pk.pem. The ec2rc.sh is similar to - this: - #!/bin/bash - -NOVARC=$(readlink -f "${BASH_SOURCE:-${0}}" 2>/dev/null) ||\ -NOVARC=$(python -c 'import os,sys; print os.path.abspath(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE:-${0}}") -NOVA_KEY_DIR=${NOVARC%/*} -export EC2_ACCESS_KEY=df7f93ec47e84ef8a347bbb3d598449a -export EC2_SECRET_KEY=ead2fff9f8a344e489956deacd47e818 -export EC2_URL=http://203.0.113.10:8773/services/Cloud -export EC2_USER_ID=42 # nova does not use user id, but bundling requires it -export EC2_PRIVATE_KEY=${NOVA_KEY_DIR}/pk.pem -export EC2_CERT=${NOVA_KEY_DIR}/cert.pem -export NOVA_CERT=${NOVA_KEY_DIR}/cacert.pem -export EUCALYPTUS_CERT=${NOVA_CERT} # euca-bundle-image seems to require this set - -alias ec2-bundle-image="ec2-bundle-image --cert $EC2_CERT --privatekey $EC2_PRIVATE_KEY --user 42 --ec2cert $NOVA_CERT" -alias ec2-upload-bundle="ec2-upload-bundle -a $EC2_ACCESS_KEY -s $EC2_SECRET_KEY --url $S3_URL --ec2cert $NOVA_CERT" - To put the EC2 credentials into your environment - source the ec2rc.sh file. -
-
- Command Line Tricks and Traps - The command line tools can be made to show the - OpenStack API calls it's making by passing it the - --debug flag for example: - # nova --debug list - This example shows the HTTP requests from the client - and the responses from the endpoints, which can be - helpful in creating custom tools written to the - OpenStack API. - Keyring Support - (https://wiki.openstack.org/wiki/KeyringSupport) can - be a source of confusion to the point that, as of the - time of this writing, there is a bug report - (https://bugs.launchpad.net/python-novaclient/+bug/1020238) - which has been open, closed as invalid, and reopened - through a few cycles. - The issue is that under some conditions the command - line tools try to use a Python keyring as a credential - cache and, under a subset of those conditions, another - condition can arise where the tools prompt for a - keyring password on each use. If you find yourself in - this unfortunate subset, adding the - --no-cache flag or setting the - environment variable OS_NO_CACHE=1 avoids - the credentials cache. - - This causes the command line tool to - authenticate on each and every interaction with - the cloud. - -
- cURL - - Underlying the use of the command line tools is - the OpenStack API, which is a RESTful API that - runs over HTTP. There may be cases where you want - to interact with the API directly or need to use - it because of a suspected bug in one of the CLI - tools. The best way to do this is use a - combination of cURL - (http://curl.haxx.se/) and another tool to parse - the JSON, such as jq (http://stedolan.github.com/jq/), - from the responses. - - The first thing you must do is authenticate with - the cloud using your credentials to get an - authentication token. - Your credentials are a combination of username, - password, and tenant (project). You can extract - these values from the openrc.sh - discussed above. The token allows you to interact - with your other service endpoints without needing - to re-authenticate for every request. Tokens are - typically good for 24 hours, and when the token - expires, you are alerted with a 401 (Unauthorized) - response and you can request another token. - - - - - Look at your OpenStack service - catalog: - $ curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \ - -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \ - -H "Content-type: application/json" | jq . - - - Read through the JSON response to - get a feel for how the catalog is laid - out. - To make working with subsequent - requests easier, store the token in an - environment variable. - $ TOKEN=`curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \ - -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \ - -H "Content-type: application/json" |  jq -r .access.token.id` - Now you can refer to your token on - the command line as $TOKEN. - - - Pick a service endpoint from your - service catalog, such as compute, and - try out a request like listing - instances (servers). - $ curl -s \ - -H "X-Auth-Token: $TOKEN" \ - http://203.0.113.10:8774/v2/98333aba48e756fa8f629c83a818ad57/servers | jq . - - - - - To discover how API requests should be - structured, read the OpenStack API Reference - (http://api.openstack.org/api-ref.html). To chew - through the responses using jq, see the jq Manual - (http://stedolan.github.com/jq/manual/). - The -s flag used in the cURL - commands above are used to prevent the progress - meter from being shown. If you are having trouble - running cURL commands, you'll want to remove it. - Likewise, to help you troubleshoot cURL commands - you can include the -v flag to show - you the verbose output. There are many more - extremely useful features in cURL, refer to the - man page for all of the options. -
-
-
- Servers and Services - As an administrator, there are a few ways to - discover what your OpenStack cloud looks like simply - by using the OpenStack tools available. This section - gives you an idea of how to get an overview of your - cloud, its shape, size, and current state. - First, you can discover what servers belong to your - OpenStack cloud by running: - $ nova-manage service list | sort - The output looks like the following: - Binary Host Zone Status State Updated_At -nova-cert cloud.example.com nova enabled :-) 2013-02-25 19:32:38 -nova-compute c01.example.com nova enabled :-) 2013-02-25 19:32:35 -nova-compute c02.example.com nova enabled :-) 2013-02-25 19:32:32 -nova-compute c03.example.com nova enabled :-) 2013-02-25 19:32:36 -nova-compute c04.example.com nova enabled :-) 2013-02-25 19:32:32 -nova-compute c05.example.com nova enabled :-) 2013-02-25 19:32:41 -nova-consoleauth cloud.example.com nova enabled :-) 2013-02-25 19:32:36 -nova-network cloud.example.com nova enabled :-) 2013-02-25 19:32:32 -nova-scheduler cloud.example.com nova enabled :-) 2013-02-25 19:32:33 - The output shows that there are five compute nodes - and one cloud controller. You see a smiley face like - :-) which indicates that the services - are up and running and functional. If a service is no - longer available, the :-) changes to an - XXX. This is an indication that you - should troubleshoot why the service is down. - If you are still using nova-volume - (this service is deprecated after the Folsom release), - you might also see entries for the nova-volume - service. - If you are using Cinder, run the following command - to see a similar listing: - - $ cinder-manage host list | sort - - host zone -c01.example.com nova -c02.example.com nova -c03.example.com nova -c04.example.com nova -c05.example.com nova -cloud.example.com nova - With these two tables, you now have a good overview - of what servers and services make up your - cloud. - You can also use the Identity Service (Keystone), to - see what services are available in your cloud as well - as what endpoints have been configured for the - services. - The following commands require you to have your - shell environment configured with the proper - administrative variables. - - $ keystone service-list - - +-----+----------+----------+----------------------------+ -| id | name | type | description | -+-----+----------+----------+----------------------------+ -| ... | cinder | volume | Cinder Service | -| ... | glance | image | OpenStack Image Service | -| ... | nova_ec2 | ec2 | EC2 Service | -| ... | keystone | identity | OpenStack Identity Service | -| ... | nova | compute | OpenStack Compute Service | -+-----+----------+----------+----------------------------+ - The output above shows that there are five services - configured. - To see the endpoint of each service, run: - $ keystone endpoint-list - +-----+-----------------------------------------+-/+-----------------------------------------+ -| id | publicurl       | \| adminurl   | -+-----+-----------------------------------------+-/+-----------------------------------------+ -| ... | http://example.com:8774/v2/%(tenant_id)s| \| http://example.com:8774/v2/%(tenant_id)s| -| ... | http://example.com:8773/services/Cloud  | /| http://example.com:8773/services/Admin | -| ... | http://example.com:9292/v1  | \| http://example.com:9292/v1  | -| ... | http://example.com:5000/v2.0 | /| http://example.com:35357/v2.0 | -| ... | http://example.com:8776/v1/%(tenant_id)s| \| http://example.com:8776/v1/%(tenant_id)s| -+-----+-----------------------------------------+-/+-----------------------------------------+ - There should be a one-to-one mapping between a - service and - endpoint. Note the different - URLs and ports between the public URL and the admin - URL for some services. -
-
-
- Network - Next, take a look at what Fixed IP networks are configured in your cloud. You can use - the nova command-line client to get the IP - ranges.$ nova network-list -+--------------------------------------+--------+--------------+ -| ID | Label | Cidr | -+--------------------------------------+--------+--------------+ -| 3df67919-9600-4ea8-952e-2a7be6f70774 | test01 | 10.1.0.0/24 | -| 8283efb2-e53d-46e1-a6bd-bb2bdef9cb9a | test02 | 10.1.1.0/24 | -+--------------------------------------+--------+--------------+ - The nova-manage tool can provide some additional details. - -$ nova-manage network list -id IPv4 IPv6 start address DNS1 DNS2 VlanID project uuid  -1 10.1.0.0/24 None 10.1.0.3 None None 300 2725bbd beacb3f2 -2 10.1.1.0/24 None 10.1.1.3 None None 301 none d0b1a796 - This output shows that two networks are configured, each - network containing 255 IPs (a /24 subnet). The first - network has been assigned to a certain project while the - second network is still open for assignment. You can - assign this network manually or it is automatically - assigned when a project launches their first - instance. - To find out if any floating IPs are available in your - cloud, run: - - $ nova-manage floating list - - 2725bbd458e2459a8c1bd36be859f43f 1.2.3.4 None nova vlan20 -None 1.2.3.5 48a415e7-6f07-4d33-ad00-814e60b010ff nova vlan20 - Here, two floating IPs are available. The first has been - allocated to a project while the other is - unallocated. -
-
- Users and Projects - To see a list of projects that have been added to the - cloud, run: - - $ keystone tenant-list - - +-----+----------+---------+ -| id | name | enabled | -+-----+----------+---------+ -| ... | jtopjian | True | -| ... | alvaro | True | -| ... | everett | True | -| ... | admin | True | -| ... | services | True | -| ... | jonathan | True | -| ... | lorin | True | -| ... | anne | True | -| ... | rhulsker | True | -| ... | tom | True | -| ... | adam | True | -+-----+----------+---------+ - - To see a list of users, run: - - $ keystone user-list - - +-----+----------+---------+------------------------------+ -| id | name | enabled | email | -+-----+----------+---------+------------------------------+ -| ... | everett | True | everett.towne@backspace.com | -| ... | jonathan | True | jon@sfcu.edu | -| ... | nova | True | nova@localhost | -| ... | rhulsker | True | ryan.hulkster@cyberalbert.ca | -| ... | lorin | True | lorinhoch@nsservices.com | -| ... | alvaro | True | Alvaro.Perry@cyberalbert.ca | -| ... | anne | True | anne.green@backspace.com | -| ... | admin | True | root@localhost | -| ... | cinder | True | cinder@localhost | -| ... | glance | True | glance@localhost | -| ... | jtopjian | True | joe.topjian@cyberalbert.com | -| ... | adam | True | adam@ossmanuals.net | -| ... | tom | True | fafield@univm.edu.au | -+-----+----------+---------+------------------------------+ - - Sometimes a user and a group have a one-to-one - mapping. This happens for standard system accounts, - such as cinder, glance, nova, and swift, or when only - one user is ever part of a group. - -
-
- Running Instances - To see a list of running instances, run: - - $ nova list --all-tenants - - +-----+------------------+--------+-------------------------------------------+ -| ID | Name | Status | Networks | -+-----+------------------+--------+-------------------------------------------+ -| ... | Windows | ACTIVE | novanetwork_1=10.1.1.3, 199.116.232.39 | -| ... | cloud controller | ACTIVE | novanetwork_0=10.1.0.6; jtopjian=10.1.2.3 | -| ... | compute node 1 | ACTIVE | novanetwork_0=10.1.0.4; jtopjian=10.1.2.4 | -| ... | devbox | ACTIVE | novanetwork_0=10.1.0.3 | -| ... | devstack | ACTIVE | novanetwork_0=10.1.0.5 | -| ... | initial | ACTIVE | nova_network=10.1.7.4, 10.1.8.4 | -| ... | lorin-head | ACTIVE | nova_network=10.1.7.3, 10.1.8.3 | -+-----+------------------+--------+-------------------------------------------+ - Unfortunately this command does not tell you various - details about the running instances, such as what compute - node the instance is running on, what flavor the instance - is, and so on. You can use the following command to view - details about individual instances: - - $ nova show <uuid> - - For example: - # nova show 81db556b-8aa5-427d-a95c-2a9a6972f630+-------------------------------------+-----------------------------------+ -| Property | Value | -+-------------------------------------+-----------------------------------+ -| OS-DCF:diskConfig | MANUAL | -| OS-EXT-SRV-ATTR:host | c02.example.com | -| OS-EXT-SRV-ATTR:hypervisor_hostname | c02.example.com | -| OS-EXT-SRV-ATTR:instance_name | instance-00000029 | -| OS-EXT-STS:power_state | 1 | -| OS-EXT-STS:task_state | None | -| OS-EXT-STS:vm_state | active | -| accessIPv4 | | -| accessIPv6 | | -| config_drive | | -| created | 2013-02-13T20:08:36Z | -| flavor | m1.small (6) | -| hostId | ... | -| id | ... | -| image | Ubuntu 12.04 cloudimg amd64 (...) | -| key_name | jtopjian-sandbox | -| metadata | {} | -| name | devstack | -| novanetwork_0 network | 10.1.0.5 | -| progress | 0 | -| security_groups | [{u'name': u'default'}] | -| status | ACTIVE | -| tenant_id | ... | -| updated | 2013-02-13T20:08:59Z | -| user_id | ... | -+-------------------------------------+-----------------------------------+ -
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_log_monitor.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_log_monitor.xml deleted file mode 100644 index fc5409c3d30..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_log_monitor.xml +++ /dev/null @@ -1,718 +0,0 @@ - - - - - - - - -]> - - - Logging and Monitoring - As an OpenStack cloud is composed of so many different - services, there are a large number of log files. This section - aims to assist you in locating and working with them, and - other ways to track the status of your deployment. - -
- Where Are the Logs? - On Ubuntu, most services use the convention of writing - their log files to subdirectories of the /var/log - directory. -
- Cloud Controller - - - - Service - Log Location - - - - - - nova-* - - - /var/log/nova - - - - - glance-* - - - /var/log/glance - - - - - cinder-* - - - /var/log/cinder - - - - - keystone - - - /var/log/keystone - - - - horizon - - /var/log/apache2/ - - - - misc (Swift, - dnsmasq) - - /var/log/syslog - - - - -
-
- Compute Nodes - libvirt: /var/log/libvirt/libvirtd.log - - Console (boot up messages) for VM instances: - /var/lib/nova/instances/instance-<instance - id>/console.log - -
-
- Block Storage Nodes - cinder: - /var/log/cinder/cinder-volume.log - -
-
-
- How to Read the Logs - OpenStack services use the standard logging levels, at - increasing severity: DEBUG, INFO, AUDIT, WARNING, ERROR, - CRITICAL, TRACE. That is, messages only appear in the logs - if they are more "severe" than the particular log level - with DEBUG allowing all log statements through. For - example, TRACE is logged only if the software has a stack - trace, while INFO is logged for every message including - those that are only for information. - To disable DEBUG-level logging, edit - /etc/nova/nova.conf: - debug=false - Keystone is handled a little differently. To modify the - logging level, edit the - /etc/keystone/logging.conf file and look - at the logger_root and handler_file - sections. - Logging for Horizon is configured in - /etc/openstack_dashboard/local_settings.py. - As Horizon is a Django web application, it follows the - Django Logging - (https://docs.djangoproject.com/en/dev/topics/logging/) - framework conventions. - The first step in finding the source of an error is - typically to search for a CRITICAL, TRACE, or ERROR - message in the log starting at the bottom of the log file. - An example of a CRITICAL log message, with the - corresponding TRACE (Python traceback) immediately - following: - 2013-02-25 21:05:51 17409 CRITICAL cinder [-] Bad or unexpected response from the storage volume backend API: volume group - cinder-volumes doesn't exist -2013-02-25 21:05:51 17409 TRACE cinder Traceback (most recent call last): -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/bin/cinder-volume", line 48, in <module> -2013-02-25 21:05:51 17409 TRACE cinder service.wait() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 422, in wait -2013-02-25 21:05:51 17409 TRACE cinder _launcher.wait() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 127, in wait -2013-02-25 21:05:51 17409 TRACE cinder service.wait() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/eventlet/greenthread.py", line 166, in wait -2013-02-25 21:05:51 17409 TRACE cinder return self._exit_event.wait() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/eventlet/event.py", line 116, in wait -2013-02-25 21:05:51 17409 TRACE cinder return hubs.get_hub().switch() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/eventlet/hubs/hub.py", line 177, in switch -2013-02-25 21:05:51 17409 TRACE cinder return self.greenlet.switch() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/eventlet/greenthread.py", line 192, in main -2013-02-25 21:05:51 17409 TRACE cinder result = function(*args, **kwargs) -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 88, in run_server -2013-02-25 21:05:51 17409 TRACE cinder server.start() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 159, in start -2013-02-25 21:05:51 17409 TRACE cinder self.manager.init_host() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/volume/manager.py", line 95, - in init_host -2013-02-25 21:05:51 17409 TRACE cinder self.driver.check_for_setup_error() -2013-02-25 21:05:51 17409 TRACE cinder File "/usr/lib/python2.7/dist-packages/cinder/volume/driver.py", line 116, - in check_for_setup_error -2013-02-25 21:05:51 17409 TRACE cinder raise exception.VolumeBackendAPIException(data=exception_message) -2013-02-25 21:05:51 17409 TRACE cinder VolumeBackendAPIException: Bad or unexpected response from the storage volume - backend API: volume group cinder-volumes doesn't exist -2013-02-25 21:05:51 17409 TRACE cinder - In this example, cinder-volumes failed to start and has - provided a stack trace, since its volume back-end has been - unable to setup the storage volume - probably because the - LVM volume that is expected from the configuration does - not exist. - An example error log: - 2013-02-25 20:26:33 6619 ERROR nova.openstack.common.rpc.common [-] AMQP server on localhost:5672 is unreachable: - [Errno 111] ECONNREFUSED. Trying again in 23 seconds. - In this error, a nova service has failed to connect to - the RabbitMQ server, because it got a connection refused - error. -
-
- Tracing Instance Requests - When an instance fails to behave properly, you will - often have to trace activity associated with that instance - across the log files of various nova-* - services, and across both the cloud controller and compute - nodes. - The typical way is to trace the UUID associated with an - instance across the service logs. - Consider the following example: - ubuntu@initial:~$ nova list -+--------------------------------------+--------+--------+---------------------------+ -| ID | Name | Status | Networks | -+--------------------------------------+--------+--------+---------------------------+ -| faf7ded8-4a46-413b-b113-f19590746ffe | cirros | ACTIVE | novanetwork=192.168.100.3 | -+--------------------------------------+--------+--------+---------------------------+ - Here the ID associated with the instance is - faf7ded8-4a46-413b-b113-f19590746ffe. If - you search for this string on the cloud controller in the - /var/log/nova-*.log files, it appears in - nova-api.log, - nova-scheduler.log. If you search for - this on the compute nodes in - /var/log/nova-*.log, it appears - nova-network.log and - nova-compute.log. If no ERROR or CRITICAL - messages appear, the most recent log entry that reports - this may provide a hint about what has gone wrong. -
-
- Adding Custom Logging Statements - If there is not enough information in the existing logs, - you may need to add your own custom logging statements to - the nova-* services. - The source files are located in - /usr/lib/python2.7/dist-packages/nova - - To add logging statements, the following line should be - near the top of the file. For most files, these should - already be there: - from nova.openstack.common import log as logging -LOG = logging.getLogger(__name__) - To add a DEBUG logging statement, you would do: - LOG.debug("This is a custom debugging statement") - You may notice that all of the existing logging messages - are preceded by an underscore and surrounded by - parentheses, for example: - LOG.debug(_("Logging statement appears here")) - This is used to support translation of logging messages - into different languages using the gettext - (http://docs.python.org/2/library/gettext.html) - internationalization library. You don't need to do this - for your own custom log messages. However, if you want to - contribute the code back to the OpenStack project that - includes logging statements, you must surround your log - messages with underscore and parentheses. -
-
- RabbitMQ Web Management Interface or - rabbitmqctl - Aside from connection failures, RabbitMQ log files are - generally not useful for debugging OpenStack related - issues. Instead, we recommend you use the RabbitMQ web - management interface. Enable it on your cloud - controller: - # /usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management -# service rabbitmq-server restart - The RabbitMQ web management interface is accessible on - your cloud controller at http://localhost:55672. - - Ubuntu 12.04 installs RabbitMQ version 2.7.1, which - uses port 55672. RabbitMQ versions 3.0 and above use - port 15672 instead. You can check which version of - RabbitMQ you have running on your local Ubuntu machine - by doing: - $ dpkg -s rabbitmq-server | grep "Version:" -Version: 2.7.1-0ubuntu4 - - An alternative to enabling the RabbitMQ Web Management - Interface is to use the rabbitmqctl commands. For example, - rabbitmqctl list_queues| grep - cinder displays any messages - left in the queue. If there are, it's a possible sign that - cinder services didn't connect properly to rabbitmq and - might have to be restarted. - Items to monitor for RabbitMQ include the number of - items in each of the queues and the processing time - statistics for the server. -
-
- Centrally Managing Logs - Because your cloud is most likely composed of many - servers, you must check logs on each of those servers to - properly piece an event together. A better solution is to - send the logs of all servers to a central location so they - can all be accessed from the same area. - Ubuntu uses rsyslog as the default logging service. - Since it is natively able to send logs to a remote - location, you don't have to install anything extra to - enable this feature, just modify the configuration file. - In doing this, consider running your logging over a - management network, or using an encrypted VPN to avoid - interception. -
- rsyslog Client Configuration - To begin, configure all OpenStack components to log - to syslog in addition to their standard log file - location. Also configure each component to log to a - different syslog facility. This makes it easier to - split the logs into individual components on the - central server. - - nova.conf: - use_syslog=True -syslog_log_facility=LOG_LOCAL0 - - glance-api.conf and - glance-registry.conf: - use_syslog=True -syslog_log_facility=LOG_LOCAL1 - - cinder.conf: - use_syslog=True -syslog_log_facility=LOG_LOCAL2 - - keystone.conf: - use_syslog=True -syslog_log_facility=LOG_LOCAL3 - Swift - By default, Swift logs to syslog. - Next, create /etc/rsyslog.d/client.conf with the - following line: - *.* @192.168.1.10 - This instructs rsyslog to send all logs to the IP - listed. In this example, the IP points to the Cloud - Controller. -
-
- rsyslog Server Configuration - Designate a server as the central logging server. - The best practice is to choose a server that is solely - dedicated to this purpose. Create a file called - /etc/rsyslog.d/server.conf with the following - contents: - # Enable UDP -$ModLoad imudp -# Listen on 192.168.1.10 only -$UDPServerAddress 192.168.1.10 -# Port 514 -$UDPServerRun 514 - -# Create logging templates for nova -$template NovaFile,"/var/log/rsyslog/%HOSTNAME%/nova.log" -$template NovaAll,"/var/log/rsyslog/nova.log" - - - -# Log everything else to syslog.log -$template DynFile,"/var/log/rsyslog/%HOSTNAME%/syslog.log" -*.* ?DynFile - - - -# Log various openstack components to their own individual file -local0.* ?NovaFile -local0.* ?NovaAll -& ~ - The above example configuration handles the nova - service only. It first configures rsyslog to act as a - server that runs on port 512. Next, it creates a - series of logging templates. Logging templates control - where received logs are stored. Using the example - above, a nova log from c01.example.com goes to the - following locations: - - - - /var/log/rsyslog/c01.example.com/nova.log - - - - - /var/log/rsyslog/nova.log - - - - This is useful as logs from c02.example.com go - to: - - - - /var/log/rsyslog/c02.example.com/nova.log - - - - - /var/log/rsyslog/nova.log - - - - So you have an individual log file for each compute - node as well as an aggregated log that contains nova - logs from all nodes. -
-
-
- StackTach - StackTach is a tool created by Rackspace to collect and - report the notifications sent by nova. - Notifications are essentially the same as logs, but can be - much more detailed. A good overview of notifications can - be found at System Usage Data - (https://wiki.openstack.org/wiki/SystemUsageData). - To enable nova to send notifications, add the following - to nova.conf: - notification_topics=monitor -notification_driver=nova.openstack.common.notifier.rabbit_notifier - Once nova is sending notifications, install - and configure StackTach. Since StackTach is relatively new - and constantly changing, installation instructions would - quickly become outdated. Please refer to the StackTach GitHub repo - (https://github.com/rackerlabs/stacktach) for instructions - as well as a demo video. -
-
- Monitoring - There are two types of monitoring: watching for problems - and watching usage trends. The former ensures that all - services are up and running, creating a functional cloud. - The latter involves monitoring resource usage over time in - order to make informed decisions about potential - bottlenecks and upgrades. -
- Process Monitoring - A basic type of alert monitoring is to simply check - and see if a required process is running. For example, - ensure that the nova-api service is - running on the Cloud Controller: - [ root@cloud ~ ] # ps aux | grep nova-api -nova 12786 0.0 0.0 37952 1312 ? Ss Feb11 0:00 su -s /bin/sh -c exec nova-api --config-file=/etc/nova/nova.conf nova -nova 12787 0.0 0.1 135764 57400 ? S Feb11 0:01 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf -nova 12792 0.0 0.0 96052 22856 ? S Feb11 0:01 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf -nova 12793 0.0 0.3 290688 115516 ? S Feb11 1:23 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf -nova 12794 0.0 0.2 248636 77068 ? S Feb11 0:04 /usr/bin/python /usr/bin/nova-api --config-file=/etc/nova/nova.conf -root 24121 0.0 0.0 11688 912 pts/5 S+ 13:07 0:00 grep nova-api - You can create automated alerts for critical - processes by using Nagios and NRPE. For example, to - ensure that the nova-compute process is - running on compute nodes, create an alert on your - Nagios server that looks like this: - define service { - host_name c01.example.com - check_command check_nrpe_1arg!check_nova-compute - use generic-service - notification_period 24x7 - contact_groups sysadmins - service_description nova-compute -} - Then on the actual compute node, create the - following NRPE configuration: - command[check_nova-compute]=/usr/lib/nagios/plugins/check_procs -c 1: -a nova-compute - Nagios checks that at least one nova-compute service - is running at all times. -
-
- Resource Alerting - Resource alerting provides notifications when one or - more resources are critically low. While the - monitoring thresholds should be tuned to your specific - OpenStack environment, monitoring resource usage is - not specific to OpenStack at all – any generic type of - alert will work fine. - Some of the resources that you want to monitor - include: - - - Disk Usage - - - Server Load - - - Memory Usage - - - Network IO - - - Available vCPUs - - - For example, to monitor disk capacity on a compute - node with Nagios, add the following to your Nagios - configuration: - define service { - host_name c01.example.com - check_command check_nrpe!check_all_disks!20% 10% - use generic-service - contact_groups sysadmins - service_description Disk -} - On the compute node, add the following to your NRPE - configuration: - command[check_all_disks]=/usr/lib/nagios/plugins/check_disk -w $ARG1$ -c $ARG2$ -e - Nagios alerts you with a WARNING when any disk on - the compute node is 80% full and CRITICAL when 90% is - full. -
-
- OpenStack-specific Resources - Resources such as memory, disk, and CPU are generic - resources that all servers (even non-OpenStack - servers) have and are important to the overall health - of the server. When dealing with OpenStack - specifically, these resources are important for a - second reason: ensuring enough are available in order - to launch instances. There are a few ways you can see - OpenStack resource usage. - The first is through the nova - command: - # nova usage-list - This command displays a list of how many instances a - tenant has running and some light usage statistics - about the combined instances. This command is useful - for a quick overview of your cloud, but doesn't really - get into a lot of details. - Next, the nova database contains three - tables that store usage information. - The nova.quotas and - nova.quota_usages tables store quota - information. If a tenant's quota is different than the - default quota settings, their quota is stored in - nova.quotas table. For - example: - mysql> select project_id, resource, hard_limit from quotas; -+----------------------------------+-----------------------------+------------+ -| project_id | resource | hard_limit | -+----------------------------------+-----------------------------+------------+ -| 628df59f091142399e0689a2696f5baa | metadata_items | 128 | -| 628df59f091142399e0689a2696f5baa | injected_file_content_bytes | 10240 | -| 628df59f091142399e0689a2696f5baa | injected_files | 5 | -| 628df59f091142399e0689a2696f5baa | gigabytes | 1000 | -| 628df59f091142399e0689a2696f5baa | ram | 51200 | -| 628df59f091142399e0689a2696f5baa | floating_ips | 10 | -| 628df59f091142399e0689a2696f5baa | instances | 10 | -| 628df59f091142399e0689a2696f5baa | volumes | 10 | -| 628df59f091142399e0689a2696f5baa | cores | 20 | -+----------------------------------+-----------------------------+------------+ - The nova.quota_usages table keeps track - of how many resources the tenant currently has in - use: - mysql> select project_id, resource, in_use from quota_usages where project_id like '628%'; -+----------------------------------+--------------+--------+ -| project_id | resource | in_use | -+----------------------------------+--------------+--------+ -| 628df59f091142399e0689a2696f5baa | instances | 1 | -| 628df59f091142399e0689a2696f5baa | ram | 512 | -| 628df59f091142399e0689a2696f5baa | cores | 1 | -| 628df59f091142399e0689a2696f5baa | floating_ips | 1 | -| 628df59f091142399e0689a2696f5baa | volumes | 2 | -| 628df59f091142399e0689a2696f5baa | gigabytes | 12 | -| 628df59f091142399e0689a2696f5baa | images | 1 | -+----------------------------------+--------------+--------+ - By combining the resources used with the tenant's - quota, you can figure out a usage percentage. For - example, if this tenant is using 1 Floating IP out of - 10, then they are using 10% of their Floating IP - quota. You can take this procedure and turn it into a - formatted report: - +-----------------------------------+------------+-------------+---------------+ -| some_tenant | -+-----------------------------------+------------+-------------+---------------+ -| Resource | Used | Limit | | -+-----------------------------------+------------+-------------+---------------+ -| cores | 1 | 20 | 5 % | -| floating_ips | 1 | 10 | 10 % | -| gigabytes | 12 | 1000 | 1 % | -| images | 1 | 4 | 25 % | -| injected_file_content_bytes | 0 | 10240 | 0 % | -| injected_file_path_bytes | 0 | 255 | 0 % | -| injected_files | 0 | 5 | 0 % | -| instances | 1 | 10 | 10 % | -| key_pairs | 0 | 100 | 0 % | -| metadata_items | 0 | 128 | 0 % | -| ram | 512 | 51200 | 1 % | -| reservation_expire | 0 | 86400 | 0 % | -| security_group_rules | 0 | 20 | 0 % | -| security_groups | 0 | 10 | 0 % | -| volumes | 2 | 10 | 20 % | -+-----------------------------------+------------+-------------+---------------+ - The above was generated using a custom script which - can be found on GitHub - (https://github.com/cybera/novac/blob/dev/libexec/novac-quota-report). - - This script is specific to a certain OpenStack - installation and must be modified to fit your - environment. However, the logic should easily be - transferable. - -
-
- Intelligent Alerting - Intelligent alerting can be thought of as a form of - continuous integration for operations. For example, - you can easily check to see if Glance is up and - running by ensuring that the glance-api - and glance-registry processes are running - or by seeing if glace-api is responding - on port 9292. - But how can you tell if images are being - successfully uploaded to the Image Service? Maybe the - disk that Image Service is storing the images on is - full or the S3 back-end is down. You could naturally - check this by doing a quick image upload: - #!/bin/bash -# -# assumes that resonable credentials have been stored at -# /root/auth - - -. /root/openrc -wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img -glance image-create --name='cirros image' --is-public=true --container-format=bare --disk-format=qcow2 < cirros-0.3.0-x8 -6_64-disk.img - By taking this script and rolling it into an alert - for your monitoring system (such as Nagios), you now - have an automated way of ensuring image uploads to the - Image Catalog are working. - - You must remove the image after each test. Even - better, test whether you can successfully delete - an image from the Image Service. - - Intelligent alerting takes a considerable more - amount of time to plan and implement than the other - alerts described in this chapter. A good outline to - implement intelligent alerting is: - - - Review common actions in your cloud - - - Create ways to automatically test these - actions - - - Roll these tests into an alerting - system - - - Some other examples for Intelligent Alerting - include: - - - Can instances launch and destroyed? - - - Can users be created? - - - Can objects be stored and deleted? - - - Can volumes be created and destroyed? - - -
-
- Trending - Trending can give you great insight into how your - cloud is performing day to day. For example, if a busy - day was simply a rare occurrence or if you should - start adding new compute nodes. - Trending takes a slightly different approach than - alerting. While alerting is interested in a binary - result (whether a check succeeds or fails), trending - records the current state of something at a certain - point in time. Once enough points in time have been - recorded, you can see how the value has changed over - time. - All of the alert types mentioned earlier can also be - used for trend reporting. Some other trend examples - include: - - - The number of instances on each compute - node - - - The types of flavors in use - - - The number of volumes in use - - - The number of Object Storage requests each - hour - - - The number of nova-api requests each - hour - - - The I/O statistics of your storage - services - - - As an example, recording nova-api usage - can allow you to track the need to scale your cloud - controller. By keeping an eye on nova-api - requests, you can determine if you need to spawn more - nova-api processes or go as far as introducing an - entirely new server to run nova-api. To - get an approximate count of the requests, look for - standard INFO messages in - /var/log/nova/nova-api.log: - # grep INFO /var/log/nova/nova-api.log | wc - You can obtain further statistics by looking for the - number of successful requests: - # grep " 200 " /var/log/nova/nova-api.log | - wc - By running this command periodically and keeping a - record of the result, you can create a trending report - over time that shows whether your - nova-api usage is increasing, - decreasing, or keeping steady. - A tool such as collectd can be used to store this - information. While collectd is out of the scope of - this book, a good starting point would be to use - collectd to store the result as a COUNTER data type. - More information can be found in collectd's - documentation - (https://collectd.org/wiki/index.php/Data_source) -
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_maintenance.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_maintenance.xml deleted file mode 100644 index 30f91bbc6cc..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_maintenance.xml +++ /dev/null @@ -1,1070 +0,0 @@ - - - - - - - - -]> - - - - Maintenance, Failures, and Debugging - Downtime, whether planned or unscheduled, is a certainty - when running a cloud. This chapter aims to provide useful - information for dealing proactively, or reactively with these - occurrences. -
- - Cloud Controller and Storage Proxy Failures and - Maintenance - The cloud controller and storage proxy are very similar - to each other when it comes to expected and unexpected - downtime. One of each server type typically runs in the - cloud, which makes them very noticeable when they are not - running. - For the cloud controller, the good news is if your cloud - is using the FlatDHCP multi-host HA network mode, existing - instances and volumes continue to operate while the cloud - controller is offline. However for the storage proxy, no - storage traffic is possible until it is back up and - running. -
- - Planned Maintenance - One way to plan for cloud controller or storage - proxy maintenance is to simply do it off-hours, such - as at 1 or 2 A.M.. This strategy impacts fewer users. - If your cloud controller or storage proxy is too - important to have unavailable at any point in time, - you must look into High Availability options. -
-
- - Rebooting a cloud controller or Storage - Proxy - All in all, just issue the "reboot" command. The - operating system cleanly shuts services down and then - automatically reboots. If you want to be very - thorough, run your backup jobs just before you - reboot. -
-
- - After a Cloud Controller or Storage Proxy - Reboots - After a cloud controller reboots, ensure that all - required services were successfully started: - # ps aux | grep nova- -# grep AMQP /var/log/nova/nova-*.log -# ps aux | grep glance- -# ps aux | grep keystone -# ps aux | grep cinder - Also check that all services are functioning: - # source openrc -# glance index -# nova list -# keystone tenant-list - For the storage proxy, ensure that the Object - Storage service has resumed: - # ps aux | grep swift - Also check that it is functioning: - # swift stat -
-
- - Total Cloud Controller Failure - Unfortunately, this is a rough situation. The cloud - controller is a integral part of your cloud. If you - have only one controller, many services are - missing. - To avoid this situation, create a highly available - cloud controller cluster. This is outside the scope of - this document, but you can read more in the draft - OpenStack High Availability Guide - (http://docs.openstack.org/trunk/openstack-ha/content/ch-intro.html). - The next best way is to use a configuration - management tool such as Puppet to automatically build - a cloud controller. This should not take more than 15 - minutes if you have a spare server available. After - the controller rebuilds, restore any backups taken - (see the Backup and - Recovery chapter). - Also, in practice, sometimes the nova-compute - services on the compute nodes do not reconnect cleanly - to rabbitmq hosted on the controller when it comes - back up after a long reboot and a restart on the nova - services on the compute nodes is required. -
-
-
- - Compute Node Failures and Maintenance - Sometimes a compute node either crashes unexpectedly or - requires a reboot for maintenance reasons. -
- - Planned Maintenance - If you need to reboot a compute node due to planned - maintenance (such as a software or hardware upgrade), - first ensure that all hosted instances have been moved - off of the node. If your cloud is utilizing shared - storage, use the nova live-migration - command. First, get a list of instances that need to - be moved: - # nova list --host c01.example.com --all-tenants - Next, migrate them one by one: - # nova live-migration <uuid> c02.example.com - If you are not using shared storage, you can use the - --block-migrate option: - # nova live-migration --block-migrate <uuid> c02.example.com - After you have migrated all instances, ensure the - nova-compute service has - stopped: - # stop nova-compute - If you use a configuration management system, such - as Puppet, that ensures the nova-compute - service is always running, you can temporarily move - the init files: - # mkdir /root/tmp -# mv /etc/init/nova-compute.conf /root/tmp -# mv /etc/init.d/nova-compute /root/tmp - Next, shut your compute node down, perform your - maintenance, and turn the node back on. You can - re-enable the nova-compute service by - undoing the previous commands: - # mv /root/tmp/nova-compute.conf /etc/init -# mv /root/tmp/nova-compute /etc/init.d/ - Then start the nova-compute - service: - # start nova-compute - You can now optionally migrate the instances back to - their original compute node. -
-
- - After a Compute Node Reboots - When you reboot a compute node, first verify that it - booted successfully. This includes ensuring the - nova-compute service is - running: - # ps aux | grep nova-compute -# status nova-compute - Also ensure that it has successfully connected to - the AMQP server: - # grep AMQP /var/log/nova/nova-compute -2013-02-26 09:51:31 12427 INFO nova.openstack.common.rpc.common [-] Connected to AMQP server on 199.116.232.36:5672 - After the compute node is successfully running, you - must deal with the instances that are hosted on that - compute node as none of them is running. Depending on - your SLA with your users or customers, you might have - to start each instance and ensure they start - correctly. -
-
- - Instances - You can create a list of instances that are hosted - on the compute node by performing the following - command: - # nova list --host c01.example.com --all-tenants - After you have the list, you can use the nova - command to start each instance: - # nova reboot <uuid> - - Any time an instance shuts down unexpectedly, - it might have problems on boot. For example, the - instance might require an fsck on the - root partition. If this happens, the user can use - the Dashboard VNC console to fix this. - - If an instance does not boot, meaning virsh - list never shows the instance as even - attempting to boot, do the following on the compute - node: - # tail -f /var/log/nova/nova-compute.log - Try executing the nova reboot command - again. You should see an error message about why the - instance was not able to boot - In most cases, the error is due to something in - libvirt's XML file - (/etc/libvirt/qemu/instance-xxxxxxxx.xml) - that no longer exists. You can enforce recreation of - the XML file as well as rebooting the instance by - running: - # nova reboot --hard <uuid> -
-
- - Inspecting and Recovering Data from Failed - Instances - In some scenarios, instances are running but are - inaccessible through SSH and do not respond to any - command. VNC console could be displaying a boot - failure or kernel panic error messages. This could be - an indication of a file system corruption on the VM - itself. If you need to recover files or inspect the - content of the instance, qemu-nbd can be used to mount - the disk. - - If you access or view the user's content and - data, get their approval first! - - To access the instance's disk - (/var/lib/nova/instances/instance-xxxxxx/disk), the - following steps must be followed: - - - Suspend the instance using the virsh - command - - - Connect the qemu-nbd device to the - disk - - - Mount the qemu-nbd device - - - Unmount the device after inspecting - - - Disconnect the qemu-nbd device - - - Resume the instance - - - If you do not follow the steps from 4-6, OpenStack - Compute cannot manage the instance any longer. It - fails to respond to any command issued by OpenStack - Compute and it is marked as shutdown. - Once you mount the disk file, you should be able - access it and treat it as normal directories with - files and a directory structure. However, we do not - recommend that you edit or touch any files because - this could change the acls and make the instance - unbootable if it is not already. - - - Suspend the instance using the virsh command - - taking note of the internal ID. - root@compute-node:~# virsh list -Id Name State ----------------------------------- -1 instance-00000981 running -2 instance-000009f5 running -30 instance-0000274a running - -root@compute-node:~# virsh suspend 30 -Domain 30 suspended - - - Connect the qemu-nbd device to the - disk - root@compute-node:/var/lib/nova/instances/instance-0000274a# ls -lh -total 33M --rw-rw---- 1 libvirt-qemu kvm 6.3K Oct 15 11:31 console.log --rw-r--r-- 1 libvirt-qemu kvm 33M Oct 15 22:06 disk --rw-r--r-- 1 libvirt-qemu kvm 384K Oct 15 22:06 disk.local --rw-rw-r-- 1 nova nova 1.7K Oct 15 11:30 libvirt.xml -root@compute-node:/var/lib/nova/instances/instance-0000274a# qemu-nbd -c /dev/nbd0 `pwd`/disk - - - Mount the qemu-nbd device. - The qemu-nbd device tries to export the - instance disk's different partitions as - separate devices. For example if vda as the - disk and vda1 as the root partition, qemu-nbd - exports the device as /dev/nbd0 and - /dev/nbd0p1 respectively. - #mount the root partition of the device -root@compute-node:/var/lib/nova/instances/instance-0000274a# mount /dev/nbd0p1 /mnt/ -# List the directories of mnt, and the vm's folder is display -# You can inspect the folders and access the /var/log/ files - To examine the secondary or ephemeral disk, - use an alternate mount point if you want both - primary and secondary drives mounted at the - same time. - # umount /mnt -# qemu-nbd -c /dev/nbd1 `pwd`/disk.local -# mount /dev/nbd1 /mnt/ - root@compute-node:/var/lib/nova/instances/instance-0000274a# ls -lh /mnt/ -total 76K -lrwxrwxrwx. 1 root root 7 Oct 15 00:44 bin -> usr/bin -dr-xr-xr-x. 4 root root 4.0K Oct 15 01:07 boot -drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 dev -drwxr-xr-x. 70 root root 4.0K Oct 15 11:31 etc -drwxr-xr-x. 3 root root 4.0K Oct 15 01:07 home -lrwxrwxrwx. 1 root root 7 Oct 15 00:44 lib -> usr/lib -lrwxrwxrwx. 1 root root 9 Oct 15 00:44 lib64 -> usr/lib64 -drwx------. 2 root root 16K Oct 15 00:42 lost+found -drwxr-xr-x. 2 root root 4.0K Feb 3 2012 media -drwxr-xr-x. 2 root root 4.0K Feb 3 2012 mnt -drwxr-xr-x. 2 root root 4.0K Feb 3 2012 opt -drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 proc -dr-xr-x---. 3 root root 4.0K Oct 15 21:56 root -drwxr-xr-x. 14 root root 4.0K Oct 15 01:07 run -lrwxrwxrwx. 1 root root 8 Oct 15 00:44 sbin -> usr/sbin -drwxr-xr-x. 2 root root 4.0K Feb 3 2012 srv -drwxr-xr-x. 2 root root 4.0K Oct 15 00:42 sys -drwxrwxrwt. 9 root root 4.0K Oct 15 16:29 tmp -drwxr-xr-x. 13 root root 4.0K Oct 15 00:44 usr -drwxr-xr-x. 17 root root 4.0K Oct 15 00:44 var - - - Once you have completed the inspection, - umount the mount point and release the - qemu-nbd device - root@compute-node:/var/lib/nova/instances/instance-0000274a# umount /mnt -root@compute-node:/var/lib/nova/instances/instance-0000274a# qemu-nbd -d /dev/nbd0 -/dev/nbd0 disconnected - - - Resume the instance using virsh - root@compute-node:/var/lib/nova/instances/instance-0000274a# virsh list -Id Name State ----------------------------------- -1 instance-00000981 running -2 instance-000009f5 running -30 instance-0000274a paused - -root@compute-node:/var/lib/nova/instances/instance-0000274a# virsh resume 30 -Domain 30 resumed - - -
-
- - Volumes - If the affected instances also had attached volumes, - first generate a list of instance and volume - UUIDs: - mysql> select nova.instances.uuid as instance_uuid, cinder.volumes.id as volume_uuid, cinder.volumes.status, -cinder.volumes.attach_status, cinder.volumes.mountpoint, cinder.volumes.display_name from cinder.volumes -inner join nova.instances on cinder.volumes.instance_uuid=nova.instances.uuid - where nova.instances.host = 'c01.example.com'; - You should see a result like the following: - +---------------+-------------+--------+---------------+------------+--------------+ -| instance_uuid | volume_uuid | status | attach_status | mountpoint | display_name | -+---------------+-------------+--------+---------------+------------+--------------+ -| 9b969a05 | 1f0fbf36 | in-use | attached | /dev/vdc | test | -+---------------+-------------+--------+---------------+------------+--------------+ -1 row in set (0.00 sec) - Next, manually detach and reattach the - volumes: - # nova volume-detach <instance_uuid> <volume_uuid> -# nova volume-attach <instance_uuid> <volume_uuid> /dev/vdX - Where X is the proper mount point. Make sure that - the instance has successfully booted and is at a login - screen before doing the above. -
-
- - Total Compute Node Failure - If a compute node fails and won't be fixed for a few - hours or ever, you can relaunch all instances that are - hosted on the failed node if you use shared storage - for /var/lib/nova/instances. - To do this, generate a list of instance UUIDs that - are hosted on the failed node by running the following - query on the nova database: - mysql> select uuid from instances where host = 'c01.example.com' and deleted = 0; - Next, tell Nova that all instances that used to be - hosted on c01.example.com are now hosted on - c02.example.com: - mysql> update instances set host = 'c02.example.com' where host = 'c01.example.com' and deleted = 0; - After that, use the nova command to reboot all - instances that were on c01.example.com while - regenerating their XML files at the same time: - # nova reboot --hard <uuid> - Finally, re-attach volumes using the same method - described in After a compute - node Reboots. -
-
- - /var/lib/nova/instances - It's worth mentioning this directory in the context - of failed compute nodes. This directory contains the - libvirt KVM file-based disk images for the instances - that are hosted on that compute node. If you are not - running your cloud in a shared storage environment, - this directory is unique across all compute - nodes. - - /var/lib/nova/instances contains two - types of directories. - The first is the _base directory. This - contains all of the cached base images from glance for - each unique image that has been launched on that - compute node. Files ending in _20 (or a - different number) are the ephemeral base - images. - The other directories are titled - instance-xxxxxxxx. These directories - correspond to instances running on that compute node. - The files inside are related to one of the files in - the _base directory. They're essentially - differential-based files containing only the changes - made from the original _base - directory. - All files and directories in - /var/lib/nova/instances are uniquely - named. The files in _base are uniquely titled for the - glance image that they are based on and the directory - names instance-xxxxxxxx are uniquely - titled for that particular instance. For example, if - you copy all data from - /var/lib/nova/instances on one - compute node to another, you do not overwrite any - files or cause any damage to images that have the same - unique name, because they are essentially the same - file. - Although this method is not documented or supported, - you can use it when your compute node is permanently - offline but you have instances locally stored on - it. -
-
-
- - Storage Node Failures and Maintenance - Due to the Object Storage's high redundancy, dealing - with object storage node issues is a lot easier than - dealing with compute node issues. -
- - Rebooting a Storage Node - If a storage node requires a reboot, simply reboot - it. Requests for data hosted on that node are - redirected to other copies while the server is - rebooting. -
-
- - Shutting Down a Storage Node - If you need to shut down a storage node for an - extended period of time (1+ days), consider removing - the node from the storage ring. For example: - # swift-ring-builder account.builder remove <ip address of storage node> -# swift-ring-builder container.builder remove <ip address of storage node> -# swift-ring-builder object.builder remove <ip address of storage node> -# swift-ring-builder account.builder rebalance -# swift-ring-builder container.builder rebalance -# swift-ring-builder object.builder rebalance - Next, redistribute the ring files to the other - nodes: - # for i in s01.example.com s02.example.com s03.example.com -> do -> scp *.ring.gz $i:/etc/swift -> done - These actions effectively take the storage node out - of the storage cluster. - When the node is able to rejoin the cluster, just - add it back to the ring. The exact syntax to add a - node to your Swift cluster using - swift-ring-builder heavily depends on - the original options used when you originally created - your cluster. Please refer back to those - commands. -
-
- - Replacing a Swift Disk - If a hard drive fails in a Object Storage node, - replacing it is relatively easy. This assumes that - your Object Storage environment is configured - correctly where the data that is stored on the failed drive - is also replicated to other drives in the Object - Storage environment. - This example assumes that /dev/sdb has - failed. - First, unmount the disk: - # umount /dev/sdb - Next, physically remove the disk from the server and - replace it with a working disk. - Ensure that the operating system has recognized the - new disk: - # dmesg | tail - You should see a message about /dev/sdb. - Because it is recommended to not use partitions on a - swift disk, simply format the disk as a whole: - # mkfs.xfs -i size=1024 /dev/sdb - Finally, mount the disk: - # mount -a - Swift should notice the new disk and that no data - exists. It then begins replicating the data to the - disk from the other existing replicas. -
-
-
- - Handling a Complete Failure - A common way of dealing with the recovery from a full - system failure, such as a power outage of a data center is - to assign each service a priority, and restore in - order. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Example Service Restoration Priority - List
1Internal network - connectivity
2Backing storage - services
3Public network connectivity for - user Virtual Machines
4Nova-compute, nova-network, cinder - hosts
5User virtual machines
10Message Queue and Database - services
15Keystone services
20cinder-scheduler
21Image Catalogue and Delivery - services
22nova-scheduler services
98Cinder-api
99Nova-api services
100Dashboard node
- Use this example priority list to ensure that user - affected services are restored as soon as possible, but - not before a stable environment is in place. Of course, - despite being listed as a single line item, each step - requires significant work. For example, just after - starting the database, you should check its integrity or, - after starting the Nova services, you should verify that - the hypervisor matches the database and fix any - mismatches. -
-
- - Configuration Management - Maintaining an OpenStack cloud requires that you manage - multiple physical servers, and this number might grow over - time. Because managing nodes manually is error-prone, we - strongly recommend that you use a configuration management - tool. These tools automate the process of ensuring that - all of your nodes are configured properly and encourage - you to maintain your configuration information (such as - packages and configuration options) in a version - controlled repository. - Several configuration management tools are available, - and this guide does not recommend a specific one. The two - most popular ones in the OpenStack community are Puppet - (https://puppetlabs.com/) with available OpenStack Puppet modules - (http://github.com/puppetlabs/puppetlabs-openstack) and - Chef (http://opscode.com/chef) with available - OpenStack Chef recipes - (https://github.com/opscode/openstack-chef-repo). Other - newer configuration tools include Juju - (https://juju.ubuntu.com/) Ansible - (http://ansible.cc) and Salt - (http://saltstack.com), and more mature configuration - management tools include CFEngine - (http://cfengine.com) and Bcfg2 - (http://bcfg2.org). -
-
- - Working with Hardware - Similar to your initial deployment, you should ensure - all hardware is appropriately burned in before adding it - to production. Run software that uses the hardware to its - limits - maxing out RAM, CPU, disk and network. Many - options are available, and normally double as benchmark - software so you also get a good idea of the performance of - your system. -
- - Adding a Compute Node - If you find that you have reached or are reaching - the capacity limit of your computing resources, you - should plan to add additional compute nodes. Adding - more nodes is quite easy. The process for adding nodes - is the same as when the initial compute nodes were - deployed to your cloud: use an automated deployment - system to bootstrap the bare-metal server with the - operating system and then have a configuration - management system install and configure the OpenStack - Compute service. Once the Compute service has been - installed and configured in the same way as the other - compute nodes, it automatically attaches itself to the - cloud. The cloud controller notices the new node(s) - and begin scheduling instances to launch there. - If your OpenStack Block Storage nodes are separate - from your compute nodes, the same procedure still - applies as the same queuing and polling system is used - in both services. - We recommend that you use the same hardware for new - compute and block storage nodes. At the very least, - ensure that the CPUs are similar in the compute nodes - to not break live migration. -
-
- - Adding an Object Storage Node - Adding a new object storage node is different than - adding compute or block storage nodes. You still want - to initially configure the server by using your - automated deployment and configuration management - systems. After that is done, you need to add the local - disks of the object storage node into the object - storage ring. The exact command to do this is the same - command that was used to add the initial disks to the - ring. Simply re-run this command on the object storage - proxy server for all disks on the new object storage - node. Once this has been done, rebalance the ring and - copy the resulting ring files to the other storage - nodes. - - If your new object storage node has a different - number of disks than the original nodes have, the - command to add the new node is different than the - original commands. These parameters vary from - environment to environment. - -
-
- - Replacing Components - Failures of hardware are common in large scale - deployments such as an infrastructure cloud. Consider - your processes and balance time saving against - availability. For example, an Object Storage cluster - can easily live with dead disks in it for some period - of time if it has sufficient capacity. Or, if your - compute installation is not full you could consider - live migrating instances off a host with a RAM failure - until you have time to deal with the problem. -
-
-
- - Databases - Almost all OpenStack components have an underlying - database to store persistent information. Usually this - database is MySQL. Normal MySQL administration is - applicable to these databases. OpenStack does not - configure the databases out of the ordinary. Basic - administration includes performance tweaking, high - availability, backup, recovery, and repairing. For more - information, see a standard MySQL administration - guide. - You can perform a couple tricks with the database to - either more quickly retrieve information or fix a data - inconsistency error. For example, an instance was - terminated but the status was not updated in the database. - These tricks are discussed throughout this book. -
- - Database Connectivity - Review the components configuration file to see how - each OpenStack component accesses its corresponding - database. Look for either sql_connection - or simply connection: - # grep -hE "connection ?=" /etc/nova/nova.conf /etc/glance/glance-*.conf -/etc/cinder/cinder.conf /etc/keystone/keystone.conf - sql_connection = mysql://nova:nova@cloud.alberta.sandbox.cybera.ca/nova - sql_connection = mysql://glance:password@cloud.example.com/glance - sql_connection = mysql://glance:password@cloud.example.com/glance - sql_connection=mysql://cinder:password@cloud.example.com/cinder - connection = mysql://keystone_admin:password@cloud.example.com/keystone - The connection strings take this format: - mysql:// <username> : <password> @ <hostname> / <database name> -
-
- - Performance and Optimizing - As your cloud grows, MySQL is utilized more and - more. If you suspect that MySQL might be becoming a - bottleneck, you should start researching MySQL - optimization. The MySQL manual has an entire section - dedicated to this topic Optimization Overview - (http://dev.mysql.com/doc/refman/5.5/en/optimize-overview.html). -
-
-
- - HDWMY - Here's a quick list of various to-do items each hour, - day, week, month, and year. Please note these tasks are - neither required nor definitive, but helpful ideas: -
- - Hourly - - - Check your monitoring system for alerts and - act on them. - - - Check your ticket queue for new - tickets. - - -
-
- - Daily - - - Check for instances in a failed or weird - state and investigate why. - - - Check for security patches and apply them as - needed. - - -
-
- - Weekly - - - Check cloud usage: - - User quotas - - - Disk space - - - Image usage - - - Large instances - - - Network usage (bandwidth and IP - usage) - - - - - Verify your alert mechanisms are still - working. - - -
-
- - Monthly - - - Check usage and trends over the past - month. - - - Check for user accounts that should be - removed. - - - Check for operator accounts that should be - removed. - - -
-
- - Quarterly - - - Review usage and trends over the past - quarter. - - - Prepare any quarterly reports on usage and - statistics. - - - Review and plan any necessary cloud - additions. - - - Review and plan any major OpenStack - upgrades. - - -
-
- - Semi-Annually - - - Upgrade OpenStack. - - - Clean up after OpenStack upgrade (any unused - or new services to be aware of?) - - -
-
-
- - Determining which Component Is Broken - OpenStack's collection of different components interact - with each other strongly. For example, uploading an image - requires interaction from nova-api, - glance-api, glance-registry, - Keystone, and potentially swift-proxy. As a - result, it is sometimes difficult to determine exactly - where problems lie. Assisting in this is the purpose of - this section. -
- - Tailing Logs - The first place to look is the log file related to - the command you are trying to run. For example, if - nova list is failing, try tailing a - Nova log file and running the command again: - Terminal 1: - # tail -f /var/log/nova/nova-api.log - Terminal 2: - # nova list - Look for any errors or traces in the log file. For - more information, see the chapter on Logging and - Monitoring. - If the error indicates that the problem is with - another component, switch to tailing that component's - log file. For example, if nova cannot access glance, - look at the glance-api log: - Terminal 1: - # tail -f /var/log/glance/api.log - Terminal 2: - # nova list - Wash, rinse, repeat until you find the core cause of - the problem. -
- -
- - Running Daemons on the CLI - Unfortunately, sometimes the error is not apparent - from the log files. In this case, switch tactics and - use a different command, maybe run the service - directly on the command line. For example, if the - glance-api service refuses to start - and stay running, try launching the daemon from the - command line: - # sudo -u glance -H glance-api - This might print the error and cause of the problem. - The -H flag is required - when running the daemons with sudo because - some daemons will write files relative to the - user's home directory, and this write may fail - if -H is left off. - -
-
- - Example of Complexity - One morning, a compute node failed to run any - instances. The log files were a bit vague, claiming - that a certain instance was unable to be started. This - ended up being a red herring because the instance was - simply the first instance in alphabetical order, so it - was the first instance that nova-compute would touch. - Further troubleshooting showed that libvirt was not - running at all. This made more sense. If libvirt - wasn't running, then no instance could be virtualized - through KVM. Upon trying to start libvirt, it would - silently die immediately. The libvirt logs did not - explain why. - Next, the libvirtd daemon was run on - the command line. Finally a helpful error message: it - could not connect to d-bus. As ridiculous as it - sounds, libvirt, and thus nova-compute, - relies on d-bus and somehow d-bus crashed. Simply - starting d-bus set the entire chain back on track and - soon everything was back up and running. -
-
- - Upgrades - With the exception of Object Storage, an upgrade - from one version of OpenStack to another is a great - deal of work. - The upgrade process generally follows these - steps: - - - Read the release notes and - documentation. - - - Find incompatibilities between different - versions. - - - Plan an upgrade schedule and complete it in - order on a test cluster. - - - Run the upgrade. - - - You can perform an upgrade while user instances run. - However, this strategy can be dangerous. Don't forget - appropriate notice to your users, and backups. - The general order that seems to be most successful - is: - - - Upgrade the OpenStack Identity service - (keystone). - - - Upgrade the OpenStack Image service - (glance). - - - Upgrade all OpenStack Compute (nova) - services. - - - Upgrade all OpenStack Block Storage (cinder) - services. - - - For each of these steps, complete the following - sub-steps: - - - Stop services. - - - Create a backup of configuration files and - databases. - - - Upgrade the packages using your - distribution's package manager. - - - Update the configuration files according to - the release notes. - - - Apply the database upgrades. - - - Restart the services. - - - Verify that everything is running. - - - Probably the most important step of all is the - pre-upgrade testing. Especially if you are upgrading - immediately after release of a new version, - undiscovered bugs might hinder your progress. Some - deployers prefer to wait until the first point release - is announced. However, if you have a significant - deployment, you might follow the development and - testing of the release, thereby ensuring that bugs for - your use cases are fixed. - To complete an upgrade of OpenStack Compute while - keeping instances running, you should be able to use - live migration to move machines around while - performing updates, and then move them back afterward - as this is a property of the hypervisor. However, it - is critical to ensure that database changes are - successful otherwise an inconsistent cluster state could - arise. -
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_network_troubleshooting.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_network_troubleshooting.xml deleted file mode 100644 index 78a55ed6224..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_network_troubleshooting.xml +++ /dev/null @@ -1,443 +0,0 @@ - - - - - - - - -]> - - - Network Troubleshooting - Network troubleshooting can unfortunately be a very - difficult and confusing procedure. A network issue can cause a - problem at several points in the cloud. Using a logical - troubleshooting procedure can help mitigate the confusion and - more quickly isolate where exactly the network issue is. This - chapter aims to give you the information you need to make - yours. -
- Using "ip a" to Check Interface States - On compute nodes and nodes running nova-network, use the - following command to see information about interfaces, - including information about IPs, VLANs, and whether your - interfaces are up. - # ip a - If you're encountering any sort of networking - difficulty, one good initial sanity check is to make sure - that your interfaces are up. For example: - $ ip a | grep state -1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN -2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 -3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br100 state UP qlen 1000 -4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN -6: br100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP - You can safely ignore the state of virbr0, which is a - default bridge created by QEMU and not used by - OpenStack. -
-
- Network Traffic in the Cloud - If you are logged in to an instance and ping an external - host, for example google.com, the ping packet takes the - following route: - - - - - - - - - - The instance generates a packet and places it on - the virtual NIC inside the instance, such as, - eth0. - - - The packet transfers to the virtual NIC of the - compute host, such as, vnet1. You can find out - what vent NIC is being used by looking at the - /etc/libvirt/qemu/instance-xxxxxxxx.xml file. - - - - From the vnet NIC, the packet transfers to a - bridge on the compute node, such as, - br100. - - If you run FlatDHCPManager, one bridge is on - the compute node. If you run VlanManager, one - bridge exists for each VLAN. - To see which bridge the packet will use, run the - command: - $ brctl show - - Look for the vnet NIC. You can also reference - nova.conf and look for the flat_interface_bridge - option. - - - - The packet transfers to the main NIC of the - compute node. You can also see this NIC in the - brctl output, or you can find it by referencing - the flat_interface option in nova.conf. - - - - - After the packet is on this NIC, it transfers to - the compute node's default gateway. The packet is - now most likely out of your control at this point. - The diagram depicts an external gateway. However, - in the default configuration with multi-host, the - compute host is the gateway. - - - - Reverse the direction to see the path of a ping - reply. - From this path, you can see that a single packet travels - across four different NICs. If a problem occurs with any - of these NICs, a network issue occurs. -
-
- Finding a Failure in the Path - Use ping to quickly find where a failure exists in the - network path. In an instance, first see if you can ping an - external host, such as google.com. If you can, then there - shouldn't be a network problem at all. - If you can't, try pinging the IP address of the compute - node where the instance is hosted. If you can ping this - IP, then the problem is somewhere between the compute node - and that compute node's gateway. - If you can't ping the IP address of the compute node, - the problem is between the instance and the compute node. - This includes the bridge connecting the compute node's - main NIC with the vnet NIC of the instance. - One last test is to launch a second instance and see if - the two instances can ping each other. If they can, the - issue might be related to the firewall on the compute - node. -
-
- tcpdump - One great, although very in-depth, way of - troubleshooting network issues is to use tcpdump. It's - recommended to use tcpdump at several points along the - network path to correlate where a problem might be. If you - prefer working with a GUI, either live or by using a - tcpdump capture do also check out Wireshark (http://www.wireshark.org/). - For example, run the following command: - - tcpdump -i any -n -v 'icmp[icmptype] = - icmp-echoreply or icmp[icmptype] = icmp-echo' - - Run this on the command line of the following - areas: - - - An external server outside of the cloud. - - - A compute node. - - - An instance running on that compute node. - - - In this example, these locations have the following IP - addresses: - DWC: Check formatting of the following: - - Instance - 10.0.2.24 - 203.0.113.30 - Compute Node - 10.0.0.42 - 203.0.113.34 - External Server - 1.2.3.4 - - Next, open a new shell to the instance and then ping the - external host where tcpdump is running. If the network - path to the external server and back is fully functional, - you see something like the following: - On the external server: - 12:51:42.020227 IP (tos 0x0, ttl 61, id 0, offset 0, flags [DF], proto ICMP (1), length 84) - 203.0.113.30 > 1.2.3.4: ICMP echo request, id 24895, seq 1, length 64 -12:51:42.020255 IP (tos 0x0, ttl 64, id 8137, offset 0, flags [none], proto ICMP (1), length 84) - 1.2.3.4 > 203.0.113.30: ICMP echo reply, id 24895, seq 1, length 64 - On the Compute Node: - 12:51:42.019519 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) - 10.0.2.24 > 1.2.3.4: ICMP echo request, id 24895, seq 1, length 64 -12:51:42.019519 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) - 10.0.2.24 > 1.2.3.4: ICMP echo request, id 24895, seq 1, length 64 -12:51:42.019545 IP (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto ICMP (1), length 84) - 203.0.113.30 > 1.2.3.4: ICMP echo request, id 24895, seq 1, length 64 -12:51:42.019780 IP (tos 0x0, ttl 62, id 8137, offset 0, flags [none], proto ICMP (1), length 84) - 1.2.3.4 > 203.0.113.30: ICMP echo reply, id 24895, seq 1, length 64 -12:51:42.019801 IP (tos 0x0, ttl 61, id 8137, offset 0, flags [none], proto ICMP (1), length 84) - 1.2.3.4 > 10.0.2.24: ICMP echo reply, id 24895, seq 1, length 64 -12:51:42.019807 IP (tos 0x0, ttl 61, id 8137, offset 0, flags [none], proto ICMP (1), length 84) - 1.2.3.4 > 10.0.2.24: ICMP echo reply, id 24895, seq 1, length 64 - On the Instance: - 12:51:42.020974 IP (tos 0x0, ttl 61, id 8137, offset 0, flags [none], proto ICMP (1), length 84) - 1.2.3.4 > 10.0.2.24: ICMP echo reply, id 24895, seq 1, length 64 - Here, the external server received the ping request and - sent a ping reply. On the compute node, you can see that - both the ping and ping reply successfully passed through. - You might also see duplicate packets on the compute node, - as seen above, because tcpdump captured the packet on both - the bridge and outgoing interface. -
-
- iptables - Nova automatically manages iptables, including - forwarding packets to and from instances on a compute - node, forwarding floating IP traffic, and managing - security group rules. - Run the following command to view the current iptables - configuration: - # iptables-save - If you modify the - configuration, it reverts the next time you restart - nova-network. You must use OpenStack to manage - iptables. -
-
- Network Configuration in the Database - The nova database table contains a few tables with - networking information: - - - fixed_ips: contains each possible IP address - for the subnet(s) added to Nova. This table is - related to the instances table by way of the - fixed_ips.instance_uuid column. - - - floating_ips: contains each floating IP address - that was added to nova. This table is related to - the fixed_ips table by way of the - floating_ips.fixed_ip_id column. - - - instances: not entirely network specific, but - it contains information about the instance that is - utilizing the fixed_ip and optional - floating_ip. - - - From these tables, you can see that a Floating IP is - technically never directly related to an instance, it must - always go through a Fixed IP. -
- Manually De-Associating a Floating IP - Sometimes an instance is terminated but the Floating - IP was not correctly de-associated from that instance. - Because the database is in an inconsistent state, the - usual tools to de-associate the IP no longer work. To - fix this, you must manually update the - database. - First, find the UUID of the instance in - question: - mysql> select uuid from instances where hostname = 'hostname'; - Next, find the Fixed IP entry for that UUID: - mysql> select * from fixed_ips where instance_uuid = '<uuid>'; - You can now get the related Floating IP - entry: - mysql> select * from floating_ips where fixed_ip_id = '<fixed_ip_id>'; - And finally, you can de-associate the Floating - IP: - mysql> update floating_ips set fixed_ip_id = NULL, host = NULL where fixed_ip_id = '<fixed_ip_id>'; - You can optionally also de-allocate the IP from the - user's pool: - mysql> update floating_ips set project_id = NULL where fixed_ip_id = '<fixed_ip_id>'; -
-
-
- Debugging DHCP Issues - One common networking problem is that an instance boots - successfully but is not reachable because it failed to - obtain an IP address from dnsmasq, which is the DHCP - server that is launched by the nova-network - service. - The simplest way to identify that this the problem with - your instance is to look at the console output of your - instance. If DHCP failed, you can retrieve the console log - by doing: - $ nova console-log <instance name or uuid> - If your instance failed to obtain an IP through DHCP, - some messages should appear in the console. For example, - for the Cirros image, you see output that looks - like: - udhcpc (v1.17.2) started -Sending discover... -Sending discover... -Sending discover... -No lease, forking to background -starting DHCP forEthernet interface eth0 [ [1;32mOK[0;39m ] -cloud-setup: checking http://169.254.169.254/2009-04-04/meta-data/instance-id -wget: can't connect to remote host (169.254.169.254): Network is unreachable - After you establish that the instance booted properly, - the task is to figure out where the failure is. - A DHCP problem might be caused by a misbehaving dnsmasq - process. First, debug by checking logs and then - restart the dnsmasq processes only for that project - (tenant). In VLAN mode there is a dnsmasq process for each - tenant. Once you have restarted targeted dnsmasq - processes, the simplest way to rule out dnsmasq causes is - to kill all of the dnsmasq processes on the machine, and - restart nova-network. As a last resort, do this as - root: - # killall dnsmasq -# restart nova-network - Several minutes after nova-network is restarted, you - should see new dnsmasq processes running: - # ps aux | grep dnsmasq -nobody 3735 0.0 0.0 27540 1044 ? S 15:40 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= - --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 - --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 - --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro -root 3736 0.0 0.0 27512 444 ? S 15:40 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= - --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 - --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 - --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro - If your instances are still not able to obtain IP - addresses, the next thing to check is if dnsmasq is seeing - the DHCP requests from the instance. On the machine that - is running the dnsmasq process, which is the compute host - if running in multi-host mode, look at /var/log/syslog to - see the dnsmasq output. If dnsmasq is seeing the request - properly and handing out an IP, the output looks - like: - Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPDISCOVER(br100) fa:16:3e:56:0b:6f -Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPOFFER(br100) 192.168.100.3 fa:16:3e:56:0b:6f -Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPREQUEST(br100) 192.168.100.3 fa:16:3e:56:0b:6f -Feb 27 22:01:36 mynode dnsmasq-dhcp[2438]: DHCPACK(br100) 192.168.100.3 fa:16:3e:56:0b:6f test - If you do not see the DHCPDISCOVER, a problem exists - with the packet getting from the instance to the machine - running dnsmasq. If you see all of above output and your - instances are still not able to obtain IP addresses then - the packet is able to get from the instance to the host - running dnsmasq, but it is not able to make the return - trip. - If you see any other message, such as: - Feb 27 22:01:36 mynode dnsmasq-dhcp[25435]: DHCPDISCOVER(br100) fa:16:3e:78:44:84 no address available - Then this may be a dnsmasq and/or nova-network related - issue. (For the example above, the problem happened to be - that dnsmasq did not have any more IP addresses to give - away because there were no more Fixed IPs available in the - OpenStack Compute database). - If there's a suspicious-looking dnsmasq log message, - take a look at the command-line arguments to the dnsmasq - processes to see if they look correct. - $ ps aux | grep dnsmasq - The output looks something like: - 108 1695 0.0 0.0 25972 1000 ? S Feb26 0:00 /usr/sbin/dnsmasq -u libvirt-dnsmasq --strict-order --bind-interfaces - --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listen-address 192.168.122.1 - --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases - --dhcp-lease-max=253 --dhcp-no-override -nobody 2438 0.0 0.0 27540 1096 ? S Feb26 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= - --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 - --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 - --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro -root 2439 0.0 0.0 27512 472 ? S Feb26 0:00 /usr/sbin/dnsmasq --strict-order --bind-interfaces --conf-file= - --domain=novalocal --pid-file=/var/lib/nova/networks/nova-br100.pid --listen-address=192.168.100.1 - --except-interface=lo --dhcp-range=set:'novanetwork',192.168.100.2,static,120s --dhcp-lease-max=256 - --dhcp-hostsfile=/var/lib/nova/networks/nova-br100.conf --dhcp-script=/usr/bin/nova-dhcpbridge --leasefile-ro - If the problem does not seem to be related to dnsmasq - itself, at this point, use tcpdump on the interfaces to - determine where the packets are getting lost. - DHCP traffic uses UDP. The client sends from port 68 to - port 67 on the server. Try to boot a new instance and then - systematically listen on the NICs until you identify the - one that isn't seeing the traffic. To use tcpdump to - listen to ports 67 and 68 on br100, you would do: - # tcpdump -i br100 -n port 67 or port 68 - You should be doing sanity checks on the interfaces - using command such as "ip a" and "brctl - show" to ensure that the interfaces are - actually up and configured the way that you think that - they are. -
-
- Debugging DNS Issues - If you are able to ssh into an instance, but it takes a - very long time (on the order of a minute) to get a prompt, - then you might have a DNS issue. The reason a DNS issue - can cause this problem is that the ssh server does a - reverse DNS lookup on the IP address that you are - connecting from. If DNS lookup isn't working on your - instances, then you must wait for the DNS reverse lookup - timeout to occur for the ssh login process to - complete. - When debugging DNS issues, start by making sure the host - where the dnsmasq process for that instance runs is able - to correctly resolve. If the host cannot resolve, then the - instances won't be able either. - A quick way to check if DNS is working is to - resolve a hostname inside your instance using the - host command. If DNS is working, you - should see: - $ host openstack.org -openstack.org has address 174.143.194.225 -openstack.org mail is handled by 10 mx1.emailsrvr.com. -openstack.org mail is handled by 20 mx2.emailsrvr.com. - If you're running the Cirros image, it doesn't have the - "host" program installed, in which case you can use ping - to try to access a machine by hostname to see if it - resolves. If DNS is working, the first line of ping would - be: - $ ping openstack.org -PING openstack.org (174.143.194.225): 56 data bytes - If the instance fails to resolve the hostname, you have - a DNS problem. For example: - $ ping openstack.org -ping: bad address 'openstack.org' - In an OpenStack cloud, the dnsmasq process acts as the - DNS server for the instances in addition to acting as the - DHCP server. A misbehaving dnsmasq process may be the - source of DNS-related issues inside the instance. As - mentioned in the previous section, the simplest way to - rule out a misbehaving dnsmasq process is to kill all of - the dnsmasq processes on the machine, and restart - nova-network. However, be aware that this command affects - everyone running instances on this node, including tenants - that have not seen the issue. As a last resort, as - root: - # killall dnsmasq -# restart nova-network - After the dnsmasq processes start again, check if DNS is - working. - If restarting the dnsmasq process doesn't fix the issue, - you might need to use tcpdump to look at the packets to - trace where the failure is. The DNS server listens on UDP - port 53. You should see the DNS request on the bridge - (such as, br100) of your compute node. If you start - listening with tcpdump on the compute node: - # tcpdump -i br100 -n -v udp port 53 -tcpdump: listening on br100, link-type EN10MB (Ethernet), capture size 65535 bytes - Then, if you ssh into your instance and try to - ping openstack.org, you should see - something like: - 16:36:18.807518 IP (tos 0x0, ttl 64, id 56057, offset 0, flags [DF], proto UDP (17), length 59) - 192.168.100.4.54244 > 192.168.100.1.53: 2+ A? openstack.org. (31) -16:36:18.808285 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 75) - 192.168.100.1.53 > 192.168.100.4.54244: 2 1/0/0 openstack.org. A 174.143.194.225 (47) -
- - - -
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_projects_users.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_projects_users.xml deleted file mode 100644 index 682709de3e2..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_projects_users.xml +++ /dev/null @@ -1,655 +0,0 @@ - - - - - - - -]> - - - Managing Projects and Users - An OpenStack cloud does not have much value without users. - This chapter covers topics that relate to managing users, - projects, and quotas. -
- Projects or Tenants? - In OpenStack user interfaces and documentation, a group - of users is referred to as a - project or - tenant. These terms are - interchangeable. - The initial implementation of the OpenStack Compute - Service (nova) had its own authentication system and used - the term project. When authentication - moved into the OpenStack Identity Service (keystone) - project, it used the term tenant to - refer to a group of users. Because of this legacy, some of - the OpenStack tools refer to projects and some refer to - tenants. - This guide uses the term project, - unless an example shows interaction with a tool that uses - the term tenant. -
-
- Managing Projects - Users must be associated with at least one project, - though they may belong to many. Therefore, you should add - at least one project before adding users. -
- Adding Projects - To create a project through the dashboard: - - - Log in as an administrative user. - - - Select the "Projects" link in the left hand - navigation bar. - - - Click on the "Create Project" button at the - top right. - - - You are prompted for a project name and an optional, - but recommended, description. Select the check box at - the bottom of the form to enable this project. By - default, this is enabled. - - It is also possible to add - project members and adjust the project quotas. We'll - discuss those later, but in practice it can be quite - convenient to deal with all these operations at one - time. - To create a project through the command-line - interface (CLI): - To add a project through the command line, you must - use the keystone utility, which uses "tenant" in place - of "project":  - # keystone tenant-create --name=demo - This command creates a project named "demo". - Optionally, you can add a description string by - appending --description - <tenant-description>, which can be - very useful. You can also create a group in a disabled - state by appending --enabled false to the - command. By default, projects are created in an - enabled state. -
-
- -
- Quotas - OpenStack provides a number of quotas which are all - enforced at the project (rather than user) level. As an - administrative user in the Dashboard you can see (but not - edit) the default quotas using the "Quotas" link in the - navigation sidebar. These default project quotas are - specified in the nova.conf file on your cloud - controller. - If you do not make quota-related changes, the system - uses the following defaults. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Description of nova.conf file configuration - options for - quotas -
Configuration option=Default value (Type) Description
- quota_cores=20 - - (IntOpt) number of instance cores - allowed per project (tenant) -
- quota_floating_ips=10 - - (IntOpt) number of floating ips allowed - per project (tenant) -
- quota_fixed_ips=-1 - - (IntOpt) number of floating ips allowed - per project (this should be at least the - number of instances allowed). -1 is unlimited -
- quota_gigabytes=1000 - - (IntOpt) number of volume gigabytes - allowed per project (tenant) -
- quota_injected_file_content_bytes=10240 - - (IntOpt) number of bytes allowed per - injected file -
- quota_injected_file_path_bytes=255 - - (IntOpt) number of bytes allowed per - injected file path -
- quota_injected_files=5 - - (IntOpt) number of injected files - allowed -
- quota_instances=10 - - (IntOpt) number of instances allowed per - project (tenant) -
- quota_key_pairs=100 - - (IntOpt) number of key pairs allowed per - user -
- quota_metadata_items=128 - - (IntOpt) number of metadata items - allowed per instance -
- quota_ram=51200 - - (IntOpt) megabytes of instance ram - allowed per project (tenant) -
- quota_security_group_rules=20 - - (IntOpt) number of security rules per - security group -
- quota_security_groups=10 - - (IntOpt) number of security groups per - project (tenant) -
- quota_volumes=10 - - (IntOpt) number of volumes allowed per - project (tenant) -
- Configuration table excerpted from http://docs.openstack.org/folsom/openstack-compute/admin/content/list-of-compute-config-options.html. - The simplest way to change the default project quotas is - to edit the nova.conf file on your cloud - controller. Quotas are enforced by the - nova-scheduler service, so you must - restart that service once you change these options. - If your site implementation varies from our example - architecture, ensure any changes you make to quota default - options in /etc/nova/nova.conf are applied to - the host(s) running the nova-scheduler - service. It is critical for consistent quota enforcement - that all schedulers have identical quotas. Assuming you - are following the best practices recommended in this - guide, your configuration management system will - automatically ensure all your schedulers have consistent - configurations. - To view and edit quotas for an individual project through the - Dashboard: - - - Use the "Projects" navigation link to get a list - of your existing projects. - - - Locate the project you want to modify and select - "Modify Quotas" from the "Actions" drop down menu - a the end of the line.   - - - To view and edit quotas for an individual project through the - CLI, follow these steps: - You can access and modify quotas from the command line - but it is a bit complicated. This is done using Keystone - to get the ID and then nova-manage. - - - To list a project's quota, you must first find - its ID using the Keystone CLI tool. - # keystone tenant-list | grep <tenant-name> -| 98333a1a28e746fa8c629c83a818ad57 | <tenant-name> | True | - - - Recall that the Keystone CLI tool uses "tenant" - where the Nova CLI tool uses "project" for the - same concept. - To show the quota for the project, for the - example above, we must use the ID - 98333a1a28e746fa8c629c83a818ad57: - # nova-manage project quota 98333a1a28e746fa8c629c83a818ad57 - metadata_items: 128 -volumes: 10 -gigabytes: 1000 -ram: 6291456 -security_group_rules: 20 -instances: 1024 -security_groups: 10 -injected_file_content_bytes: 10240 -floating_ips: 10 -injected_files: 5 -cores: 2048 - - Confusingly, nova-manage project - quota silently accepts any string - at the end of the command and reports the - default quotas. In particular, if you enter - the project name rather than the ID, - nova-manage does not - complain, it just lies. - - To change these values you append - --key and --value - flags to the above command. To increase the tenant - quota of Floating IPs from 10 to 20: - # nova-manage project quota 98333a1a28e746fa8c629c83a818ad57 --key floating_ips --value 20 - metadata_items: 128 -volumes: 10 -gigabytes: 1000 -ram: 6291456 -security_group_rules: 20 -instances: 1024 -security_groups: 10 -injected_file_content_bytes: 10240 -floating_ips: 20 -injected_files: 5 -cores: 2048 - - -
-
- User Management - The command line tools for managing users are - inconvenient to use directly. They require issuing - multiple commands to complete a single task, and they use - UUIDs rather than symbolic names for many items. In - practice, humans typically do not use these tools - directly. Fortunately, the OpenStack Dashboard provides a - reasonable interface to this. In addition, many sites - write custom tools for local needs to enforce local - policies and provide levels of self service to users that - aren't currently available with packaged tools. -
-
- Creating New Users - To create a user, you need the following - information: - - - Username - - - Email address - - - Password - - - Primary project - - - Role - - - Username and email address are self-explanatory, though - your site may have local conventions you should observe. - Setting and changing passwords in the Identity Service - requires administrative privileges. As of the Folsom - release, users cannot change their own passwords. This is - a large driver for creating local custom tools, and must - be kept in mind when assigning and distributing passwords. - The primary project is simply the first project the user - is associated with and must exist prior to creating the - user. Role is almost always going to be "member". Out of - the box, OpenStack comes with two roles defined: - - - "member":  a typical user. - - - "admin":  an administrative super user which has - full permissions across all projects and should be - used with great care. - - - It is possible to define other roles, but doing so is - uncommon. - Once you've gathered this information, creating the user - in the Dashboard is just another web form similar to what - we've seen before and can be found on the "Users" link in - the "Admin" navigation bar and then clicking the "Create - User" button at the top right. - Modifying users is also done from this "Users" page. If - you have a large number of users, this page can get quite - crowded. The "Filter" search box at the top of the page - can be used to limit the users listing. A form very - similar to the user creation dialog can be pulled up by - selecting "Edit" from the actions drop down menu at the - end of the line for the user you are modifying. -
-
- Associating Users with Projects - Many sites run with users being associated with only one - project. This is a more conservative and simpler choice - both for administration and for users. Administratively if - a user reports a problem with an instance or quota it is - obvious which project this relates to as well. Users - needn't worry about what project they are acting in if - they are only in one project. However, note that, by - default, any user can affect the resources of any other - user within their project. It is also possible to - associate users with multiple projects if that makes sense - for your organization. - Associating existing users with an additional project or - removing them from an older project is done from the - "Projects" page of the Dashboard by selecting the "Modify - Users" from the "Actions" column: - - - - - - - - From this view you can do a number of useful and a few - dangerous things. - The first column of this form, titled "All Users", will - include a list of all the users in your cloud who are not - already associated with this project and the second all - the users who are. These can be quite long, but can be - limited by typing a substring of the user name you are - looking for in the filter field at the top of the - column. - From here, click the + icon to add - users to the project. Click the - to - remove them. - The dangerous possibility comes in the ability to change - member roles. This is the drop down list after the user - name in the "Project Members" list. In virtually all cases - this value should be set to "Member". This example - purposefully show and administrative user where this value - is "admin".The "admin" is global not per project so granting a user the - admin role in any project gives the administrative - rights across the whole cloud. - Typical use is to only create administrative users in a - single project, by convention the "admin" project which is - created by default during cloud setup. If your - administrative users also use the cloud to launch and - manage instances it is strongly recommended that you use - separate user accounts for administrative access and - normal operations and that they be in distinct - projects. -
- Customizing Authorization - The default authorization - settings only allow administrative users to create - resources on behalf of a different project. OpenStack - handles two kind of authorization policies: - - - - Operation-based: policies - specify access criteria for specific - operations, possibly with fine-grained control - over specific attributes. - - - - Resource-based: whether access - to a specific resource might be granted or not - according to the permissions configured for - the resource (currently available only for the - network resource). The actual authorization - policies enforced in an OpenStack service vary - from deployment to deployment. - - - The policy engine reads entries from the - policy.json file. The actual location - of this file might vary from distribution to - distribution, for nova it is typically in - /etc/nova/policy.json. You can update - entries while the system is running, and you do not - have to restart services. Currently the only way to - update such policies is to edit the policy - file. - The OpenStack service's policy engine matches a - policy directly. A rule indicates evaluation of the - elements of such policies. For instance, in a - compute:create: - [["rule:admin_or_owner"]] statement, the - policy is compute:create, and the rule is - admin_or_owner. - Policies are triggered by an OpenStack policy engine - whenever one of them matches an OpenStack API - operation or a specific attribute being used in a - given operation. For instance, the engine tests the - create:compute policy every time a - user sends a POST /v2/{tenant_id}servers - request to the OpenStack Compute API server. Policies - can be also related to specific API - extensions. For instance, if a user - needs an extension like - compute_extension:rescue the - attributes defined by the provider extensions trigger - the rule test for that operation. - An authorization policy can be composed by one or - more rules. If more rules are specified, evaluation - policy is successful if any of the rules evaluates - successfully; if an API operation matches multiple - policies, then all the policies must evaluate - successfully. Also, authorization rules are recursive. - Once a rule is matched, the rule(s) can be resolved to - another rule, until a terminal rule is reached. These - are the rules defined: - - - - - Role-based - rules: evaluate successfully if - the user submitting the request has the - specified role. For instance - "role:admin"is successful if - the user submitting the request is an - administrator. - - - - - - Field-based rules: - evaluate successfully if a field of - the resource specified in the current request - matches a specific value. For instance - "field:networks:shared=True" - is successful if the attribute shared of the - network resource is set to true. - - - - - - Generic - rules: compare an attribute in - the resource with an attribute extracted from - the user's security credentials and evaluates - successfully if the comparison is successful. - For instance - "tenant_id:%(tenant_id)s" is - successful if the tenant identifier in the - resource is equal to the tenant identifier of - the user submitting the request. - - - - Here are snippets of the default nova - policy.json file: - { - "context_is_admin": [["role:admin"]], - "admin_or_owner": [["is_admin:True"], ["project_id:%(project_id)s"]], [1] - "default": [["rule:admin_or_owner"]], [2] - "compute:create": [ ], - "compute:create:attach_network": [ ], - "compute:create:attach_volume": [ ], - "compute:get_all": [ ], - "admin_api": [["is_admin:True"]], - "compute_extension:accounts": [["rule:admin_api"]], - "compute_extension:admin_actions": [["rule:admin_api"]], - "compute_extension:admin_actions:pause": [["rule:admin_or_owner"]], - "compute_extension:admin_actions:unpause": [["rule:admin_or_owner"]], - ... - "compute_extension:admin_actions:migrate": [["rule:admin_api"]], - "compute_extension:aggregates": [["rule:admin_api"]], - "compute_extension:certificates": [ ], - ... - "compute_extension:flavorextraspecs": [ ], - "compute_extension:flavormanage": [["rule:admin_api"]], [3] - } - - [1] Shows a rule which evaluates successfully if the - current user is an administrator or the owner of the - resource specified in the request (tenant identifier - is equal). - [2] Shows the default policy which is always - evaluated if an API operation does not match any of - the policies in policy.json. - [3] Shows a policy restricting the ability of - manipulating flavors to administrators using the Admin - API only. - In some cases, some operations should be restricted - to administrators only. Therefore, as a further - example, let us consider how this sample policy file - could be modified in a scenario where we enable users - to create their own flavors: - "compute_extension:flavormanage": [ ], -
-
- Users that Disrupt Other Users - Users on your cloud can disrupt other users, - sometimes intentionally and maliciously and other - times by accident. Understanding the situation allows - you to make a better decision on how to handle the - disruption. - For example: A group of users have instances that - are utilizing a large amount of compute resources for - very compute-intensive tasks. This is driving the load - up on compute nodes and affecting other users. In this - situation, review your user use cases. You may find - that high compute scenarios are common and should then - plan for proper segregation in your cloud such as host - aggregation or regions. - Another example is a user consuming a very large - amount of bandwidth. Again, the key is to understand - what the user is doing. If they naturally need a high - amount of bandwidth, you might have to limit their - transmission rate as to not affect other users or move - them to an area with more bandwidth available. On the - other hand, maybe the user's instance has been hacked - and is part of a botnet launching DDOS attacks. - Resolution to this issue is the same as if any other - server on your network has been hacked. Contact the - user and give them time to respond. If they don't - respond, shut the instance down. - A final example is if a user is hammering cloud - resources repeatedly. Contact the user and learn what - they are trying to do. Maybe they don't understand - that what they're doing is inappropriate or maybe - there is an issue with the resource they are trying to - access that is causing their requests to queue or - lag. - One key element of systems administration that is - often overlooked is that end users are the reason why - systems administrators exist. Don't go the BOFH route - and terminate every user who causes an alert to go - off. Work with them to understand what they're trying - to accomplish and see how your environment can better - assist them in achieving their goals. -
-
-
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_resources.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_resources.xml deleted file mode 100644 index a8f38ca1485..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_resources.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - -]> - - - Resources - - OpenStack - - - OpenStack Compute Administration Manual - (http://docs.openstack.org/folsom/openstack-compute/admin/content/) - - OpenStack Compute Install and Deploy Manual - - Ubuntu - (http://docs.openstack.org/folsom/openstack-compute/install/apt/content/) - - OpenStack Cloud Computing Cookbook - (http://www.packtpub.com/openstack-cloud-computing-cookbook/book) - - Cloud (general) - - - NIST Cloud Computing Definition - (http://csrc.nist.gov/publications/nistpubs/800-145/SP800-145.pdf) - - Python - - - Dive Into - Python (http://www.diveintopython.net) - - Networking - - - TCP/IP Illustrated - (http://www.pearsonhighered.com/educator/product/TCPIP-Illustrated-Volume-1-The-Protocols/9780321336316.page) - - The TCP/IP - Guide (http://nostarch.com/tcpip.htm) - - A - tcpdump Tutorial and Primer - (http://danielmiessler.com/study/tcpdump/) - - Systems administration - - - UNIX and Linux - Systems Administration Handbook - (http://www.admin.com/) - - Virtualization - - - The Book of - Xen (http://nostarch.com/xen.htm) - - Configuration management - - - Puppet Labs - Documentation (http://docs.puppetlabs.com/) - - Pro - Puppet (http://www.apress.com/9781430230571) - - diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_upstream.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_upstream.xml deleted file mode 100644 index aa11aff2b11..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_upstream.xml +++ /dev/null @@ -1,731 +0,0 @@ - - - - - - - - -]> - - - Upstream OpenStack - OpenStack is founded on a thriving community which is a - source of help, and welcomes your contributions. This section - details some of the ways you can interact with the others - involved. - -
- Getting Help - There are several avenues available for seeking - assistance. The quickest way to is to help the community - help you. Search the Q&A sites, mailing list archives, - and bug lists for issues similar to yours. If you can't - find anything, follow the directions for Reporting Bugs in - the section below or use one of the channels for support - below. - Your first port of call should be the official OpenStack - documentation, found on http://docs.openstack.org. - You can get questions answered on the ask.openstack.org site. - - Mailing - Lists (https://wiki.openstack.org/wiki/Mailing_Lists) - are also a great place to get help. The wiki page has more - information about the various lists. As an operator, the - main lists you should be aware of are: - - - - General - list: openstack@lists.launchpad.net. - The scope of this list is the current state of - OpenStack. This is a very high traffic mailing - list, with many, many emails per day. - - - - Operators - list: openstack-operators@lists.openstack.org. - This list is intended for discussion among - existing OpenStack cloud operators, such as - yourself. Currently, this list is relatively low - traffic, on the order of one email a day. - - - - Development - list: openstack-dev@lists.openstack.org. - The scope of this list is the future state of - OpenStack. This is a high traffic mailing list, - with multiple emails per day. - - - We recommend you subscribe to the general list and the - operator list, although you must set up filters to - manage the volume for the general list. You'll also find - links to the mailing list archives on the mailing list - wiki page where you can search through the - discussions. - - Multiple IRC - channels (https://wiki.openstack.org/wiki/IRC) are - available for general questions and developer discussions. - The general discussion channel is #openstack - on irc.freenode.net. -
-
- Reporting Bugs - As an operator, you are in a very good position to - report unexpected behavior with your cloud. As OpenStack - is flexible, you may be the only individual to report a - particular issue. Every issue is important to fix so it is - essential to learn how to easily submit a bug - report. - All OpenStack projects use Launchpad for bug tracking. You'll need to create - an account on Launchpad before you can submit a bug - report. - Once you have a Launchpad account, reporting a bug is as - simple as identifying the project, or projects that are - causing the issue. Sometimes this is more difficult than - expected, but those working on the bug triage are happy to - help relocate issues if their not in the right place - initially. - - - Report a bug in Nova (https://bugs.launchpad.net/nova/+filebug) - - - Report a bug in python-novaclient (https://bugs.launchpad.net/python-novaclient/+filebug) - - - Report a bug in Swift (https://bugs.launchpad.net/swift/+filebug) - - - Report a bug in python-swiftclient - (https://bugs.launchpad.net/python-swiftclient/+filebug) - - - Report a bug in Glance (https://bugs.launchpad.net/glance/+filebug) - - - Report a bug in python-glanceclient - (https://bugs.launchpad.net/python-glanceclient/+filebug) - - - Report a bug in Keystone (https://bugs.launchpad.net/keystone/+filebug) - - - Report a bug in python-keystoneclient - (https://bugs.launchpad.net/python-keystoneclient/+filebug) - - - Report a bug in Quantum (https://bugs.launchpad.net/quantum/+filebug) - - - Report a bug in python-quantumclient - (https://bugs.launchpad.net/python-quantumclient/+filebug) - - - Report a bug in Cinder (https://bugs.launchpad.net/cinder/+filebug) - - - Report a bug in python-cinderclient - (https://bugs.launchpad.net/python-cinderclient/+filebug) - - - Report a bug in Horizon (https://bugs.launchpad.net/horizon/+filebug) - - - Report a bug with the documentation (http://bugs.launchpad.net/openstack-manuals/+filebug) - - - Report a bug with the API - documentation (http://bugs.launchpad.net/openstack-api-site/+filebug) - - - To write a good bug report, the following process is - essential. First, search for the bug to make sure there is - no bug already filed for the same issue. If you find one, - be sure to click on "This bug affects X people. Does this - bug affect you?" If you can't find the issue then enter - the details of your report. It should at least - include: - - - The release, or milestone, or commit ID - corresponding to the software that you are - running. - - - The operating system and version where you've - identified the bug. - - - Steps to reproduce the bug, including what went - wrong. - - - Description of the expected results instead of - what you saw. - - - Read and understood your log files so you only - include relevant excerpts. - - - When you do this, the bug is created with: - - - Status: New - - - - In the bug comments, you can contribute instructions on - how to fix a given bug, and set it to - Triaged. Or you can directly fix - it: assign the bug to yourself, set it to In - progress, branch the code, implement the - fix, and propose your change for merging into trunk. But - let's not get ahead of ourselves, there are bug triaging - tasks as well. -
- Confirming & Prioritizing - This stage is about checking that a bug is real and - assessing its impact. Some of these steps require bug - supervisor rights (usually limited to core teams). If - the bug lacks information to properly reproduce or - assess the importance of the bug, the bug is set - to: - - - Status: Incomplete - - - - Once you have reproduced the issue (or are 100% - confident that this is indeed a valid bug) and have - permissions to do so, set: - - - Status: Confirmed - - - - Core developers also prioritize the bug, based - on its impact: - - - Importance: <Bug impact> - - - The bug impacts are categorized as follows: - - - - Critical if the bug - prevents a key feature from working properly - (regression) for all users (or without a - simple workaround) or result in data - loss - - - - High if the bug prevents - a key feature from working properly for some - users (or with a workaround) - - - - Medium if the bug - prevents a secondary feature from working - properly - - - - Low if the bug is mostly - cosmetic - - - - Wishlist if the bug is - not really a bug, but rather a welcome change - in behavior - - - If the bug contains the solution, or a patch, set - the bug status to Triaged - -
-
- Bug Fixing - At this stage, a developer works on a fix. - During that time, to avoid duplicating the - work, they should set: - - - Status: In progress - - - - Assignee: <yourself> - - - When the fix is ready, they propose and get the change reviewed. -
-
- After the Change is Accepted - After the change is reviewed, accepted, and lands in master, it automatically moves - to: - - - Status: Fix committed - - - - When the fix makes it into a milestone or release - branch, it automatically moves to: - - - Milestone: Milestone the bug was fixed - in - - - Status: Fix released - - - - -
-
-
- Join the OpenStack Community - Since you've made it this far in the book, you should - consider becoming an official individual member of the - community and Join The - OpenStack Foundation - (https://www.openstack.org/join/). The OpenStack - Foundation is an independent body providing shared - resources to help achieve the OpenStack mission by - protecting, empowering, and promoting OpenStack software - and the community around it, including users, developers - and the entire ecosystem. We all share the responsibility - to make this community the best it can possibly be and - signing up to be a member is the first step to - participating. Like the software, individual membership - within the OpenStack Foundation is free and accessible to - anyone. -
-
- Features and the Development Roadmap - OpenStack follows a six month release cycle, typically - releasing in April and October each year. At the start of - each cycle, the community gathers in a single location for - a Design Summit. At the summit, the features for the - coming releases are discussed, prioritized and planned. - Here's an example release cycle with dates showing - milestone releases, code freeze, and string freeze dates - along with an example of when the Summit occurs. - Milestones are interim releases within the cycle that are - available as packages for download and testing. Code - freeze is putting a stop to adding new features to the - release. String freeze is putting a stop to changing any - strings within the source code. - - - - - - - - Feature requests typically start their life in Etherpad, - a collaborative editing tool, which is used to take - coordinating notes at a design summit session specific to - the feature. This then leads to the creation of a - blueprint on the Launchpad site for the particular - project, which is used to describe the feature more - formally. Blueprints are then approved by project team - members, and development can begin. - Therefore, the fastest way to get your feature request - up for consideration is to create an Etherpad with your - ideas and propose a session to the design summit. If the - design summit has already passed, you may also create a - blueprint directly. Read this blog post about how to work with - blueprints (http://vmartinezdelacruz.com/how-to-work-with-blueprints-without-losing-your-mind/) - for a developer intern's perspective, Victoria - Martínez. - The roadmap for the next release as it is developed can - be seen at Releases - (http://status.openstack.org/release/). - To determine the potential features going in to future - releases, or to look at features implemented previously, - take a look at the existing blueprints such as OpenStack Compute (nova) Blueprints - (https://blueprints.launchpad.net/nova), OpenStack Identity (keystone) Blueprints - (https://blueprints.launchpad.net/keystone) and release - notes. - - - Release notes are maintained on the OpenStack - wiki: - - - - Series - Status - Releases - Date - - - - - Grizzly - - Under development, Release - schedule - - Due - Apr 4, 2013 - - - Folsom - Current stable release, - security-supported - - 2012.2 - - Sep 27, 2012 - - - - - - 2012.2.1 - - Nov 29, 2012 - - - - - 2012.2.2 - - Dec 13, 2012 - - - - - 2012.2.3 - - Jan 31, 2012 - - - Essex - Community-supported, - security-supported - - 2012.1 - - Apr 5, 2012 - - - - - 2012.1.1 - - Jun 22, 2012 - - - - - 2012.1.2 - - Aug 10, 2012 - - - - - 2012.1.3 - - Oct 12, 2012 - - - Diablo - Community-supported - - 2011.3 - - Sep 22, 2011 - - - - - 2011.3.1 - - Jan 19, 2012 - - - Cactus - Deprecated - - 2011.2 - - Apr 15, 2011 - - - Bexar - Deprecated - - 2011.1 - - Feb 3, 2011 - - - Austin - Deprecated - - 2010.1 - - Oct 21, 2010 - - - -
-
- How to Contribute to the Documentation - OpenStack documentation efforts encompass operator and - administrator docs, API docs, and user docs. - The genesis of this book was an in-person event, but now - that the book is in your hands we want you to contribute - to it. OpenStack documentation follows the coding - principles of iterative work, with bug logging, - investigating, and fixing. - Just like the code, the docs.openstack.org site is updated constantly - using the Gerrit review system, with source stored in - GitHub in the openstack-manuals (http://github.com/openstack/openstack-manuals/) - repository and the api-site (http://github.com/openstack/api-site/) - repository, in DocBook format. - To review the documentation before it's published, go to - the OpenStack Gerrit server at review.openstack.org and search for project:openstack/openstack-manuals or project:openstack/api-site. - See the How To - Contribute (https://wiki.openstack.org/wiki/How_To_Contribute) - page on the wiki for more information on the steps you - need to take to submit your first documentation - review or change. -
-
- Security Information - As a community, we take security very seriously and - follow a specific process for reporting potential issues. - We vigilantly pursue fixes and regularly eliminate - exposures. You can report security issues you discover - through this specific process. The OpenStack Vulnerability - Management Team is a very small group of experts in - vulnerability management drawn from the OpenStack - community. Their job is facilitating the reporting of - vulnerabilities, coordinating security fixes and handling - progressive disclosure of the vulnerability information. - Specifically, the Team is responsible for the following - functions: - - - Vulnerability Management: All vulnerabilities - discovered by community members (or users) can be - reported to the Team. - - - Vulnerability Tracking: The Team will - curate a set of vulnerability related issues in - the issue tracker. Some of these issues are - private to the Team and the affected product - leads, but once remediation is in place, all - vulnerabilities are public. - - - Responsible Disclosure: As part of our - commitment to work with the security community, - the team ensures that proper credit is given - to security researchers who responsibly report - issues in OpenStack. - - - We provide two ways to report issues to the OpenStack - Vulnerability Management Team depending on how sensitive - the issue is: - - - Open a bug in Launchpad and mark it as a - 'security bug'. This makes the bug private and - accessible to only the Vulnerability Management - Team. - - - If the issue is extremely sensitive, send - an encrypted email to one of the Team's - members. Find their GPG keys at OpenStack Security - (http://www.openstack.org/projects/openstack-security/). - - - You can find the full list of security-oriented teams - you can join at Security - Teams (http://wiki.openstack.org/SecurityTeams). - The Vulnerability Management process is fully documented - at Vulnerability - Management (https://wiki.openstack.org/wiki/VulnerabilityManagement). -
-
- Finding Additional Information - In addition to this book, there are many other sources - of information about OpenStack. The OpenStack - website (http://www.openstack.org) is a good - starting point, with OpenStack - Docs (http://docs.openstack.org) and OpenStack API - Docs (http://api.openstack.org) providing - technical documentation about OpenStack. The OpenStack - wiki contains a lot of general information that - cuts across the OpenStack projects including a list of - recommended tools - (https://wiki.openstack.org/wiki/OperationsTools ). - Finally, there are a number of blogs aggregated at Planet - OpenStack (http://planet.openstack.org). -
- -
diff --git a/doc/src/docbkx/openstack-ops/src/ch_ops_user_facing.xml b/doc/src/docbkx/openstack-ops/src/ch_ops_user_facing.xml deleted file mode 100644 index 7f754e33903..00000000000 --- a/doc/src/docbkx/openstack-ops/src/ch_ops_user_facing.xml +++ /dev/null @@ -1,1041 +0,0 @@ - - - - - - - - -]> - - - User-facing Operations - This guide is for OpenStack operators and does not seek to - be an exhaustive reference for users, but as an operator it is - important that you have a basic understanding of how to use - the cloud facilities. This chapter looks at OpenStack from a - basic user perspective, which helps you understand your users' - needs and determine when you get a trouble ticket whether it - is a user issue or a service issue. The main concepts covered - are images, flavors, security groups, blocks storage and - instances. -
- Images - - OpenStack images can often be thought of as "virtual - machine templates". Images can also be standard - installation mediums like ISO images. Essentially, they - contain bootable file systems which are used to launch - instances. -
- Adding Images - Several pre-made images exist and can easily be - imported into the Image Service. A common image to add - is the CirrOS image which is very small and used for - testing purposes. To add this image, simply do: - # wget https://launchpad.net/cirros/trunk/0.3.0/+download/cirros-0.3.0-x86_64-disk.img # glance image-create --name='cirros image' --is-public=true --container-format=bare --disk-format=qcow2 < cirros-0.3.0-x86_64-disk.img - The glance image-create command - provides a large set of options to give your image. - For example, the min-disk option is - useful for images that require root disks of a certain - size (for example, large Windows images). To view - these options, do: - $ glance help image-create - The location option is important to - note. It does not copy the entire image into Glance, - but reference an original location to where the image - can be found. Upon launching an instance of that - image, Glance accesses the image from the location - specified. - The copy-from option copies the image - from the location specified into the - /var/lib/glance/images directory. The - same thing is done when using the STDIN redirection - such as shown in the example. - Run the following command to view the properties of - existing images: - $ glance details -
-
- Deleting Images - To delete an image, just execute: - $ glance image-delete <image uuid> - - Deleting an image does not affect instances or - snapshots that were based off the image. - -
-
- Other CLI Options - A full set of options can be found using: - $ glance help - or the OpenStack Image Service CLI Guide. - (http://docs.openstack.org/cli/quick-start/content/glance-cli-reference.html) -
-
- The Image Service and the Database - The only thing that Glance does not store in a - database is the image itself. The Glance database has - two main tables: - - - images - - - image_properties - - - Working directly with the database and SQL queries - can provide you with custom lists and reports of - Glance images. Technically, you can update properties - about images through the database, although this is - not generally recommended. -
-
- Example Image Service Database Queries - One interesting example is modifying the table of - images and the owner of that image. This can be easily - done if you simply display the unique ID of the owner, - this example goes one step further and displays the - readable name of the owner: - $ mysql> select glance.images.id, glance.images.name, keystone.tenant.name, is_public from glance.images inner join keystone.tenant on glance.images.owner=keystone.tenant.id; - Another example is displaying all properties for a - certain image: - $ mysql> select name, value from image_properties where id = <image_id> -
-
- -
- - Flavors - - Virtual hardware templates are called "flavors" in - OpenStack, defining sizes for RAM, disk, number of cores - and so on. The default install provides a range of five - flavors. These are configurable by admin users (this too - is configurable and may be delegated by redefining the - access controls for - compute_extension:flavormanage in - /etc/nova/policy.json on the - nova-api server). To get a list of - available flavors on your system run: - $ nova flavor-list - - +----+-----------+-----------+------+-----------+\+-------+-\+-------------+ -| ID | Name | Memory_MB | Disk | Ephemeral |/| VCPUs | /| extra_specs | -+----+-----------+-----------+------+-----------+\+-------+-\+-------------+ -| 1 | m1.tiny | 512 | 0 | 0 |/| 1 | /| {} | -| 2 | m1.small | 2048 | 10 | 20 |\| 1 | \| {} | -| 3 | m1.medium | 4096 | 10 | 40 |/| 2 | /| {} | -| 4 | m1.large | 8192 | 10 | 80 |\| 4 | \| {} | -| 5 | m1.xlarge | 16384 | 10 | 160 |/| 8 | /| {} | -+----+-----------+-----------+------+-----------+\+-------+-\+-------------+ - The nova flavor-create command allows authorized users to create new - flavors. Additional flavor manipulation commands can be shown with the command: - $ nova help | grep flavor. - - - Flavors define a number of elements: - - - - - - - - Column - - - - - Description - - - - - - ID - - - A unique numeric id. - - - - - Name - - - a descriptive name. xx.size_name is conventional not required, though - some third party tools may rely on it. - - - - - Memory_MB - - - Memory_MB: virtual machine memory in megabytes. - - - - - Disk - - - Virtual root disk size in gigabytes. This is an ephemeral disk the - base image is copied into. When booting from a persistent volume it is - not used. The "0" size is a special case which uses the native base - image size as the size of the ephemeral root volume. - - - - - Ephemeral - - - Specifies the size of a secondary ephemeral data disk. This is an - empty, unformatted disk and exists only for the life of the - instance. - - - - - Swap - - - Optional swap space allocation for the instance. - - - - - VCPUs - - - Number of virtual CPUs presented to the instance. - - - - - RXTX_Factor - - - Optional property allows created servers to have a different bandwidth - cap than that defined in the network they are attached to. This factor - is multiplied by the rxtx_base property of the network. Default value is - 1.0 (that is, the same as attached network). - - - - - Is_Public - - - Boolean value, whether flavor is available to all users or private to - the tenant it was created in. Defaults to True. - - - - - extra_specs - - - Additional optional restrictions on which compute nodes the flavor can - run on. This is implemented as key/value pairs that must match against - the corresponding key/value pairs on compute nodes. Can be used to - implement things like special resources (such as flavors that can only - run on compute nodes with GPU hardware). - - - - - - How do I modify an existing flavor? - Unfortunately, OpenStack does not provide an interface for modifying flavors, only - for creating and deleting them. The OpenStack Dashboard simulates the ability to - modify a flavor by deleting an existing flavor and creating a new one with the same - name. - - -
- -
- - Security groups - One of the most common new user issues with OpenStack is - failing to set appropriate security group when launching - an instance and are then unable to contact the instance on - the network. - Security groups are sets of IP filter rules that are - applied to an instance's networking. They are project - specific and project members can edit the default rules - for their group and add new rules sets. All projects have - a "default" security group which is applied to instances - which have no other security group defined, unless changed - this security group denies all incoming traffic. - The nova.conf option - allow_same_net_traffic (which defaults to - true) globally controls whether the rules applies to hosts - which share a network. When set to true, hosts on the same - subnet are not filtered and are allowed to pass all types - of traffic between them. On a flat network, this allows - all instances from all projects unfiltered communication. - With VLAN networking, this allows access between instances - within the same project. If - allow_same_net_traffic is set to false, - security groups are enforced for all connections, in this - case it is possible for projects to simulate the - allow_same_net_traffic by configuring - their default security group to allow all traffic from - their subnet. - Security groups for the current project can be found on - the Horizon dashboard under "Access & Security" to see - details of an existing group select the "edit" action for - that security group. Obviously modifying existing groups - can be done from this "edit" interface. There is a "Create - Security Group" button on the main Access & Security - page for creating new groups. We discuss the terms used in - these fields when we explain the command line - equivalents. - From the command line you can get a list of security - groups for the project you're acting in using the nova - command: - - $ nova secgroup-list - - +---------+-------------+ -| Name | Description | -+---------+-------------+ -| default | default | -| open | all ports | -+---------+-------------+ - To view the details of the "open" security group: - - $ nova secgroup-list-rules open - - +-------------+-----------+---------+-----------+--------------+ - | IP Protocol | From Port | To Port | IP Range | Source Group | - +-------------+-----------+---------+-----------+--------------+ - | icmp | -1 | 255 | 0.0.0.0/0 | | - | tcp | 1 | 65535 | 0.0.0.0/0 | | - | udp | 1 | 65535 | 0.0.0.0/0 | | - +-------------+-----------+---------+-----------+--------------+ - These rules are all "allow" type rules as the default is - deny. The first column is the IP protocol (one of icmp, - tcp, or udp) the second and third columns specify the - affected port range. The third column specifies the IP - range in CIDR format. This example shows the full port - range for all protocols allowed from all IPs. - As noted in the previous chapter the number of rules per - security group is controlled by the - quota_security_group_rules and the number of allowed - security groups per project is controlled by the - quota_security_groups quota.  - When adding a new security group you should pick a - descriptive but brief name. This name shows up in brief - descriptions of the instances that use it where the longer - description field often does not. Seeing that an instance - is using security group "http" is much easier to - understand than "bobs_group" or "secgrp1". - As an example, let's create a security group that allows - web traffic anywhere on the internet. We'll call this - "global_http" which is clear and reasonably concise, - encapsulating what is allowed and from where. From the - command line: - +-------------+-------------------------------------+ -| Name | Description | -+-------------+-------------------------------------+ -| global_http | allow web traffic from the internet | -+-------------+-------------------------------------+ - This creates the empty security group to make it do what - we want we need to add some rules. - $ nova secgroup-add-rule <secgroup> <ip-proto> <from-port> <to-port> - <cidr> -$ nova secgroup-add-rule global_http tcp 80 80 0.0.0.0/0 -+-------------+-----------+---------+-----------+--------------+ -| IP Protocol | From Port | To Port | IP Range | Source Group | -+-------------+-----------+---------+-----------+--------------+ -| tcp | 80 | 80 | 0.0.0.0/0 | | -+-------------+-----------+---------+-----------+--------------+ - Note that the arguments are positional and the - "from-port" and "to-port" arguments specify the local port - range connections are allowed to not source and - destination ports of the connection. More complex rule - sets can be built up through multiple invocations of nova - secgroup-add-rule. For example if you want to pass both - http and https traffic: - - $ nova secgroup-add-rule global_http tcp 443 443 0.0.0.0/0 - - +-------------+-----------+---------+-----------+--------------+ -| IP Protocol | From Port | To Port | IP Range | Source Group | -+-------------+-----------+---------+-----------+--------------+ -| tcp | 443 | 443 | 0.0.0.0/0 | | -+-------------+-----------+---------+-----------+--------------+ - Despite only outputting the newly added rule this - operation is additive: - $ nova secgroup-list-rules global_http - +-------------+-----------+---------+-----------+--------------+ -| IP Protocol | From Port | To Port | IP Range | Source Group | -+-------------+-----------+---------+-----------+--------------+ -| tcp | 80 | 80 | 0.0.0.0/0 | | -| tcp | 443 | 443 | 0.0.0.0/0 | | -+-------------+-----------+---------+-----------+--------------+ - The inverse operation is called secgroup-delete-rule, - using the same format. Whole security groups can be - removed with secgroup-delete. - To create security group rules for a cluster of - instances: - SourceGroups are a special dynamic way of defining the - CIDR of allowed sources. The user specifies a SourceGroup - (Security Group name), all the users' other Instances - using the specified SourceGroup are selected dynamically. - This alleviates the need for a individual rules to allow - each new member of the cluster.usage: - usage: nova secgroup-add-group-rule <secgroup> - <source-group> <ip-proto> <from-port> - <to-port> - $ nova secgroup-add-group-rule cluster global-http tcp 22 22 - The "cluster" rule allows ssh access from any other - instance that uses the "global-http" group. -
- -
- - Block Storage - OpenStack volumes are persistent block storage devices - which may be attached and detached from instances, but can - only be attached to one instance at a time, similar to an - external hard drive they do not proved shared storage in - the way a network file system or object store does. It is - left to the operating system in the instance to put a file - system on the block device and mount it, or not. - Similar to other removable disk technology it is - important the operating system is not trying to make use - of the disk before removing it. On Linux instances this - typically involves unmounting any file systems mounted - from the volume. The OpenStack volume service cannot tell - if it is safe to remove volumes from an instance so it - does what it is told. If a user tells the volume service - to detach a volume from an instance while it is being - written to you can expect some level of file system - corruption as well as faults from whatever process within - the instance was using the device. - There is nothing OpenStack specific in being aware of - the steps needed from with in the instance operating - system to access block devices, potentially formatting - them for first use and being cautious when removing - devices. What is specific is how to create new volumes and - attach and detach them from instances. These operations - can all be done from the "Volumes" page of the Dashboard - or using the cinder command line client. - To add new volumes you only need a name and a volume - size in gigabytes, ether put these into the "create - volume" web form or using the command line: - $ cinder create --display-name test-volume 10 - This creates a 10 GB volume named "test-volume." To list - existing volumes and the instances they are connected to - if any: - $ cinder list - +------------+---------+--------------------+------+-------------+-------------+ -| ID | Status | Display Name | Size | Volume Type | Attached to | -+------------+---------+--------------------+------+-------------+-------------+ -| 0821...19f | active | test-volume | 10 | None | | -+------------+---------+--------------------+------+-------------+-------------+ - The Block Storage service also allows for creating - snapshots of volumes. Remember this is a block level - snapshot which is crash consistent so it is best if the - volume is not connected to an instance when the snapshot - is taken and second best if the volume is not in use on - the instance it is attached to. If the volume is under - heavy use, the snapshot may have an inconsistent file - system. In fact, by default, the volume service does not - take a snapshot of a volume that is attached to an image, - though it can be forced. To take a volume snapshot either - select "Create Snapshot" from the actions column next to - the volume name in the dashboard volume page, or from the - command line: - usage: cinder snapshot-create [--force <True|False>] -[--display-name <display-name>] -[--display-description <display-description>] -<volume-id> -Add a new snapshot. -Positional arguments: <volume-id> ID of the volume to snapshot -Optional arguments: --force <True|False> Optional flag to indicate whether to snapshot a volume even if its attached to an instance. (Default=False) --display-name <display-name> Optional snapshot name. (Default=None) ---display-description <display-description> -Optional snapshot description. (Default=None) -
- Block Storage Creation Failures - If a user tries to create a volume and it - immediately goes into an error state, the best way to - troubleshoot is to grep the Cinder log files for the - volume's UUID. First try the log files on the cloud - controller and then try the storage node where they - volume was attempted to be created: - # grep 903b85d0-bacc-4855-a261-10843fc2d65b /var/log/cinder/*.log -
-
-
- - Instances - Instances are the running virtual machines within an - OpenStack cloud. This section deals with how to work with - them and their underlying images, their network properties - and how they are represented in the database. -
- Starting Instances - To launch an instance you need to select an image, a - flavor, and a name. The name needn't be unique but - your life is simpler if it is because many tools will - use the name in place of UUID so long as the name is - unique. This can be done from the dashboard either - from the "Launch Instance" button on the "Instances" - page or by selecting the "Launch" action next to an - image or snapshot on the "Images & Snapshots" - page. - On the command line: - $ nova boot --flavor <flavor> --image <image> <name> - There are a number of optional items that can be - specified. You should read the rest of this instances - section before trying to start one, but this is the - base command that later details are layered - upon. - To delete instances from the dashboard select the - "Terminate instance" action next to the instance on - the "Instances" page, from the command line: - $ nova delete <instance-uuid> - It is important to note that powering off an - instance does not terminate it in the OpenStack - sense. -
-
- Instance Boot Failures - If an instance fails to start and immediately moves - to "Error" state there are a few different ways to - track down what has gone wrong. Some of these can be - done with normal user access while others require - access to your log server or compute nodes. - The simplest reasons for nodes to fail to launch are - quota violations or the scheduler being unable to find - a suitable compute node on which to run the instance. - In these cases the error is apparent doing a - nova show on the faulted - instance. - - $ nova show test-instance - - +------------------------+--------------------------------------------------------------\ -| Property | Value / -+------------------------+--------------------------------------------------------------\ -| OS-DCF:diskConfig | MANUAL / -| OS-EXT-STS:power_state | 0 \ -| OS-EXT-STS:task_state | None / -| OS-EXT-STS:vm_state | error \ -| accessIPv4 | / -| accessIPv6 | \ -| config_drive | / -| created | 2013-03-01T19:28:24Z \ -| fault | {u'message': u'NoValidHost', u'code': 500, u'created': u'2013/ -| flavor | xxl.super (11) \ -| hostId | / -| id | 940f3b2f-bd74-45ad-bee7-eb0a7318aa84 \ -| image | quantal-test (65b4f432-7375-42b6-a9b8-7f654a1e676e) / -| key_name | None \ -| metadata | {} / -| name | test-instance \ -| security_groups | [{u'name': u'default'}] / -| status | ERROR \ -| tenant_id | 98333a1a28e746fa8c629c83a818ad57 / -| updated | 2013-03-01T19:28:26Z \ -| user_id | a1ef823458d24a68955fec6f3d390019 / -+------------------------+--------------------------------------------------------------\ - In this case looking at the "fault" message shows - NoValidHost indicating the scheduler was unable to - match the instance requirements. - If nova show does not sufficiently - explain the failure searching for the instance UUID in - the nova-compute.log on the compute node - it was scheduled on or the - nova-scheduler.log on your scheduler - hosts is a good place to start looking for lower level - problems. - Using nova show as an admin user will - show the compute node the instance was scheduled on as - hostId, if the instance failed during - scheduling this field is blank. -
-
- Instance-specific Data - There are a variety of ways to inject custom data - including authorized_keys key injection, user-data, - metadata service, and file injection. - To clarify user-data versus metadata, understand - that "user-data" is a chunk of data, set when an - instance is not running. This user-data is accessible - from within the instance when it is running. People - use this user-data to store configuration, a script, - or anything the tenant wants. - For Compute, instance metadata is a collection of - key/value pairs associated with an instance. Compute - reads and writes to these key/value pairs any time - during the instance lifetime, from inside and outside - the instance, when the end-user uses the Compute API - to do so. However, you cannot query the instance - associated key/value pairs via the metadata service - that is compatible with the Amazon EC2 metadata - service. - Users can generate and register ssh keys using the - nova command - $ nova keypair-add mykey > mykey.pem - This creates a key named mykey which you can - associate with instances. The file mykey.pem is the - private key which should be saved to a secure location - as it allows root access to instances the mykey key is - associated with. - You can register an existing public key with - OpenStack using this command - $ nova keypair-add --pub-key mykey.pub mykey - You must have the matching private key to access - instances associated with this key. - To associate a key with an instance on boot add - --key_name mykey to your command line for - example: - $ nova boot --image ubuntu-cloudimage --flavor 1 --key_name mykey - When booting a server, you can also add metadata, so - that you can more easily identify it amongst other - running instances. Use the --meta option with a - key=value pair, where you can make up the string for - both the key and the value. For example, you could add - a description and also the creator of the - server. - $ nova boot --image=test-image --flavor=1 smallimage --meta description='Small test image' - When viewing the server information, you can see the - metadata included on the metadata line: - - $ nova show smallimage - - +------------------------+-----------------------------------------+ -| Property | Value | -+------------------------+-----------------------------------------+ -| OS-DCF:diskConfig | MANUAL | -| OS-EXT-STS:power_state | 1 | -| OS-EXT-STS:task_state | None | -| OS-EXT-STS:vm_state | active | -| accessIPv4 | | -| accessIPv6 | | -| config_drive | | -| created | 2012-05-16T20:48:23Z | -| flavor | m1.small | -| hostId | de0...487 | -| id | 8ec...f915 | -| image | natty-image | -| key_name | | -| metadata | {u'description': u'Small test image'} | -| name | smallimage2 | -| private network | 172.16.101.11 | -| progress | 0 | -| public network | 10.4.113.11 | -| status | ACTIVE | -| tenant_id | e83...482 | -| updated | 2012-05-16T20:48:35Z | -| user_id | de3...0a9 | -+------------------------+-----------------------------------------+ - User Data is a special key in the metadata service - which holds a file that cloud aware applications - within the guest instance can access. For example - cloudinit - (https://help.ubuntu.com/community/CloudInit) is an - open source package from Ubuntu that handles early - initialization of a cloud instance that makes use of - this user data. - This user-data can be put in a file on your local - system and then passed in at instance creation with - the flag --user-data <user-data-file> for - example: - $ nova boot --image ubuntu-cloudimage --flavor 1 --user-data mydata.file - Arbitrary local files can also be placed into the - instance file system at creation time using the --file - <dst-path=src-path> option. You may store up to - 5 files. For example if you have a special - authorized_keys file named special_authorized_keysfile - that you want to put on the instance rather than using - the regular ssh key injection for some reason you can - use the following command: - $ nova boot --image ubuntu-cloudimage --flavor 1 --file /root/.ssh/authorized_keys=special_authorized_keysfile - -
-
-
- Associating Security Groups - Security groups as discussed earlier are typically - required to allow network traffic to an instance, unless - the default security group for a project has been modified - to be more permissive. - Adding security groups is typically done on instance - boot. When launching from the dashboard this is on the - "Access & Security" tab of the "Launch Instance" - dialog. When launching from the command line append - --security-groups with a comma separated list of security - groups. - It is also possible to add and remove security groups - when an instance is running. Currently this is only - available through the command line tools. - $ nova add-secgroup <server> <securitygroup> - $ nova remove-secgroup <server> <securitygroup> -
-
- Floating IPs - Projects have a quota controlled number of Floating IPs, - however these need to be allocated by a user before they - are available for use. To allocate a Floating IP to a - project there is an "Allocate IP to Project" button on the - "Access & Security" page of the dashboard or on the - command line by using: - $ nova floating-ip-create - - Once allocated, Floating IP can be assigned to running - instances from the Dashboard either by selecting the - "Associate Floating IP" from the actions drop down next to - the IP on the "Access & Security" page or the same - action next to the instance you wish to associate it with - on the "Instances" page. The inverse action, "Dissociate - Floating IP", is only available from the "Access & - Security" page and not from the Instances page. - From the command line, enter the following command to - complete these tasks: - $ nova add-floating-ip <server> <address> - $ nova remove-floating-ip <server> <address> - -
-
- Attaching Block Storage - You can attach block storage to instances from the - dashboard on the Volumes page. Click - the Edit Attachments action next to - the volume you wish to attach. - To perform this action from command line, run the - following command: - $ nova volume-attach <server> <volume> - You can also specify block device mapping at instance - boot time through the nova command-line client, as - follows: - --block-device-mapping <dev-name=mapping> - The block device mapping format is - <dev-name=<id>:<type>:<size(GB)>:<delete-on-terminate>, - where: - - - dev-name - - A device name where the volume is attached - in the system at - /dev/dev_name - . - - id - - The ID of the volume to boot from, as shown - in the output of nova volume-list. - - - - type - - Either snap, which means that the - volume was created from a snapshot, or - anything other than snap (a blank string is valid). - In the example above, the volume was not - created from a snapshot, so we leave this - field blank in our example below. - - - - - size (GB) - - The size of the volume, in GB. It is safe to - leave this blank and have the Compute service - infer the size. - - - - delete-on-terminate - - A boolean to indicate whether the volume - should be deleted when the instance is - terminated. True can be specified as True or 1. False can be specified as - False or 0. - - - - - - - If you have previously prepared the block storage with a - bootable file system image it is even possible to boot - from persistent block storage. The following example will - attempt boot from volume with ID=13, - it does not delete on terminate. Replace the --key-name with a valid keypair - name: - $ nova boot --flavor 2 --key-name mykey --block-device-mapping vda=13:::0 boot-from-vol-test - Because of bug 1163566 - (https://bugs.launchpad.net/nova/+bug/1163566) you must - specify an image when booting from a volume in Horizon, - even though this image is not used. - To boot normally from an image and attach block storage, - map to a device other than vda. -
-
- - Taking Snapshots - OpenStack's snapshot mechanism allows you to create new - images from running instances. This is a very convenient - for upgrading base images or taking a published image and - customizing for local use. To snapshot a running instance - to an image using the CLI: - $ nova image-create <instance name or uuid> <name of new image> - The Dashboard interface for snapshots can be confusing - because the Images & Snapshots page splits content up - into: - - - Images - - - Instance snapshots - - - Volume snapshots - - - However, an instance snapshot is an - image. The only difference between an image that you - upload directly to glance and an image you create by - snapshot is that an image created by snapshot has - additional properties in the glance database. These - properties are found in the image_properties table, and - include: - - - - name - value - - - - - image_type - snapshot - - - instance_uuid - <uuid of instance that was - snapshotted> - - - base_image_ref - <uuid of original image of - instance that was - snapshotted> - - - image_location - snapshot - - - -
- Ensuring snapshots are consistent - Content from Sébastien Han's OpenStack: Perform Consistent Snapshots blog - entry - (http://www.sebastien-han.fr/blog/2012/12/10/openstack-perform-consistent-snapshots/) - A snapshot captures the state of the file system, - but not the state of the memory. Therefore, to ensure - your snapshot contains the data that you want, before - your snapshot you need to ensure that: - - - Running programs have written their contents - to disk - - - The file system does not have any "dirty" - buffers: where programs have issued the - command to write to disk, but the operating - system has not yet done the write - - - To ensure that important services have written their - contents to disk (such as, databases), we recommend - you read the documentation for those applications to - determine what commands to issue to have them sync - their contents to disk. If you are unsure how to do - this, the safest approach is to simply stop these - running services normally. - To deal with the "dirty" buffer issue, we recommend - using the sync command before snapshotting: - # sync - Running sync writes dirty buffer - (buffered block that have been modified but not - written yet to the disk block) to disk. - Just running sync is not enough to - ensure the file system is consistent. We recommend you - use the fsfreeze tool, which halts new - access to the file system and create a stable image on - disk that is suitable for snapshotting. fsfreeze - supports several file systems, including ext3, ext4, - and XFS. If your virtual machine instance is running - on Ubuntu, install the util-linux package to get - fsfreeze: - # apt-get install util-linux - If your operating system doesn't have a version of - fsfreeze available, you can use xfs_freeze instead, - which is available on Ubuntu in the xfsprogs package. - Despite the "xfs" in the name, xfs_freeze also works - on ext3 and ext4 if you are using a Linux kernel - version 2.6.29 or greater, since it works at the - virtual file system (VFS) level starting at 2.6.29. - xfs_freeze supports the same command-line arguments as - fsfreeze. - Consider the example where you want to take a - snapshot of a persistent block storage volume, - detected by the guest operating system as /dev/vdb and - mounted on /mnt. The fsfreeze command accepts 2 - arguments: - - - -f: freeze the system - - - -u: thaw (un-freeze) the system - - - To freeze the volume in preparation for - snapshotting, you would do, as root, inside of the - instance: - # fsfreeze -f /mnt - You must mount the file - system before you run the - fsfreeze command. - When the "fsfreeze -f" command is issued, all - ongoing transactions in the file system are allowed to - complete, new write system calls are halted, and other - calls which modify the file system are halted. Most - importantly, all dirty data, metadata, and log - information are written to disk. - Once the volume has been frozen, do not attempt to - read from or write to the volume, as these operations - hang. The operating system stops every I/O operation - and any I/O attempts is delayed until the file system - has been unfrozen. - Once you have issued the fsfreeze command, it is - safe to perform the snapshot. For example, if your - instance was named mon-instance, and you wanted to - snapshot it to an image, named mon-snapshot, you could - now run the following: - $ nova image-create mon-instance mon-snapshot - When the snapshot is done, you can thaw the file - system with the following command, as root, inside of - the instance: - # fsfreeze -u /mnt - If you want to backup the root files ystem, you - can't simply do the command above because it will - freeze the prompt. Instead, run the following - one-liner, as root, inside of the instance: - # fsfreeze -f / && sleep 30 && fsfreeze -u / -
-
-
- - Instances in the Database - While instance information is stored in a number of - database tables, the table operators are most likely to - need to look at in relation to user instances is the - "instances" table. - The instances table carries all most of the information - related to both running and deleted instances. It has a - bewildering array of fields, for an exhaustive list look - at the database. These are the most useful fields for - operators looking to form queries. - The "deleted" field is set to "1" if the instance has - been deleted and NULL if it has not been deleted this - important for excluding deleted instances from your - queries. - The "uuid" field is the UUID of the instance and is used - through out other tables in the database as a foreign key. - This id is also reported in logs, the dashboard and - command line tools to uniquely identify an - instance. - A collection of foreign keys are available to find - relations to the instance. The most useful of these are - "user_id" and "project_id" are the UUIDs of the user who - launched the instance and the project it was launched - in. - The "host" field tells which compute node is hosting the - instance. - The "hostname" field holds the name of the instance when - it is launched. The "display-name" is initially the same - as hostname but can be reset using the nova rename - command. - A number of time related fields are useful for tracking - when state changes happened on an instance: - - - created_at - - - updated_at - - - deleted_at - - - scheduled_at - - - launched_at - - - terminated_at - - -
-
diff --git a/doc/src/docbkx/openstack-ops/src/figures/1-IMG_4895.JPG b/doc/src/docbkx/openstack-ops/src/figures/1-IMG_4895.JPG deleted file mode 100644 index 556e8682eae893f9bbe570014fa9fac077badeff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153523 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%0Dvx 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

Wk#r;*yI#dTKgjjcd0h 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 diff --git a/doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.png b/doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.png deleted file mode 100644 index 9ac9ea382d6f3e939ad02eeea8a658b482b1d3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmeAS@N?(olHy`uVBq!ia0vp^!ayt}zyc(lr+!=rq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)zBv@A9m=2`DdKq4%?0wI`z-Zy=;uvCadg-OT>lhtH4t(6qy71x(R~L0I zRYwz-Mfc4wba|NEb66ChQEFnt+{zxHQDU`l%8k$yYH$9FHSc^>x2ANG=Ce67@B5_n zF)GL(E7RT-(ZM0#^4e)V`%E4gz6a8qb612Z%C-NEds>q?jkT4@MQKCS%Rjeoykz-l z!@^`R-~Rf&Lpt1>A_W>RzS#Osa&zv9ry^H!{_Qy?TxRFIbkTw&L7C&~&nyD;v^8di z=zfSkk;dH1b|vdVp1pXi_^VP@*5(Z{|7tfZxtz6;qs8e}?z@XGUqo&H{lEA`!UFS- z11XER{_ZAHD zhzb9G;d|n&dkfjwHpJQA*AQ!dd{Le4LYC$Ug9Ni`{;GpI+(MkKzdH4wicgfg+~;}- z7@(>pt`Q|Ei6yC4$wjF^iowXh&`{UFMAy(b#L(2r*wV_#K-a+3%D^B;$!P(KhTQy= z%(P0}8f5E#$pAH!fNUr(OSei&EKb!eEy`p_%gjl&(%09|$j?pHPf0FH%uOxQcgasK z%}vcKDb{yQ&dDq&P7Tj5$}TQQOitBLEXdR?PAw`+Eh^S8E=tzVP0Y;GFHcQMEGW>= t%uUyK&PYwpj?Yaj%8oZOt}rr)H!#uzTA2I&%POG#44$rjF6*2UngA`Z`BeY_ diff --git a/doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.svg b/doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.svg deleted file mode 100644 index 3051a2f9379..00000000000 --- a/doc/src/docbkx/openstack-ops/src/figures/Check_mark_23x20_02.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - image/svg+xml - - - - - - - - diff --git a/doc/src/docbkx/openstack-ops/src/figures/horizon-add-project.png b/doc/src/docbkx/openstack-ops/src/figures/horizon-add-project.png deleted file mode 100644 index 01d77c3f03c6cba7aecead63b205e021af1fbd24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21006 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 MBXel6fzzA+0CBd=u>b%7 diff --git a/doc/src/docbkx/openstack-ops/src/figures/horizon-user-project.png b/doc/src/docbkx/openstack-ops/src/figures/horizon-user-project.png deleted file mode 100644 index 83406a33e306bfc4d408c77a19162148ca7269e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23526 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 G3;rL^&52+D diff --git a/doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.png b/doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.png deleted file mode 100644 index e4c1a81521d4e56d82e6fdc249740127d9e091f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26203 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 diff --git a/doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.svg b/doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.svg deleted file mode 100644 index f5dda8e2500..00000000000 --- a/doc/src/docbkx/openstack-ops/src/figures/network_packet_ping.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -2013-03-02 18:48ZCanvas 1Layer 1Compute Node nbr100Internetinstanceeth0eth0vnet1L2 Switchgateway12345 diff --git a/doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.png b/doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.png deleted file mode 100644 index 73b0d5de99349c3be74cd95d799d767ada767372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65169 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 G@c#faCBlLL diff --git a/doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.svg b/doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.svg deleted file mode 100644 index 7fea7f198c3..00000000000 --- a/doc/src/docbkx/openstack-ops/src/figures/os-ref-arch.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -2013-02-26 23:27ZCanvas 1Layer 1Compute Node 2nova-computenova-api-metadatanova-vncconsolenova-networketh1eth0Compute Node 1HypervisorAPI for metadatanoVNCnova-networkInternetCloud Controller NodeDatabaseMessage QueueAPI servicesSchedulerIdentityImageBlock StorageDashboardConsole accesseth0eth1Management Network 192.168.1.0/24Public Network 203.0.113.0/24Flat Network 10.1.0.0/16eth1eth0Block Storage NodeSCSI target (tgt)eth1Ephemeral Storage NodeNFSeth1cinder-volume diff --git a/doc/src/docbkx/openstack-ops/src/figures/os_disk_partition.png b/doc/src/docbkx/openstack-ops/src/figures/os_disk_partition.png deleted file mode 100644 index 6ea063c0adbd83085d70e861f9c32fbe09ff5873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13269 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 Mq^bB>!R+<_0JBLWNB{r; diff --git a/doc/src/docbkx/openstack-ops/src/figures/os_physical_network.svg b/doc/src/docbkx/openstack-ops/src/figures/os_physical_network.svg deleted file mode 100644 index d4d83fcb608..00000000000 --- a/doc/src/docbkx/openstack-ops/src/figures/os_physical_network.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -2013-02-27 18:33ZCanvas 1Layer 1Compute Node neth0eth1Management Network192.168.1.0/24Flat Network10.1.0.0/16Public Network203.0.113.0/24br100instance ninstance 2instance 1 diff --git a/doc/src/docbkx/openstack-ops/src/figures/os_physical_network_1.png b/doc/src/docbkx/openstack-ops/src/figures/os_physical_network_1.png deleted file mode 100644 index a5c740a96db6905b7711ef5197cccd5d7eb39c95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42185 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 diff --git a/doc/src/docbkx/openstack-ops/src/figures/releasecyclegrizzlydiagram.png b/doc/src/docbkx/openstack-ops/src/figures/releasecyclegrizzlydiagram.png deleted file mode 100644 index 26ae2250cfa0d70053d5c5b17f57cf14feec428f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60277 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

PP>Vg1z>{zaVs{`KNfA2{)hj61LxHC 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 diff --git a/doc/src/docbkx/openstack-ops/src/preface_ops.xml b/doc/src/docbkx/openstack-ops/src/preface_ops.xml deleted file mode 100644 index 8a244850a97..00000000000 --- a/doc/src/docbkx/openstack-ops/src/preface_ops.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - -]> - - - Preface - OpenStack is an open source platform that lets you build an - Infrastructure as a Service (IaaS) cloud that runs on - commodity hardware. OpenStack is designed for scalability, so - you can easily add new compute and storage resources to grow - your cloud over time. Organizations such as HP and Rackspace - have built massive public clouds on top of OpenStack. - OpenStack is more than a software package that you run - as-is. It lets you integrate a number of different - technologies to construct a cloud. This approach provides - great flexibility, but the number of options might be - bewildering at first. - This guide assumes that you are familiar with the Ubuntu - distribution of Linux, SQL databases, and virtualization. You - must be comfortable administering and configuring multiple - Linux machines for networking. You must install and maintain a - MySQL database, and occasionally run SQL queries against it. - One of the most complex aspects of an OpenStack cloud is the - networking configuration. You should be familiar with concepts - such as DHCP, Linux bridges, VLANs, and iptables. You must - also have access to a network hardware expert who can - configure the switches and routers required in your OpenStack - cloud. -

- - Why and How We Wrote This Book - We wrote this book because we have deployed and - maintained OpenStack clouds for at least a year, and - wanted to be able to distribute this knowledge to others. - After months of being the point people for an OpenStack - cloud, we also wanted to have a document to hand to our - system administrators so they'd know how to operate the - cloud on a daily basis — both reactively and proactively. - We wanted to provide more detailed technical information - about the decisions that deployers make along the - way. - - We wrote this book to help you: - - Design and create an architecture for your - first non-trivial OpenStack cloud. After you - read this guide, you'll know which questions - to ask and how to organize your compute, - networking, storage resources, and the - associated software packages. - - - Perform the day-to-day tasks required to - administer a cloud. - - - - We wrote this book in a Book Sprint, which is a - facilitated rapid development production method for books. - For more information see the Book Sprint - site. Your authors cobbled this book together - in five days during February 2013, fueled by caffeine and - the best take-out food that Austin, Texas could offer. - On the first day we filled white boards with colorful - sticky notes to start to shape this nebulous book about - how to architect and operate clouds. - - - - - - - We wrote furiously from our own experiences and bounced - ideas between each other. At regular intervals we reviewed - the shape and organization of the book and further molded - it, leading to what you see today. - - The team includes: - - - Tom Fifield. - After learning about scalability in computing from - particle physics experiments like ATLAS at the - LHC, Tom works on OpenStack clouds in production - to support the Australian public research sector. - He lives in Melbourne, Australia and works on - OpenStack documentation in his spare time. - - - Diane Fleming. - Diane works on the OpenStack API documentation - tirelessly. She helped out wherever she could on - this project. - - - Anne Gentle. - Anne is the documentation coordinator for - OpenStack and also served as an individual - contributor to the Google Doc Summit in 2011, - working with the Open Street Maps team. Anne has - worked on doc sprints in the past with FLOSS - Manuals’ Adam Hyde facilitating. Anne lives in - Austin, Texas. - - - Lorin - Hochstein. An academic turned software - developer-slash-operator, Lorin currently works as - the Lead Architect for Cloud Services at Nimbis - Services where he deploys OpenStack for technical - computing applications. He has been working with - OpenStack since the Cactus release. Previously, he - worked on high-performance computing extensions - for OpenStack at University of Southern - California's Information Sciences Institute - (USC-ISI). - - - Adam Hyde. Adam - facilitated this Book Sprint. He also founded the - Book Sprint methodology and is the most - experienced Book Sprint facilitator around. See - http://www.booksprints.net/ for more information. - Adam founded FLOSS Manuals—a community of some - 3,000 individuals developing Free Manuals about - Free Software. He is also the founder and project - manager for Booktype, an open source project for - writing, editing, and publishing books online and - in print. - - - Jonathan - Proulx. Jon has been piloting an - OpenStack cloud as a senior system administrator - at the MIT Computer Science and Artificial - Intelligence Lab for his researchers to have as - much computing power as they need. He started - contributing to OpenStack documentation and - reviewing the documentation so that he could - accelerate his learning. - - - Everett Toews. - Everett is a Developer Advocate at Rackspace - making OpenStack and the Rackspace Cloud easy to - use. Sometimes developer, sometimes advocate, and - sometimes operator. He's built web applications, - taught workshops, given presentations around the - world, and deployed OpenStack for production use - by academia and business. - - - Joe Topjian. - Joe has designed and deployed several clouds at - Cybera, where, as a non-profit, they are building - e-infrastructure to support entrepreneurs and - local researchers in Alberta, Canada. He also - actively maintains and operates these clouds which - has generated a wealth of troubleshooting skills - for cloud environments. - - -
- -
- How to Contribute to This Book - The genesis of this book was an in-person event, but now - that the book is in your hands we want you to contribute - to it. OpenStack documentation follows the coding - principles of iterative work, with bug logging, - investigating, and fixing. - - - Learn more about how to contribute to the OpenStack docs - at Documentation How To - (http://wiki.openstack.org/Documentation/HowTo). - If you find a bug and can't fix it or aren't sure it's - really a doc bug, log a bug at OpenStack Manuals - (http://bugs.launchpad.net/openstack-manuals). Tag the bug - under Extra options with - ops-guide tag to indicate that the - bug is in this guide. You can assign the bug to yourself - if you know how to fix it. Also, a member of the OpenStack - doc-core team can triage the doc bug. -
- -