OpenStack is an open source cloud computing platform that offers mainly an Infrastructure as a Service (IaaS) solution and several service features such as scalability, high availability, and redundancy. It was started as a joint project by NASA and Rackspace in 2010. OpenStack is a combination of several independent components that are integrated with each user using an API. A non-profit corporate organization called OpenStack Foundation was established in the year 2012, which is responsible for maintaining the versioning and development of OpenStack.
The following are the objectives that we will cover in this chapter:
The OpenStack architecture
The Orchestration service of OpenStack
The Heat workflow
The Orchestration authorization model
Stack domain users
Several independent applications (also called projects) are responsible for the formation of OpenStack. These applications are discussed in the following sections.
Horizon is the web-based control panel that provides an interface (or a dashboard) to control and carry out administrative activities in the cloud environment. It provides web-based options to interact with other components of OpenStack. New virtual machine instances can be launched using this interface. Not only this but also several other resources such as disk volumes, floating IP addresses, and so on can be managed using this interface. This project was named as Horizon.
Nova is the compute service component of the OpenStack framework that is responsible for maintaining the life cycle of virtual machines. This includes spawning of new virtual machines, stopping, restarting, and decommissioning of virtual machines.
Neutron is the component of OpenStack that offers networking services, including LAN subnet management, VLAN management, and bridging services to be used by the virtual machine instances. It also includes the Open vSwitch application that provides an SDN-enabled forwarding device.
The Swift component of OpenStack is responsible for providing object storage services.
Object storage is a storage type where data is stored in the form of objects (data and associated metadata). It also provides an API to access and store data.
This Cinder component of OpenStack offers block storage services. This is used by the virtual machine instances as disk volumes.
Keystone is the component of OpenStack that provides authentication and authorization services to other components of OpenStack as well as individual users or tenants.
Glance provides disk imaging service to the virtual machine instances of OpenStack. Disk images can be used to create new disk volumes and virtual machine instances.
Ceilometer is the metering service provider for OpenStack. It monitors and records several performance metrics for OpenStack components that include CPU load, CPU utilization, memory utilization, disk volume utilization, and so on.
Heat is the component of OpenStack with provides orchestration and configuration service for OpenStack components and resources. It can be used in combination with the Ceilometer component to achieve autoscalability and high availability.
Heat supports standards such as TOSCA (Topology and Orchestration Specification for Cloud Applications) and Amazon CloudFormation.
Orchestration is a main feature provided and supported by OpenStack. It is used to orchestrate cloud resources, including applications, disk resources, IP addresses, load balancers, and so on.
As discussed in the earlier sections of this chapter, the OpenStack component that is responsible for managing the orchestration services in OpenStack is Heat.
Heat contains a template engine that supports text files where cloud resources are defined. These text files are defined in a special format compatible with Amazon CloudFormation. A new OpenStack native standard has also been developed for providing templates for Orchestration called HOT (Heat Orchestration Template).
Heat provides two types of clients including a command-line client and a web-based client integrated into the OpenStack dashboard.
The Orchestration project (Heat) itself is composed of several subcomponents. These subcomponents are listed as follows:
Heat uses the term "stack" to define a group of services, resources, parameters inputs, constraints, and dependencies. A stack can be defined using a text file; however, the important point is to use the correct format. The JSON format used by AWS CloudFormation is also supported by Heat.
As already mentioned in the previous sections of this chapter, Heat provides two types of interfaces, including a web-based interface integrated into the OpenStack dashboard and also a command-line interface (CLI), which can be used from inside a Linux shell.
The interfaces use the heat-api to send commands to the Heat engine via the messaging service (for example RabbitMQ). A metering service such as Ceilometer or CloudWatch API is used to monitor the performance of resources in the stack. These monitoring/metering services are used to trigger actions upon reaching a certain threshold. An example of this could be automatically launching a redundant web server behind a load balancer when the CPU load on the primary web server reaches above 90 percent.
The Heat component of OpenStack uses an authorization model composed of mainly two types:
Authorization based on OpenStack identity trusts
This process is known as Orchestration authorization.
In this type of authorization, a password is expected from the user. This password must match with the password stored in a database by the Heat engine in an encrypted form.
The following are the steps used to generate a username/password:
A request is made to the Heat engine for a token or an authorization password. Normally, the Heat command-line client or the dashboard is used.
The validation checks will fail if the stack contains any resources under deferred operations. If everything is normal, then a username/password is provided.
The username/password are stored in the database in encrypted form.
In some cases, the Heat engine, after obtaining the credentials, requests another token on the user's behalf, and thereafter, access to all the roles of the stack owner are provided.
Keystone trusts are extensions to OpenStack identity services that are used for enabling delegation of resources. The trustor and the trustee are the two delegates used in this method. The trustor is the user who delegates and the trustee is the user who is being delegated. The following information from the trustor is required by the identity service to delegate a trustee:
The creation of a stack via an API request step can be followed to execute a trust based authorization.
A token is used to create a trust between the stack owner (the trustor) and the Heat service user (also known as the trustee in this case). A special role is delegated. This role must be predefined in the
trusts_delegated_roles list inside the
By default, all the available roles for the trustor are set to be available for the trustee if it is not modified using a local RBAC policy.
This trust ID is stored in an encrypted form in the database. This trust ID is retrieved from the database when an operation is required.
Heat used to support the password-based authorization until the kilo version of OpenStack was released. Using the kilo version of OpenStack, the following changes can be made to enable trusts-based authorization in the Heat configuration file:
The default setting in
To be replaced for enabling trusts-based authentication:
The following parameters need to be set to specify trustor roles:
As mentioned earlier, all available roles for the trustor will be assigned to the trustee if no specific roles are mentioned in the
The Heat stack domain user is used to authorize a user to carry out certain operations inside a virtual machine.
Agents running inside virtual machine instances are provided with metadata. These agents repot and share the performance statistics of the VM on which they are running.
They use this metadata to apply any changes or some sort of configuration expressed in the metadata.
A signal is passed to the Heat engine when an event is completed successfully or with the failed status. A typical example can be to generate an alert when the installation of an application is completed on a specific virtual machine after its first reboot.
Heat provides features for encapsulating all the stack-defined users into a separate domain. This domain is usually created to store the information related to the Heat service. A domain admin is created, which is used by Heat for the management of the stack-domain users.
The following procedure is used to configure stack domain users:
A new domain is created using keystone (OpenStack Identity service). Usually, the domain name is set to Heat. This ID is configured in the
heat.conffile against the parameter
A new user is created using keystone with permissions to create and delete projects and users. This newly defined user must belong to the domain created in step 1.
The user created in step 2 (along with the password) is configured in
heat.confagainst the parameters:
This user is used to maintain the stack domain users on behalf of stack owners. As the
heat_domain_admin user is only allowed access to the Heat domain, the risk of unwanted access to other domains is limited.
The following are the commands and the steps necessary to set up domain users:
A domain is created using the following command:
$ openstack --os-identity-api-version=3 --os-auth-url http://192.168.5.38:35357/v3\ --os-username admin --os-password ADMIN --os-project-name admin domain create heat \ --description "Domain For HEAT Projects and Users"
$OS_TOKENrefers to a token that must be a valid token.
This will return a domain ID that will be referred to as
$HEAT_DOMAIN_IDin the next step.
Next, a user will be created within the domain created in step 1:
$ openstack user create heat_domain_admin \ --os-identity-api-version=3 \ --os-auth-url http://192.168.5.38:35357/v3 \ --os-username=admin --os-password=ADMIN \ --os-project-name=admin \ --domain heat \ --description "Admin for HEAT domain"\
This will return a domain admin ID, which will be used in the next step.
Next, the newly created user in step 2 is assigned the role of domain admin:
$ openstack role add admin \ --user heat_domain_admin \ --os-identity-api-version=3 \ --os-auth-url http://192.168.5.38:35357/v3 \ --os-username=admin \ --os-password=ADMIN \ --os-project-name=admin \ --domain heat
We'll get the output shown in the following screenshot for this command:
The information such as domain ID, username, and password is needed to be configured against the relevant parameters in
The following are the steps needed to create a sample stack:
If the stack contains any resources that require creation of a "stack domain user", then a new "stack domain project" in the "Heat" domain is created.
A new user is created under "stack domain project" by Heat if it is required. From an authentication perspective, this user is completely separate and also unrelated to the "stack owner's project."
While processing API requests, an internal lookup is made by Heat Orchestration to grant the required privileges to the user for both the stack owner's project as well as the stack domain project. These privileges are controlled by the
In this chapter, we learned about OpenStack, the open source cloud platform that offers IaaS features. OpenStack is made of several components, including Horizon (dashboard service), Nova (compute service), Neutron (networking service), Cinder (block storage service), Swift (object storage service), Glance (shared image service), Keystone (identify service), Ceilometer (telemetering service), Heat (Orchestration service), and Trove (database as a service). We also learned that Heat is the Orchestration service for OpenStack. We learned about the Heat authorization models, including password authorization, keystone trust authorization, and how these models work.