Expert Training in Kubernetes and Rancher

Note: Rancher has come a long way since this was first published in
June 2015. We’ve revised this post (as of August 2016) to reflect the
updates in our enterprise container management
service. Read on for the updated tutorial!

Rancher supports multiple orchestration engines for its managed
environments, including Kubernetes,
Mesos, Docker
Swarm, and Cattle (the default Rancher
managed environment). The Cattle environment is rich with features like
stacks, services, and load balancing, and in this post, we’ll highlight
common uses for these features. Overall, we’ll use Rancher and Docker
to build a highly available and scalable WordPress environment, then
we’ll cover how Rancher Catalog can be used to deploy complex stacks.

A scalable system is one that can handle an increasing number of requests
without any impact on the response time and performance. On the other
hand, High Availability describes a system that is continuously
operational for a given period of time; the components of a high
availability service often have failover components to continuously
operate under any circumstances. HA Deployment of WordPress
Wordpress is one of the most popular CMSs out there, and can be
configured with high availability and scalability by using specific
components including:

Shared storage for the application files:
GlusterFS[.]

Database Cluster backend: Percona XtraDB
Cluster[.]

Decoupled application Docker image.

Load Balancer to distribute requests to the application containers.

Preparing a Rancher Environment

When creating the Rancher instance, you can choose any infrastructure,
and any modern Linux distribution that supports Docker 1.10.3 (but
RancherOS, Ubuntu, RHEL/CentOS 7 are more heavily tested). Note that the
machine should have at least 1 GB of RAM. For this walkthrough, we are
going to use a 2 GB RAM machine to deploy the latest Rancher server
Docker container, using the following command:

# docker run -d -p 8080:8080 rancher/server:v1.1.1

Creating Docker Hosts

Rancher has the ability to create Docker machines at specific cloud
service providers -- here, we’re going to create three hosts on AWS by
clicking on ‘Add Hosts’, and selecting Amazon EC2. You’ll then need
to specify multiple options:

Access and Secret keys

Region and Subnet

Security Group: Rancher will automatically create
rancher-machine security groups for each machine, but you will need
to edit this to allow HTTP traffic and ports for other services

Name, Type and AMI for each instance (in our case, it will
be t1.small)

Quantity of servers

After a while, you’ll see your three hosts up and running:

Deploying the storage cluster

This section will describe how to setup a GlusterFS storage cluster.
Luckily, there’s already a Rancher Catalog template to help things
along. Choose the GlusterFS template from the community catalog:
Then set Volume Name to \“myvol\” and Gluster Networking Mode to
\“container:glusterfs:server\“, which will make GlusterFS accessible
through the Rancher-managed network:
A couple of minutes after clicking ‘Launch’, you should be able to
click over to the infrastructure tab, and see the containers up and
running:

Deploying the database cluster

Now it is time to create the database containers, which are running a
Percona XtraDB Cluster (PXC). As PXC needs at least three nodes for
quorum, you’ll be deploying three DB containers, each running on a
different Docker host for better availability and performance. PXC is
available as a catalog
template
as well - this template will ask for the root and SST passwords; there
are optional questions about your MySQL database name, user, and
password.
The Percona cluster should be ready after a few minutes. Now, the last
step to bring up the application is to run the WordPress service.

Deploying the WordPress and LB services

WordPress will be considered a stateless container, enabling you to
scale the service from 1 container to 1000 containers. All WordPress
containers will read and write from the GlusterFS storage cluster we
deployed earlier. The WordPress Docker image must be crafted to mount
the GlusterFS storage and then edit the WordPress config file
“wp-config.php” to point to the Percona XtraDB Cluster service. The
detailed Dockerfile for this Docker image can be found
here. To create
the WordPress service, add a new stack and insert the following into
docker-compose.yml and rancher-compose.yml:

The WordPress service has two external links to the PXC stack and
GlusterFS stack, and starts the container as a privileged container so
it is able to mount the GlusterFS volume. The environment variable,
DB_HOST, is the name of the PXC service, and GLUSTER_HOST will be the
name of the GlusterFS service that we created earlier. The
rancher-compose.yml describes the properties of the containers defined
in a Rancher environment. In this case, the WordPress service will be
scaled to 3 containers.
Now we can create the WordPress Load Balancers. Add a new stack and
define a Load Balancer service as follows: Name: wordpress-lb
Scale: Set to 3. These are deployed on all Docker hosts for the best
availability and performance. Target Service: Link this service to
the \“wp\” service Listeners: Enter 80/http for source port and map
it to 80/http target port
After setting up the LB service group, start it by clicking the Start
button. Congrats! At this point, you should have your HA WordPress
environment up and running.

Testing Scalability

If you need to scale up your environment to handle more traffic, you
simply click the + button for the Scale option on your WordPress service
group. Rancher will automatically handle container creation and add them
to the Load Balancers for you.
In this case we will scale up to 10 containers:
You can scale up and down as needed.

Testing HA Capabilities

Our WordPress environment will be reliable as long as the following
minimum conditions are met:

There is 1 WordPress container running.

There are 2 PXC containers running.

There is 1 Gluster container running, and

There is 1 wordpress-lb agent running.

To test this, let’s simulate the worst-case scenario:

Scale down WordPress to 1 container.

Scale down GlusterFS to 1 container.

Scale down the Load Balancer to 1 container.

Scale down the PXC to 2 containers.

Browse to your blog and you will see that it is still online, and you
can login on WordPress to enter your admin area.

Conclusion

Rancher has added a new service feature to make it easier to distribute
traffic across different Docker containers. Now you can scale up/down
your environments from Rancher UI in just one step, and Rancher will
automatically create new containers and add them to the appropriate Load
Balancers. This greatly simplifies the creation of highly available,
scalable, and distributable environments ready for production use. In
summary, we have deployed a WordPress installation with redundant
services for storage, database, web application, and Load Balancers. We
have also simulated common production failover/degradation scenarios and
proved that our setup is fault tolerant, as users won’t experience any
service disruption.