From d084653b82155476dadb33db4afa99137d7afa99 Mon Sep 17 00:00:00 2001 From: Emilien Macchi Date: Sat, 15 Dec 2012 14:38:09 +0100 Subject: [PATCH] Add Network Controller + Improve Quantum Part Patch set corrects spelling, makes the table HTML compliant rather than CORS. Change-Id: Ifb97b55d8670080de203327b095784f4469e0319 --- .../src/basic-install_architecture.xml | 52 ++++++++ .../src/basic-install_compute-common.xml | 44 ++++--- .../src/basic-install_compute-hypervisor.xml | 3 +- .../src/basic-install_compute-nova.xml | 5 +- .../src/basic-install_compute-quantum.xml | 18 +-- .../src/basic-install_conclusion.xml | 10 +- .../src/basic-install_controller-cinder.xml | 18 +-- .../src/basic-install_controller-common.xml | 55 ++++---- .../basic-install_controller-dashboard.xml | 10 +- .../src/basic-install_controller-glance.xml | 7 +- .../src/basic-install_controller-intro.xml | 4 +- .../src/basic-install_controller-keystone.xml | 7 +- .../src/basic-install_controller-nova.xml | 38 +++++- .../src/basic-install_controller-quantum.xml | 64 +++------- .../basic-install/src/basic-install_intro.xml | 10 +- .../src/basic-install_network-common.xml | 97 +++++++++++++++ .../src/basic-install_network-intro.xml | 19 +++ .../src/basic-install_network-operating.xml | 44 +++++++ .../src/basic-install_network-services.xml | 83 +++++++++++++ .../src/basic-install_network.xml | 12 ++ .../src/basic-install_operate.xml | 40 ++++++ .../src/basic-install_requirements.xml | 117 ++++++++++++------ .../basic-install/src/bk-basic-install.xml | 3 + .../src/figures/Quantum-PhysNet-Diagram.png | Bin 0 -> 60569 bytes 24 files changed, 586 insertions(+), 174 deletions(-) create mode 100644 doc/src/docbkx/basic-install/src/basic-install_architecture.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_network-common.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_network-intro.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_network-operating.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_network-services.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_network.xml create mode 100644 doc/src/docbkx/basic-install/src/basic-install_operate.xml create mode 100644 doc/src/docbkx/basic-install/src/figures/Quantum-PhysNet-Diagram.png diff --git a/doc/src/docbkx/basic-install/src/basic-install_architecture.xml b/doc/src/docbkx/basic-install/src/basic-install_architecture.xml new file mode 100644 index 0000000000..610000ae3e --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_architecture.xml @@ -0,0 +1,52 @@ + +
+ Architecture + + + + + + + + + + A standard Quantum setup has up to four distinct physical data center networks: + + + Management + network. Used for internal + communication between OpenStack components. The IP + addresses on this network should be reachable only + within the data center.  + + + Data + network. Used for VM data communication + within the cloud deployment. The IP addressing + requirements of this network depend on the Quantum + plugin in use.  + + + External + network. Used to provide VMs with + Internet access in some deployment scenarios. The IP + addresses on this network should be reachable by + anyone on the Internet.  + + + API + network. Exposes all OpenStack + APIs, including the Quantum API, to + tenants. The IP addresses on this network + should be reachable by anyone on the + Internet. This may be the same network as + the external network, as it is possible to create + a quantum subnet for the external network that uses + IP allocation ranges to use only less than the full + range of IP addresses in an IP block. + + +
diff --git a/doc/src/docbkx/basic-install/src/basic-install_compute-common.xml b/doc/src/docbkx/basic-install/src/basic-install_compute-common.xml index 100d5a3c5d..4c101ff297 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_compute-common.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_compute-common.xml @@ -20,19 +20,21 @@ After OS Installation, reboot the server . - Add the repository and upgrade Ubuntu :apt-get install -y python-software-properties -add-apt-repository ppa:openstack-ubuntu-testing/folsom-trunk-testing -add-apt-repository ppa:openstack-ubuntu-testing/folsom-deps-staging -apt-get update && apt-get -y dist-upgradeReboot the server. + Since Ubuntu 12.04 LTS has OpenStack Essex by default, we are going to use + Cloud Archives for Folsom :apt-get install ubuntu-cloud-keyringEdit + /etc/apt/source.list.d/cloud-archive.list + :deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main Upgrade + the system (and reboot if you need) + :apt-get update && apt-get upgrade Configure the network : - - Edit /etc/network/interfaces - file : - - # Management Network + + Edit /etc/network/interfaces file + : + + # Management Network auto eth0 iface eth0 inet static address 192.168.0.2 @@ -40,25 +42,29 @@ auto eth0 gateway 192.168.0.254 dns-nameservers 8.8.8.8 -# VMs Networks with OVS in tunnel mode +# Data Network auto eth1 iface eth1 inet static - address 10.0.0.4 - netmask 255.255.255.0Then, restart network service :service networking restart + address 10.10.10.2 + netmask 255.255.255.0Then, + restart network service + :service networking restart - Enable IP forwarding : + Edit /etc/sysctl.conf + : - sed -i -r 's/^\s*#(net\.ipv4\.ip_forward=1.*)/\1/' /etc/sysctl.conf -echo 1 > /proc/sys/net/ipv4/ip_forward + net.ipv4.ip_forward=1 +net.ipv4.conf.all.rp_filter = 0 +net.ipv4.conf.default.rp_filter = 0 Edit the /etc/hosts file and - add folsom-controller & - folsom-compute hostnames - with correct IP. + add folsom-controller, folsom-network and folsom-compute hostnames with correct IP. @@ -77,4 +83,4 @@ echo 1 > /proc/sys/net/ipv4/ip_forward - \ No newline at end of file + diff --git a/doc/src/docbkx/basic-install/src/basic-install_compute-hypervisor.xml b/doc/src/docbkx/basic-install/src/basic-install_compute-hypervisor.xml index 1f6f77ec23..25f6ca748b 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_compute-hypervisor.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_compute-hypervisor.xml @@ -7,7 +7,8 @@ - Install the packages that we need :apt-get install -y kvm libvirt-bin pm-utils + Install the packages that we need + :apt-get install -y kvm libvirt-bin pm-utils Configure libvirt : diff --git a/doc/src/docbkx/basic-install/src/basic-install_compute-nova.xml b/doc/src/docbkx/basic-install/src/basic-install_compute-nova.xml index 0cc0eb0d98..6b206e3bfc 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_compute-nova.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_compute-nova.xml @@ -29,7 +29,8 @@ libvirt_use_virtio_for_bridges=True Edit /etc/nova/nova.conf file - and modify :[DEFAULT] + and modify + :[DEFAULT] # MySQL Connection # sql_connection=mysql://nova:password@192.168.0.1/nova @@ -53,7 +54,7 @@ use_deprecated_auth=false ec2_private_dns_show_ip=True dmz_cidr=169.254.169.254/32 ec2_dmz_host=192.168.0.1 -metadata_host=192.168.0.2 +metadata_host=192.168.0.3 metadata_listen=0.0.0.0 enabled_apis=metadata diff --git a/doc/src/docbkx/basic-install/src/basic-install_compute-quantum.xml b/doc/src/docbkx/basic-install/src/basic-install_compute-quantum.xml index 9b748743ab..69b77edbcf 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_compute-quantum.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_compute-quantum.xml @@ -25,20 +25,24 @@ restart quantum-plugin-openvswitch-agent Configure virtual bridging :ovs-vsctl add-br br-int - Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini - file and modify :[DATABASE] + Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini file and + modify + :[DATABASE] sql_connection = mysql://quantum:password@192.168.0.1:3306/quantum -reconnect_interval = 2 [OVS] tenant_network_type = gre tunnel_id_ranges = 1:1000 integration_bridge = br-int tunnel_bridge = br-tun -local_ip = 10.0.0.4 -enable_tunneling = True -[AGENT] -root_helper = sudo /usr/bin/quantum-rootwrap /etc/quantum/rootwrap.conf +local_ip = 10.0.0.2 +enable_tunneling = True + + Edit /etc/quantum/api-paste.ini file and modify :admin_tenant_name = service +admin_user = quantum +admin_password = password + Start the Agent :service quantum-plugin-openvswitch-agent restart diff --git a/doc/src/docbkx/basic-install/src/basic-install_conclusion.xml b/doc/src/docbkx/basic-install/src/basic-install_conclusion.xml index 0ea16d9138..f51dd66e5b 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_conclusion.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_conclusion.xml @@ -4,6 +4,12 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="basic-install_conclusion"> Conclusion - That's it ! You can now use OpenStack API or the Dashboard to manage your own IaaS : - http://192.168.0.1/horizon + We have built a basic architecture for advanced testing + purpose. This kind of architecture is close to the + production, without High Availability (HA) and some + services such as those for running OpenStack Object + Storage. You can of course add as many compute nodes + as you want. If you need more specific help, please + read the official documentation of each project or + write a post to an OpenStack mailing list. diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-cinder.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-cinder.xml index 592bfd0944..024775de18 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-cinder.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-cinder.xml @@ -10,6 +10,10 @@ Install the packages :apt-get install -y cinder-api cinder-scheduler cinder-volume iscsitarget \ open-iscsi iscsitarget-dkms python-cinderclient + Since there is a bug in tgtadm, we have to modify /etc/tgt/targets.conf + :# include /etc/tgt/conf.d/*.conf +include /etc/tgt/conf.d/cinder_tgt.conf Configure & start the iSCSI services :sed -i 's/false/true/g' /etc/default/iscsitarget service iscsitarget start @@ -20,15 +24,10 @@ service open-iscsi start Edit /etc/cinder/cinder.conf - file and modify :[DEFAULT] -rootwrap_config = /etc/cinder/rootwrap.conf + file and modify + :[DEFAULT] sql_connection = mysql://cinder:password@localhost:3306/cinder -iscsi_helper = ietadm -volume_group = cinder-volumes -rabbit_password = password -logdir = /var/log/cinder -verbose = true -auth_strategy = keystone +rabbit_password = password Edit /etc/cinder/api-paste.ini file and modify :admin_tenant_name = service @@ -36,7 +35,8 @@ admin_user = cinder admin_password = password - Create the volume :fdisk /dev/sdb + Create the volume (on the second disk) + :fdisk /dev/sdb [Create a Linux partition] diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-common.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-common.xml index acb8d3b89d..fcbce0f1d3 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-common.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-common.xml @@ -21,13 +21,17 @@ After OS Installation, reboot the server. - - Setup the Cloud Archive in editing /etc/apt/sources.list : - deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main - Then, you should setup keyring and upgrade packages : - apt-get install ubuntu-cloud-keyring -apt-get update && apt-get -y dist-upgradeReboot the server. - + + Since Ubuntu 12.04 LTS has OpenStack Essex + by default, we are going to use the Ubuntu Cloud + Archive for Folsom + :apt-get install ubuntu-cloud-keyringEdit + /etc/apt/source.list.d/cloud-archive.list + :deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main Upgrade + the system (and reboot if you need) + :apt-get update && apt-get upgrade + Configure the network : @@ -43,36 +47,29 @@ auto eth0 gateway 192.168.0.254 dns-nameservers 8.8.8.8 -# VMs Networks with OVS in tunnel mode +# API + Public Network auto eth1 iface eth1 inet static - address 10.0.0.3 - netmask 255.255.255.0 - -# Public Bridge - auto eth2 - iface eth2 inet manual - up ifconfig $IFACE 0.0.0.0 up - up ip link set $IFACE promisc on - down ifconfig $IFACE downThen, + address 7.7.7.7 + netmask 255.255.255.0Then, restart network service : service networking restart - Enable IP forwarding since - this node will be a gateway (with quantum-l3-agent) between - external & internal network : + Edit /etc/sysctl.conf + : - sed -i -r 's/^\s*#(net\.ipv4\.ip_forward=1.*)/\1/' /etc/sysctl.conf -echo 1 > /proc/sys/net/ipv4/ip_forward + net.ipv4.ip_forward=1 +net.ipv4.conf.all.rp_filter = 0 +net.ipv4.conf.default.rp_filter = 0 Edit the /etc/hosts file and - add folsom-controller & - folsom-compute hostnames - with correct IP. + add folsom-controller, folsom-network and folsom-compute hostnames with correct IP. @@ -99,7 +96,7 @@ fudge 127.127.1.0 stratum 10
- MySQL + MySQL Database Service @@ -124,6 +121,8 @@ GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.1' \ IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.2' \ IDENTIFIED BY 'password'; +GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'192.168.0.3' \ +IDENTIFIED BY 'password'; CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \ IDENTIFIED BY 'password'; @@ -138,6 +137,8 @@ GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'localhost' \ IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.0.2' \ IDENTIFIED BY 'password'; +GRANT ALL PRIVILEGES ON quantum.* TO 'quantum'@'192.168.0.3' \ +IDENTIFIED BY 'password'; FLUSH PRIVILEGES; EOF @@ -145,7 +146,7 @@ EOF
- Rabbit-MQ + RabbitMQ Messaging Service diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-dashboard.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-dashboard.xml index b46850062d..8d1a443ea1 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-dashboard.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-dashboard.xml @@ -4,9 +4,11 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="basic-install_controller-dashboard"> Dashboard (Horizon) -Install the packages :apt-get -y install apache2 libapache2-mod-wsgi openstack-dashboard \ - memcached python-memcacheYou - can now login with admin / password credentials or demo / - password. +Install the packages + :apt-get -y install apache2 libapache2-mod-wsgi openstack-dashboard \ + memcached python-memcacheWe + can now login with admin / password credentials or demo / password.
diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-glance.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-glance.xml index 4cee3d7f9c..8e46a329a7 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-glance.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-glance.xml @@ -28,9 +28,10 @@ rabbit_password = password Create Glance tables into the database :glance-manage db_sync - Download and import Ubuntu 12.04 UEC Image : -glance image-create --location http://uec-images.ubuntu.com/releases/precise/release/ubuntu-12.04-server-cloudimg-amd64.tar.gz --is-public true --disk-format qcow2 --container-format bare --name "Ubuntu 12.04 UEC" - + Download and import Ubuntu 12.04 LTS UEC Image + :glance image-create \ + --location http://uec-images.ubuntu.com/releases/12.04/release/ubuntu-12.04-server-cloudimg-amd64-disk1.img \ + --is-public true --disk-format qcow2 --container-format bare --name "Ubuntu" Check if the image has been introduced in the index diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-intro.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-intro.xml index 0b669b73f8..1fd7613b1c 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-intro.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-intro.xml @@ -10,7 +10,7 @@ Databases (with MySQL) - Queues (with Rabbit-MQ) + Queues (with RabbitMQ) Keystone @@ -25,7 +25,7 @@ Cinder - Quantum (with Open-vSwitch plugin) + Quantum Server (with Open-vSwitch plugin) Dashboard (with Horizon) diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-keystone.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-keystone.xml index 813eb6be2d..28469b3928 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-keystone.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-keystone.xml @@ -64,8 +64,11 @@ echo "source novarc">>.bashrc - Download the data script and fill Keystone database with datas (users, - tenants, services) :./keystone-data.sh + Download the data script and fill Keystone database + with data (users, tenants, services) + :./keystone-data.sh Download the Edit /etc/nova/api-paste.ini - file and modify :admin_tenant_name = service + file and modify + :admin_tenant_name = service admin_user = nova -admin_password = passwordYou - should also delete each - composite with "volume". - We can do that manually or with this command :sed -i '/volume/d' /etc/nova/api-paste.ini +admin_password = passwordSince + we are going to use Cinder for volumes, we should also delete each part concerning "nova-volume" : + ============================================================ +[composite:osapi_volume] +use = call:nova.api.openstack.urlmap:urlmap_factory +/: osvolumeversions +/v1: openstack_volume_api_v1 +============================================================ + +============================================================ +[composite:openstack_volume_api_v1] +use = call:nova.api.auth:pipeline_factory +noauth = faultwrap sizelimit noauth ratelimit osapi_volume_app_v1 +keystone = faultwrap sizelimit authtoken keystonecontext ratelimit osapi_volume_app_v1 +keystone_nolimit = faultwrap sizelimit authtoken keystonecontext osapi_volume_app_v1 +============================================================ + +============================================================ +[app:osapi_volume_app_v1] +paste.app_factory = nova.api.openstack.volume:APIRouter.factory +============================================================ + +============================================================ +[pipeline:osvolumeversions] +pipeline = faultwrap osvolumeversionapp + +[app:osvolumeversionapp] +paste.app_factory = nova.api.openstack.volume.versions:Versions.factory +============================================================ Edit /etc/nova/nova.conf file diff --git a/doc/src/docbkx/basic-install/src/basic-install_controller-quantum.xml b/doc/src/docbkx/basic-install/src/basic-install_controller-quantum.xml index ac7411dd97..4ff9964a9d 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_controller-quantum.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_controller-quantum.xml @@ -14,12 +14,6 @@ Start Open-vSwitch service & restart the agent :/etc/init.d/openvswitch-switch start - - Configure virtual bridging :ovs-vsctl add-br br-int -ovs-vsctl add-br br-ex -ovs-vsctl br-set-external-id br-ex bridge-id br-ex -ovs-vsctl add-port br-ex eth2 - @@ -28,9 +22,9 @@ ovs-vsctl add-port br-ex eth2 - Install the packages :apt-get -y install quantum-server python-cliff \ + Install the packages + :apt-get -y install quantum-server python-cliff \ quantum-plugin-openvswitch-agent \ - quantum-l3-agent quantum-dhcp-agent \ python-pyparsing @@ -44,36 +38,22 @@ fake_rabbit = False rabbit_password = password - Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini file and modify :[DATABASE] + Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini + file and modify :[DATABASE] sql_connection = mysql://quantum:password@localhost:3306/quantum -reconnect_interval = 2 [OVS] tenant_network_type = gre tunnel_id_ranges = 1:1000 -integration_bridge = br-int -tunnel_bridge = br-tun -local_ip = 10.0.0.3 -enable_tunneling = True -[AGENT] -root_helper = sudo /usr/bin/quantum-rootwrap /etc/quantum/rootwrap.conf - - It's more handy to choose tunnel mode since you don't have to configure your physical switchs for VLANs. +enable_tunneling = True + + It's more handy to choose + tunnel + mode since you don't + have to configure your physical + switches for VLANs. - - Edit /etc/quantum/l3_agent.ini file and modify :[DEFAULT] -debug = True -interface_driver = quantum.agent.linux.interface.OVSInterfaceDriver -auth_url = http://localhost:35357/v2.0 -auth_region = RegionOne -admin_tenant_name = service -admin_user = quantum -admin_password = password -root_helper = sudo quantum-rootwrap /etc/quantum/rootwrap.conf -metadata_ip = 192.168.0.1 -use_namespaces = False - Edit /etc/quantum/dhcp_agent.ini file and add :use_namespaces = False @@ -85,23 +65,9 @@ admin_password = password - Start the services :service quantum-server restart -service quantum-plugin-openvswitch-agent restart -service quantum-dhcp-agent restart -service quantum-l3-agent restart - - - Download my Quantum script. Before launching it, you should modify - networking informations inside the script. All is commented and you can - customize belong your needs. In this script, we actually create one - tenant network with its router, and one external network connected to - the tenant router. We are using the "Per-tenant - Routers with Private Networks" - use-case../quantum-networking.sh - - - We need now to configure again the L3 Agent in editing /etc/quantum/l3_agent.ini file and modify the - values for router and external network. + Start the services + :service quantum-server restart +service quantum-plugin-openvswitch-agent restart diff --git a/doc/src/docbkx/basic-install/src/basic-install_intro.xml b/doc/src/docbkx/basic-install/src/basic-install_intro.xml index c9e2c7a602..1a17ed26b8 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_intro.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_intro.xml @@ -4,8 +4,12 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="basic-install_intro"> Introduction - This document helps anyone who wants to deploy OpenStack Folsom for development purpose with Ubuntu 12.04 LTS (using Cloud Archives). - We are going to install a dual-node setup with one controller and one compute node. - Of course, you can setup as many computes nodes as you want. + This document helps anyone who wants to deploy OpenStack + Folsom for development purposes with Ubuntu 12.04 LTS (using + the Ubuntu Cloud Archive). + We are going to install a three-node setup with one + controller, one network and one compute node. + Of course, you can setup as many computes nodes as you want. This document is a good start + for beginners in OpenStack who want to install a testing infrastructure. diff --git a/doc/src/docbkx/basic-install/src/basic-install_network-common.xml b/doc/src/docbkx/basic-install/src/basic-install_network-common.xml new file mode 100644 index 0000000000..d216ad45ea --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_network-common.xml @@ -0,0 +1,97 @@ + +
+ Common services +
+ Operating System + + + Install Ubuntu with this parameters : + + Time zone : UTC + + + Hostname : folsom-network + + + Packages : OpenSSH-Server + + + After OS Installation, reboot the server. + + + Since Ubuntu 12.04 LTS has OpenStack Essex by default, we are going to use + Cloud Archives for Folsom :apt-get install ubuntu-cloud-keyringEdit + /etc/apt/source.list.d/cloud-archive.list + :deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/folsom main Upgrade + the system (and reboot if you need) + :apt-get update && apt-get upgrade + + + Configure the network : + + + Edit /etc/network/interfaces file + : + + # Management Network +auto eth0 + iface eth0 inet static + address 192.168.0.2 + netmask 255.255.255.0 + gateway 192.168.0.254 + dns-nameservers 8.8.8.8 + +# Data Network + auto eth1 + iface eth1 inet static + address 10.0.0.1 + netmask 255.255.255.0 + +# Public Bridge + auto eth2 + iface eth2 inet manual + up ifconfig $IFACE 0.0.0.0 up + up ip link set $IFACE promisc on + down ifconfig $IFACE downThen, + restart network service : + service networking restart + + + + Edit /etc/sysctl.conf + : + + + net.ipv4.ip_forward=1 +net.ipv4.conf.all.rp_filter = 0 +net.ipv4.conf.default.rp_filter = 0 + + + Edit the /etc/hosts file and + add folsom-controller, folsom-network and folsom-compute hostnames with correct IP. + + + + + + Install Configure NTP : + + Install the package :apt-get install -y ntp + + + Configure /etc/ntp.conf file :server 192.168.0.1 + + + Restart the service + :service ntp restart + + + + +
+
diff --git a/doc/src/docbkx/basic-install/src/basic-install_network-intro.xml b/doc/src/docbkx/basic-install/src/basic-install_network-intro.xml new file mode 100644 index 0000000000..4e10103b5b --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_network-intro.xml @@ -0,0 +1,19 @@ + +
+ Introduction + The Network node will provide : + + + Virtual Routing (Quantum L3 Agent) + + + Virtual Bridging (Open-vSwitch + Quantum Agent) with tunneling + + + DHCP Server (Quantum DHCP Agent) + + +
\ No newline at end of file diff --git a/doc/src/docbkx/basic-install/src/basic-install_network-operating.xml b/doc/src/docbkx/basic-install/src/basic-install_network-operating.xml new file mode 100644 index 0000000000..04b80ef317 --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_network-operating.xml @@ -0,0 +1,44 @@ + +
+ Virtual Networking +
+ Create Virtual Networking + + + + Download the Quantum script. + We are using the "Per-tenant + Routers with Private Networks" use-case. + + Edit the script belong your networking (public network, floatings IP). + + + Execute the script. + + + +
+
+ L3 Configuration + + + Copy the external network ID :quantum net-list + + + Edit /etc/quantum/l3-agent.ini and paste the ID :gateway_external_net_id = ID + + + Copy the provider router ID :quantum router-list + + + Edit /etc/quantum/l3-agent.ini and paste the ID :router_id = ID + + + Restart L3 Agent :service quantum-l3-agent restart + + +
+
\ No newline at end of file diff --git a/doc/src/docbkx/basic-install/src/basic-install_network-services.xml b/doc/src/docbkx/basic-install/src/basic-install_network-services.xml new file mode 100644 index 0000000000..8ba8b4f437 --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_network-services.xml @@ -0,0 +1,83 @@ + +
+ Network Services +
+ Open-vSwitch + + + + Install the packages :apt-get -y install quantum-plugin-openvswitch-agent +quantum-dhcp-agent quantum-l3-agent + + + Create Virtual Bridging + :ovs-vsctl add-br br-int +ovs-vsctl add-br br-ex +ovs-vsctl add-port br-ex eth2 +ip link set up br-ex + + + +
+
+ Quantum + Configure Quantum services : + + + Edit /etc/quantum/api-paste.ini file and modify :admin_tenant_name = service +admin_user = quantum +admin_password = password + + + Edit /etc/quantum/l3_agent.ini file and modify :admin_tenant_name = service +admin_user = quantum +admin_password = password +metadata_ip = 192.168.0.1 +use_namespaces=False + + + Edit /etc/quantum/quantum.conf file and modify :core_plugin = \ + quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPluginV2 +auth_strategy = keystone +fake_rabbit = False +rabbit_password = password + + + Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini file and + modify :[DATABASE] +sql_connection = mysql://quantum:password@localhost:3306/quantum +[OVS] +tenant_network_type = gre +tunnel_id_ranges = 1:1000 +enable_tunneling = True +integration_bridge = br-int +tunnel_bridge = br-tun +local_ip = 10.10.10.1 + + It's more handy to choose tunnel mode + since you don't have to configure your + physical switches for VLANs. + + + + Edit /etc/quantum/dhcp_agent.ini file and add :use_namespaces = False + + + Edit /etc/quantum/api-paste.ini file and modify :admin_tenant_name = service +admin_user = quantum +admin_password = password + + + + Start the services + :service quantum-plugin-openvswitch-agent restart +service quantum-dhcp-agent restart +service quantum-l3-agent restart + +
+
diff --git a/doc/src/docbkx/basic-install/src/basic-install_network.xml b/doc/src/docbkx/basic-install/src/basic-install_network.xml new file mode 100644 index 0000000000..4fcb985225 --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_network.xml @@ -0,0 +1,12 @@ + +
+ Network Node + + + + + +
diff --git a/doc/src/docbkx/basic-install/src/basic-install_operate.xml b/doc/src/docbkx/basic-install/src/basic-install_operate.xml new file mode 100644 index 0000000000..9701f7551a --- /dev/null +++ b/doc/src/docbkx/basic-install/src/basic-install_operate.xml @@ -0,0 +1,40 @@ + +
+ Create your first VM + + + You can now use OpenStack API or the Dashboard to manage your + own IaaS : http://192.168.0.1/horizon with demo / + password credentials. + + + Edit the security group "Default" to allow ICMP and SSH. + + + Create a personal keypair. + + + In the Dashboard, go to "Instances and Images" for + spawning a new VM. + + + Since Horizon does not manage L3 in Folsom release, we have to configure floating IP from Quantum CLI (using demo tenant). + To do that, you need to get the ext_net ID and the port_id of your VM : + quantum net-list +quantum port-list + + + Now, we are going to create a floating-IP attached to the virtual port of our VM and routed to the external network : + quantum floatingip-create --port_id port_id ext_net_id + + + That's it! You should be able to ping your VM using + floating IP. + + +
diff --git a/doc/src/docbkx/basic-install/src/basic-install_requirements.xml b/doc/src/docbkx/basic-install/src/basic-install_requirements.xml index 6c1842ca9a..f80393383d 100644 --- a/doc/src/docbkx/basic-install/src/basic-install_requirements.xml +++ b/doc/src/docbkx/basic-install/src/basic-install_requirements.xml @@ -4,43 +4,82 @@ xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="basic-install_requirements"> Requirements - You need at least two machines (virtual or physical) with 3 NIC (Managment Network + VMs - Traffic in tunnel mode + Public Network) for controller node and 2 NIC (Managment - Network + VMs Traffic in tunnel mode) for compute node. You need also to download Ubuntu - 12.04 (LTS). - - - Architecture and informations - - - - - - - - - controller - compute - - - - - Managment Network - 192.168.0.1/24 - 192.168.0.2/24 - - - Hostname - folsom-controller - folsom-compute - - - Services - MySQL, RabbitMQ, Nova, Cinder, Glance, Keystone, Quantum, - Open-vSwitch - nova-compute, KVM, nova-api, Quantum Agent with Open-vSwitch - - - -
+ You need at least three machines (virtual or physical) with Ubuntu 12.04 (LTS) + installed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Architecture and node information
+ controllernetworkcompute +
+ Hostnamefolsom-controllerfolsom-networkfolsom-compute +
+ ServicesMySQL, RabbitMQ, Nova, Cinder, Glance, + Keystone, Quantum, Open-vSwitchQuantum-L3-agent, Quantum-DHCP-agent, + Open-vSwitchnova-compute, KVM, nova-api, Quantum Agent + with Open-vSwitch +
+ Minimum number of disks211 +
+ External + API network7.7.7.7/247.7.7.8/24- +
+ Management network192.168.0.1/24192.168.0.2/24192.168.0.3/24 +
+ Data network-10.10.10.1/2410.10.10.2/24 +
+ Total number of + NIC232 +
diff --git a/doc/src/docbkx/basic-install/src/bk-basic-install.xml b/doc/src/docbkx/basic-install/src/bk-basic-install.xml index b191cc1dc2..07b63a916d 100644 --- a/doc/src/docbkx/basic-install/src/bk-basic-install.xml +++ b/doc/src/docbkx/basic-install/src/bk-basic-install.xml @@ -7,8 +7,11 @@ xml:id="openstack-basic-install-trunk"> OpenStack Basic Install + + + diff --git a/doc/src/docbkx/basic-install/src/figures/Quantum-PhysNet-Diagram.png b/doc/src/docbkx/basic-install/src/figures/Quantum-PhysNet-Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..324d2d8345b98c162265bf4e39faa778c766324f GIT binary patch literal 60569 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