Explore full potential of OpenStack

Welcome!

We hope that both you and your team are now getting up to speed with Canonical OpenStack. We’ve already learned how to deploy the cloud, interact with it and provision cloud resources (i.e. VMs). But OpenStack is not just a virtualization platform. Its potential spans far beyond that.

In this tutorial we will demonstrate how to use a wider spectrum of the capabilities of OpenStack available to handle a real life scenario. We will provision two VMs with the Apache HTTP Server installed and set up a load balancer in front of them. Moreover, we will automate the whole process using the OpenStack orchestration service (Heat).

Ready to take your knowledge to the next level? Let’s explore full potential of OpenStack together!

Note

This tutorial is intended to serve for learning purposes only. If you’re looking for detailed instructions on how to deploy a production-grade cloud, please refer to the How-to Guides section of this documentation instead.

Requirements

You will only need one dedicated physical machine with:

You can also use a virtual machine instead, but you can expect some performance degradation in this case.

Warning

All terminal commands used in this series of tutorials are run from the aforementioned machine. All web browser examples presented in this series of tutorials are run from the aforementioned machine. Neither OpenStack APIs nor any of the provisioned cloud resources, including VMs and floating IPs will be accessible from any other machine in your network than the aforementioned one. Everything runs on that machine. But it runs and it works!

Credentials

Make sure you’re logged in as the admin user and not as demo or myuser users.

To log in as the admin user, open a new terminal window and execute the following command:

source <(sunbeam openrc)

Enable additional features

Note

Duration: 10 minutes (exact time might vary depending on your Internet connection speed)

We’re going to start with enabling two additional optional features in Canonical OpenStack:

  • loadbalancer - this feature deploys Octavia, the OpenStack load balancing service,

  • orchestration - this feature deploys Heat, the OpenStack orchestration service.

To enable the first feature, execute the following command:

sunbeam enable loadbalancer

After a while, you should be able to see the following message on your screen:

OpenStack loadbalancer application enabled.

To enable the other one, run:

sunbeam enable orchestration

After a while, this should result in:

OpenStack orchestration application enabled.

Assign the load-balancer_member role

Note

Duration: 1 minute

To be able to create and manage load balancers, users must have the load-balancer_member role assigned.

Execute the following command to assign the load-balancer_member role to the myuser user in the myproject project:

openstack role add --project myproject --project-domain users --user myuser --user-domain users load-balancer_member

Then open a new terminal window, and log in as the myuser user:

source ~/Downloads/myproject-openrc.sh

Create the stack

Note

Duration: 6 minutes

The OpenStack orchestration service enables creating stacks consisting of multiple cloud resources. Those can be VMs, networks, floating IPs, load balancers or even individual security rules. The main advantage of Heat over custom scripts and third-party tools is that it manages dependencies automatically and enables cross-resource references. For example, you can create a floating IP and associate it with a VM without knowing its exact value.

Heat uses Heat Orchestration Templates (HOTs) which are YAML files that contain full description of stacks being created. Below is a HOT that we’ll use in the following example. It creates two VMs, installs the apache2 package on them and creates a load balancer with a floating IP address attached. You can refer to individual sections of this file as they provide some meaningful instructions on what happens in every single step:

heat_template_version: 2018-08-31

description: >
  Example template to launch 2 VMs with a load balancer in front of them.

parameters:
  image:
    type: string
    description: The image to be used
    default: ubuntu
  flavor:
    type: string
    description: The flavor to be used
    default: m1.tiny
  network:
    type: string
    description: The network to be used
    default: mynetwork
  subnet:
    type: string
    description: The subnet to be used
    default: mysubnet
  external_network:
    type: string
    description: The external network for floating IP assignment
    default: external-network
  security_group:
    type: string
    description: The security group to be used
    default: default

