What is Ingress?
An ingress is a Kubernetes API object that provides a simple way of describing HTTP and HTTPS routes from outside the cluster to services within the cluster and configure to give services externally reachable URLs.
Ingress manages the traffic in two routing methods over the k8s service.
- Host Based routing
- Path Based routing
Host based routing
It provides the facilities to send traffic based on respective hosts definition and performs routing by name and supports routing HTTP traffic to multiple host names at the same IP address but different domain names.
For example -
Path based routing
Here we don't have multiple domain names, all the URI is distinguished and routed from the PATH prefix under a single domain, for example the above applications can be accessed through the single URI.
For example -
In this case, we have a single domain
app.devtron.com and an ingress controller check the paths and according to that traffic sent to respective services and /frontend, /backend, /nodeapi are known as paths in ingress objects.
Why do we need an Ingress ?
Let’s assume, we have deployed a web application over k8s and want to access the application. For that, we can use the pod’s IP address or access it by its name like
http://name_of_pod/home within the k8s cluster. Now what if I want to access the application out of the cluster. To solve this challenge, Kubernetes has a component called service which does the traffic load balancing over replicas of your deployment and provides a single accessible endpoint for your application.
To access an application, there are 3 most commonly used service types, i.e. ClusterIP, NodePort and LoadBalancer. Each provides a different way of exposing the service and is useful in different situations.
- ClusterIP: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable within the cluster and it is the default service type.
- NodePort: Client is going to use the IP of nodes at certain port number at which the pod's service is running but this is not best practice to expose the application to the public world because here we might have security issues, loopholes and sometimes accessing the web application through an IP address can be annoying.
- LoadBalancer: When we use the service type as LoadBalancer, behind the scenes this managed k8s service connects to the load balancer service of the respective cloud provider and creates a Load balancer and maps to the k8s service. GKE and AKE provide the public IP of Load Balancer as service endpoint but in the case of EKS, provide the non customize DNS name.
If we want to access k8s service by custom host name or host path in that case, the role of Ingress, a k8s component comes into play.
Implementing an ingress for an application is a tedious job using the command line. In this blog we will walk through the steps to set up an ingress for an application over Kubernetes just in a few steps and all thanks to Devtron.
Prerequisites to setup ingress for an application
- Must have a k8s cluster - In our case, we have an AKS cluster
- Devtron installed on cluster - Feel free to checkout its well managed documentation for installing Devtron
- The source repo of application must have Dockerfile for the application.
Note: Setup the Global Configuration of Devtron after its installation.
Now before setting up an ingress we have to deploy the ingress controller to control the ingress rule. For that, we will be using Devtron to deploy the controller helm chart.
Deploy ingress controller helm chart
To deploy an ingress controller helm chart, you can follow the same steps mentioned in this blog. Click on
Charts store --> Select your chart
nginx-ingress/ingress-nginx, click on
Deploy. It will open the chart configs where you need give details of you chart and change the configs accordingly. Here are the configuration in chart we did in our case -
Once the chart is successfully deployed, you can see the
Healthy status of the ingress controller as shown below along with all other Kubernetes objects deployed with the chart.
Note: Here we have created a route 53 record which is pointing to Load Balancer, created by AKS and assigned to ingress-controller service.
Let's create an application with ingress and set up CI/CD using Devtron.
Click on Create New >> Click on Custom App
Give the details of application
Project and select the
Template if you have deployed any application before. Selecting a template allows us to copy the same configurations of an existing app but in our case we will create it from scratch.
After you click on Create App, it will redirect you to the App Configuration tab where you need to provide a few configurations to set up your application’s CI/CD.
Configure Git Repository
In Git Repository, select the Git Account (public is by default or for private repos, select the account added) and provide the git repo url of your application which needs to be deployed.
Configure Docker Build Config
In Docker Build Config select the container registry from drop down, provide the repository name and give a path to the Dockerfile of your application.
Configure Deployment Template
Devtron provides a pre installed deployment template consisting of all the important configuration required to deploy an application. Just change the configs as per your requirements and save the deployment template as shown below.
In our case we have changed the container port to 80 and configured the ingress as shown below -
Now after saving the deployment template, we need to create a CI-CD workflow. Devtron provides an awesome feature to configure the CI & CD pipeline of our applications which makes our life easy. For more details and advance configuration for creating workflow, please refer to its documentation
After all the Application configurations are done, we need to trigger our CI pipeline which would build an image and then trigger the CD pipeline, which would deploy the application. Navigate to the Build & Deploy tab, click on Select Material and select the commit for which you want to create an image. Once the CI part is done, click on Select Image and select the image you want to deploy.
Note:- We have 2 options to trigger our pipeline (manual and automatic).
Once your CI and CD succeed so you can see the status of pipeline as below
Now navigate to the App Details tab and you can see the status as Healthy and all the k8s workload in the dashboard. Devtron provides resource grouping of workloads which makes it really easy to check out the resources and debug in case of any issues.
To check out whether ingress has been created or not, you can see an ingress object under Networking → Ingress, and open the manifest as shown below to get the complete yaml of ingress object. Clearly we can see, it has created an ingress and added our host and path.
Open another tab and access the application by domain (myapp.devtron.info) with /app path you can see in the image below.
Hurray! Finally We have set up the ingress for an application through Devtron’s intuitive dashboard. Hope you get a better understanding on how to setup ingress and deploy applications as well as helm charts through Devtron and how easy it is. If you have any doubts, feel free to let us know through comments.