Data Centers

How to deploy NGINX on a Kubernetes cluster

Jack Wallen walks you through the process of deploying an NGINX container on a Kubernetes cluster.

kuberneteshero.jpg
Image: Jack Wallen

Kubernetes is one of the most powerful methods of deploying clusters for the management and deployment of containers. NGINX is one of the most popular web browsers on the planet, and also one of the best ways to illustrate how to deploy a container. Combine the two and you can enjoy a highly scalable web server, ready to help your business grow.

But how do you deploy that NGINX container on a Kubernetes cluster? I'm going to show you. A word of warning, I'm using an Antsle cloud server, which makes deploying the Kubernetes platform incredibly simple. The operating system hosting Kubernetes is Ubuntu Server 16.04. I will assume you already have Kubernetes up and running. For those that don't have an Antsle, and need to first install Kubernetes, check out how to here. For this demonstration, I'll be deploying on three virtual machines:

  • kubernetes at 192.168.1.190
  • kubernetes2 at 192.168.1.191
  • kubernetes3 at 192.168.1.192

The machine with hostname kubernetes will serve as my master, while kubernetes2/3 will serve as nodes.

With that out of the way, let's deploy.

Setting up hostnames

The first thing we have to do is map out hostnames on each machine. So for each machine, we'll issue the command sudo nano /etc/hosts and map the other machine's IP address to hostname. So on kubernetes, my hosts additions will be:

192.168.1.191 kubernetes2
192.168.1.192 kubernetes3

On kubernetes2, the additions will be:

192.168.1.190 kubernetes
192.168.1.192 kubernetes3

On kubernetes3, the additions will be:

192.168.1.190 kubernetes
192.168.1.191 kubernetes2

Once you've made the additions, save and close the file. Make sure you can ping each server, via hostname.

Initialize the master node

With everything in place, it's time to initialize the master node. Log into kubernetes (my master node) and issue the command:

sudo kubeadm init --pod-network-cidr=192.168.1.0/16 --apiserver-advertise-address=192.168.1.190

This command can take a minute or two to complete, as the necessary images might have to be pulled. Once it completes, you should see similar output shown in Figure A.

Figure A

Figure A

Our Master Node has been deployed.

Included with the output will be your token and discovery token. Make sure you copy those down (or just copy the entire join command), as you'll need that information to join the nodes to the cluster.

The next step is clearly outlined in the output of the initialization command. Effectively, you must issue the following commands:

mkdir -p ~/.kube
sudo cp -i /etc/kubernetes/admin.conf ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config

Once you've issued the above commands, check on the status of the nodes (there'll only be one at this point), with the command:

kubectl get nodes

You should see the master node listed (Figure B).

Figure B

Figure B

Our master node is listed.

The reason our Master Node is listed as not ready is because it has yet to have a Container Networking Interface (CNI). Let's deploy a Calico CNI for the master with the command:

sudo kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

Let's make sure Calico was deployed correctly with the command kubectl get pods —all-namespaces.

The output of the above command (Figure C) should show Calico running.

Figure C

Figure C

Calico is, in fact, now running.

Run kubectl get nodes again, and you should see the Master Node is now listed as Ready.

Adding nodes to the cluster

Next we head over to our nodes to add them to the cluster. Remember the join command in the output from the Master Node initialization command? Head over to kubernetes2 and issue that command, which will look something like this:

sudo kubeadm join --token 6779e1.164c5515cf412fdf 192.168.1.190:6443 --discovery-token-ca-cert-hash sha256:c3e413050e40675280bbf8e37a99c53a1481f82d714469b51b77ed17b38015de

Once that command completes, do the same on kubernetes3. After you've issued the join command on your nodes, go back to the Master Node and issue the command kubectl get nodes and you should see all nodes ready (Figure D).

Figure D

Figure D

All of our nodes are ready to work.

Deploy the NGINX container to the cluster

It's now time to deploy the NGINX container. From the master node, issue the command:

sudo kubectl create deployment nginx --image=nginx

Next we make the NGINX container available to the network with the command:

sudo kubectl create service nodeport nginx --tcp=80:80

Issue the command kubectl get svc to see your NGINX listing (as well as the assigned port, given by Kubernetes - Figure E)

Figure E

Figure E

Our NGINX service is running.

Let's test this with the command:

curl kubernetes3:30655

NOTE: The 30655 port was assigned during the create service command. It will be unique to your deployment.

The output of the curl command should display the HTML of the NGINX index.html page. If you see that, congratulations, your NGINX container has been deployed on your Kubernetes cluster. If you point a web browser to http://IP_OF_NODE:ASSIGNED_PORT (Where IP_OF_NODE is an IP address of one of your nodes and ASSIGNED_PORT is the port assigned during the create service command), you should see the NGINX Welcome page!

Basic deployment

What we've done is a very basic Kubernetes deployment of NGINX on a cluster. There is so much more to learn about using Kubernetes. This, however, should give you a good start as well as help you easily deploy NGINX on your Kubernetes cluster.

Also See

About Jack Wallen

Jack Wallen is an award-winning writer for TechRepublic and Linux.com. He’s an avid promoter of open source and the voice of The Android Expert. For more news about Jack Wallen, visit his website jackwallen.com.

Editor's Picks

Free Newsletters, In your Inbox