How to Set Up Ingress On Kubernetes Using Nginx Controller

In this tutorial, you will learn how to setup Kubernetes ingress using Nginx ingress controller and to route traffic to deployments using wildcard DNS.

If you want to understand how Kubernetes ingress works, please read this blog post on Kubernetes Ingress Tutorial.

Here is an example architecture of Kubernetes ingress using Nginx ingress controller

kubernetes ingress architecture - Nginx ingress controller

Prerequisites:

  1. A Kuberntes cluster
  2. kubectl utility installed and authenticated to kubernetes cluster.
  3. Admin access to kubernetes cluster.
  4. A valid domain to point to ingress controller Load Balancer.

If you are on google cloud, assign admin permissions to your account to enable cluster roles.

Note: This tutorial was tried on google cloud GKE cluster. Logically it should work on all cloud environments. If at all you face any error, you might need to do some tweaks in the setup.

Setup Nginx Ingress Controller

There are two nginx ingress controllers.

  1. Nginx ingress controller by kubernetes community
  2. Nginx ingress controller by Nginx Inc

We will be using the Nginx controller from the kubernetes community.

Ingress controller needs a specific namespace, service account, cluster role bindings, configmaps etc. You can create all the kubernetes objects mentioned using the yaml file from official ingress repo.

Let’s deploy the ingress controller using mandatory.yaml file from the official repo. It has the consolidated list of kubernetes objects required for the Nginx controller.

You Might Like: Kubernetes Certification Tips

Lets create the Nginx controller deployment using kubectl.

Check the ingress controller pods to make sure if it is setup correctly.

Setup LoadBalancer Service For Ingress Controller

Next step is to create a service of Type Loadbalancer to expose the nginx controller deployment outside the cluster.

Step 1: Create a project directory locally and switch to that directory.

Step 2: Create a file named nginx-ingress.yaml

Step 3: Copy the following contents to the file.

Note: The annotations under the labels are very important for integrating with the nginx controller deployment.

Step 4: Create the ingress service.

Step 5: Check the created service if it is attached to the external load balancer.

Map a Domain Name To Loadbalancer IP

To make our ingress settings work, we need to map a domain name to the load balancer IP. You can do it in two ways.

Single DNS Mapping:

You can map single domain directly as a A record to the load balancer IP. Using this you can have only one domain for the ingress controller and multiple path based traffic routing.

For example,

You can have path based routing using this model.

Few examples,

Wildcard DNS Mapping:

If you map a wildcard DNS to the load balancer, you can have dynamic DNS end points through ingress.

For example,

This way you can have multiple dynamic subdomains through single ingress controller and each DNS can have its own path based routing.

For example,

For demo purposes, we have mapped a wildcard DNS to the LoadBalancer IP. Based on your DNS provider, you can do this setting.

Setup A Demo Application

For testing purposes, we will deploy a demo application and add a ClusterIp service to it.

Also Read: Kubernetes deployment tutorial´╗┐

Step 1: create a namespace named dev

Step 2: Create a file named hello-app.yaml

Step 3: Copy the following contents and save the file.

Step 4: Create the deployment using kubectl

Check the deployment status.

Step 5: Create a file named hello-app-service.yaml

Step 6: Copy the following contents and save the file.

Step 7: Create the service using kubectl.

Check the service status

Create Kubernetes Ingress Object

Now let’s create an ingress object to access our hello app using a DNS. An ingress object is nothing but a setup of routing rules.

If you are wondering how ingress object is connected to Nginx controller, the ingress controller pod connects to the Ingress API to check for rules and it updates its nginx.conf accordingly.

Step 1: Create a file named ingress.yaml

Step 2: Copy the following contents and save the file.

Replace test.apps.example.info with your domain name. Here the assumption is that you have a wildcard DNS in the format *.apps.example.info

Step 3: Describe created ingress object created to check the configurations.

Now if you try to access test.apps.example.info domain (replace it with your domain name), you should be able to access our sample app deployed.

Free DevOps Resources

Get DevOps news, tutorials and resources in your inbox. A perfect way If you want to get started with devops. Like you, we dont like spam.