resources:
  myinstance1:
    type: OS::Nova::Server
    description: The first VM to be created
    properties:
      name: myinstance1
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - network: { get_param: network }
      user_data_format: RAW
      user_data: |
        #cloud-config
        packages:
          - apache2
        runcmd:
          - systemctl start apache2

  myinstance2:
    type: OS::Nova::Server
    description: The second VM to be created
    properties:
      name: myinstance2
      image: { get_param: image }
      flavor: { get_param: flavor }
      networks:
        - network: { get_param: network }
      user_data_format: RAW
      user_data: |
        #cloud-config
        packages:
          - apache2
        runcmd:
          - systemctl start apache2

  lb:
    type: OS::Octavia::LoadBalancer
    description: The load balancer to be created
    properties:
      name: myloadbalancer
      vip_subnet: { get_param: subnet }

  listener:
    type: OS::Octavia::Listener
    description: The load balancer listener to be created
    properties:
      name: mylistener
      loadbalancer: { get_resource: lb }
      protocol: TCP
      protocol_port: 80

  pool:
    type: OS::Octavia::Pool
    description: The load balancer pool to be created
    properties:
      name: mypool
      listener: { get_resource: listener }
      protocol: TCP
      lb_algorithm: SOURCE_IP_PORT

  member1:
    type: OS::Octavia::PoolMember
    description: Adds the first VM to the pool
    properties:
      pool: { get_resource: pool }
      address: { get_attr: [myinstance1, first_address] }
      protocol_port: 80
      subnet: { get_param: subnet }

  member2:
    type: OS::Octavia::PoolMember
    description: Adds the second VM to the pool
    properties:
      pool: { get_resource: pool }
      address: { get_attr: [myinstance2, first_address] }
      protocol_port: 80
      subnet: { get_param: subnet }

  healthmonitor:
    type: OS::Octavia::HealthMonitor
    description: The health monitor to be created
    properties:
      delay: 7
      timeout: 5
      max_retries: 3
      type: TCP
      pool: { get_resource: pool }

  floating_ip:
    type: OS::Neutron::FloatingIP
    description: The floating IP to be created
    properties:
      floating_network: {get_param: external_network }

  floating_ip_assoc:
    type: OS::Neutron::FloatingIPAssociation
    description: Associates the floating IP with the load balancer's port
    properties:
      floatingip_id: { get_resource: floating_ip }
      port_id: { get_attr: [lb, vip_port_id] }

  security_group_rule:
    type: OS::Neutron::SecurityGroupRule
    description: Allows inbound HTTP connections under the default security group
    properties:
      security_group: { get_param: security_group }
      protocol: tcp
      direction: ingress
      remote_ip_prefix: 0.0.0.0/0
      port_range_min: 80
      port_range_max: 80

outputs:
  loadbalancer_ip:
    description: The floating IP of the load balancer
    value: { get_attr: [floating_ip, floating_ip_address] }

Save this file as template.yaml on the machine with Canonical OpenStack installed.

Then, to create a stack called mystack, execute the following command:

openstack stack create -t template.yaml mystack

After a while you should be able to see the mystack stack in the CREATE_COMPLETE status on the list of available stacks:

openstack stack list

To check the floating IP on which the load balancer is listening to incoming connections, run:

openstack stack show mystack -c outputs

Sample output:

+---------+-----------------------------------------------------+
| Field   | Value                                               |
+---------+-----------------------------------------------------+
| outputs | - description: The floating IP of the load balancer |
|         |   output_key: loadbalancer_ip                       |
|         |   output_value: 10.20.20.201                        |
|         |                                                     |
+---------+-----------------------------------------------------+

In this case the load balancer is listening at the 10.20.20.201 floating IP address.

Test the stack

Note

Duration: 2 minutes

The best way to test the entire stack is to visit the floating IP of the load balancer. Simply open your web browser and go directly to this IP (here 10.20.20.201 ). You should be able to see the Apache HTTP Server’s default page:

../../_images/explore-full-potential-of-openstack-01.png

Then, stop the first VM (myinstance1):

openstack server stop myinstance1

And go to the load balancer’s floating IP again. The page should be still up:

../../_images/explore-full-potential-of-openstack-01.png

Then, stop the second VM (myinstance2):

openstack server stop myinstance2

At this point, the Apache HTTP Server’s default page will no longer show up in the browser:

../../_images/explore-full-potential-of-openstack-02.png

Note that you might need to clean up your history or use an incognito mode. Otherwise, the page might still be cached in your browser.

Delete the stack

Note

Duration: 1 minute

In order to the delete the stack together with all the resources that have been created, execute the following command:

openstack stack delete mystack

When prompted, type y and press Enter:

Are you sure you want to delete this stack(s) [y/N]? y

Next steps

Congratulations!

You have reached the end of this tutorial and the whole series of tutorials we prepared to help you get up to speed with Canonical OpenStack.

You can now explore our How-to Guides for instructions on setting up a production-grade environment.

Good luck!