My whole career up to this point has been built around designing and developing applications for offline or isolated networks and working with severely outdated operating systems with no external dependencies allowed. So when I moved into a new role working on cloud deployments, I took it as an opportunity to learn cloud development and deployments. It didn't take me long to run into a bunch of headaches that comes with working on these platforms.
While searching for solutions and documentation on the various problems I've come across, I would often see references to OpenStack and it got my curiosity going. What is OpenStack? What services does it offer and who owns it? How do I learn to use it? What are it's costs and limitations?
Without going into too much history or detail, OpenStack is an open-source suite of tools and components that, when deployed together, can create your own dedicated cloud environment.
Just to clear this one up, think of a cloud as a virtual data warehouse of micro components.
When I think of servers hosting an application, I think of 3 levels of hosting resources:
Baremetal: (server blade pictured above) These can be monsters of machines costing hundreds of thousands of dollars. We're also pretty familiar with installing software or deploying applications on a computer, it's no different to these servers. The problem comes when you want to fully utilize the resources on these servers. You start deploying multiple software packages and applications, but then you realize that one application can access the resources of another application, or the dependencies of one application conflicts with the dependencies of another. This becomes a huge security and design headache.
Virtual Machine: These are "virtual" in the sense they are completely software-based, but still has the same resources and complexity a full desktop or server can hold. It's possible to install multiple Virtual Machines on a server and the applications installed on each are fully contained without conflicting or interacting with other applications. But because they replicate a full-sized machine, they also contain the same overhead of the operating system and dependencies of a Baremetal machine. Imagine an old laptop you want to use as a home server, it can barely run Windows 7, and you want to set up a second computer running within it at the same time?! Regardless how big your server is, you'll eventually reach a limit how many can be set up on one machine.
Container Systems like Docker and LXC were created to solve this size issue. These allow for bare minimum, "pre-baked" Operating System (OS) images (or installable OS images with all of the application dependencies and requirements pre-installed) without all of the extra resources that Virtual machines provide, enough to just do what it needs to do.
This starts giving way to having hundreds of containerized machines running independently of each other. They can work for a single task or work together to provide a large mesh of servers providing the resources for a single application.
When looking back to the scale of a baremetal, these containers only sip at the available resources allowing you to create new containers at any time. Because they're all software based, you can start and stop any number of them with the click of a button, they can be quickly duplicated to make up for a bottleneck in processing, and they can be all contained in one server, or across a whole warehouse of servers... thus the birth of the Cloud.
Orchestration technologies like Kubernetes were created to address the issues raised in deploying large deployments of these containers. They are helpful but can be cumbersome as you expand your applications to work across regions or to deployment stages, and they still have the overhead of the orchestration controller. Providers like Google, Amazon, Microsoft, IBM, SAP, ... provide support for these clustering orchestration tools, but they also expanded the idea to directly with each component and allow you to scale out any individual component for the immediate needs of your application, at the cost of platform lock-in. Sure they provide free/developer accounts, but there's always a limit. And on top of that, an application built on one platform doesn't necessarily mean it'll work on another platform without some MAJOR refactoring.
OpenStack offers a solution to all of these problems:
- Open-Source, which means anyone with the knowledge and resources available can install their own cloud platform.
- Designed from a standard, open framework. If you have an OpenStack application running with one provider and you need to move to another provider, no sweat! Just re-deploy using the new credentials and you're done.
- Because the cloud itself is fully scalable, the OpenStack team has created DevStack, a set of scripts that quickly sets up a mini cloud on whatever machine you install it on. No free trials, no restrictions, no time limits (except for the limits of your own hardware).
- Scale to any number of providers. You can have part of your application hosted on Vexxhost, expand storage to RackSpace, and scale out compute and redundancy using Auro. They can all be part of the same project and interact as if they were the same environment.
This last one is a big one. As the demands of your application grows, you can scale out globally without needing to worry if your provider has a data center in the area of highest demand. Just find a provider that hosts OpenStack and scale. And with that, it's potential to deploy something bigger than any one provider can offer.
THAT is the tricky bit. I've searched through their own repository of exercises, online training platforms, published books and found either everything was too technical for my newbie level, targeted towards System Administrators trying to get their RedHat Certified Systems Administrator (RHCSA) for OpenStack designation, or it was outdated and no longer relevant.
That's why I decided to start this series: a way for me to learn, practice, and fail while documenting what I find works for anyone else who's struggling for the same answers.
If this was enough to intrigue you, please follow me on my journey to learn app development on OpenStack. You should get notifications when updates and new posts are available.
As part of this exercise, I intend to create a web application that can be deployed to my local DevStack while learning about compute modules, block storage, event messaging, and networking.
I intend to build up my training through this series of posts as follows:
- Install and Configure DevStack
- Design Application and Create Support Components
- Create the Application VMs
- Develop the Code
- Deploy and Run
Hope you're as excited as I am to try this out and learn something new! And if you have experience and would like to contribute to this series, please reach out with suggestions!!