How to Setup Ingress Controller

How to Setup Ingress Controller: A Comprehensive Tutorial Introduction In modern cloud-native environments, managing external access to services running inside a Kubernetes cluster is vital. This is where an Ingress Controller plays a crucial role. An Ingress Controller is a specialized load balancer that routes external HTTP and HTTPS traffic to internal Kubernetes services based on defined rules

Nov 17, 2025 - 10:42
Nov 17, 2025 - 10:42
 0

How to Setup Ingress Controller: A Comprehensive Tutorial

Introduction

In modern cloud-native environments, managing external access to services running inside a Kubernetes cluster is vital. This is where an Ingress Controller plays a crucial role. An Ingress Controller is a specialized load balancer that routes external HTTP and HTTPS traffic to internal Kubernetes services based on defined rules. Setting up an Ingress Controller properly ensures seamless traffic management, enhanced security, and scalability of your applications.

This tutorial provides a detailed, step-by-step guide on how to setup an Ingress Controller. Whether you are a DevOps engineer, a system administrator, or a developer working with Kubernetes, this guide will help you understand the concept, implement it effectively, and follow best practices to optimize your environment.

Step-by-Step Guide

1. Prerequisites

Before setting up an Ingress Controller, ensure you have the following:

  • A running Kubernetes cluster (version 1.14+ recommended).
  • kubectl command-line tool configured to communicate with your cluster.
  • Basic knowledge of Kubernetes objects such as Services, Deployments, and Ingress.
  • Access to cluster admin privileges for installation.

2. Choose an Ingress Controller

Several Ingress Controllers exist, each with unique features and use cases. Popular options include:

  • Nginx Ingress Controller: Widely used, stable, and community-supported.
  • Traefik: Modern, dynamic, with built-in support for multiple protocols.
  • HAProxy Ingress: High performance with advanced load balancing.
  • Istio Ingress Gateway: Part of the Istio service mesh for advanced routing.

This tutorial focuses on the Nginx Ingress Controller due to its popularity and extensive documentation.

3. Install the Nginx Ingress Controller

Installing the Nginx Ingress Controller can be done using several methods, including Helm charts and raw manifests. The Helm-based installation is recommended for ease of management.

Step 3.1: Add the Helm Repository

First, add the official ingress-nginx Helm repository:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

helm repo update

Step 3.2: Install the Controller

Install the Nginx Ingress Controller into the ingress-nginx namespace:

kubectl create namespace ingress-nginx

helm install ingress-nginx ingress-nginx/ingress-nginx --namespace ingress-nginx

This command deploys the Ingress Controller with default settings suitable for most environments.

Step 3.3: Verify Installation

Check if the Ingress Controller pods are running:

kubectl get pods -n ingress-nginx

You should see pods with names starting with ingress-nginx-controller in the Running state.

4. Configure a Sample Application

Before creating Ingress rules, deploy a sample application to route traffic to:

Step 4.1: Deploy a Sample Application

Deploy a simple HTTP echo server:

kubectl create deployment http-echo --image=k8s.gcr.io/echoserver:1.10

kubectl expose deployment http-echo --port=8080

Step 4.2: Verify the Service

Ensure the service is running:

kubectl get svc

Locate the http-echo service and note its ClusterIP.

5. Create an Ingress Resource

An Ingress resource defines the routing rules that the Ingress Controller uses to direct traffic.

Step 5.1: Define an Ingress Manifest

Create a YAML file named http-echo-ingress.yaml with the following content:

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: http-echo-ingress

namespace: default

annotations:

nginx.ingress.kubernetes.io/rewrite-target: /

spec:

ingressClassName: nginx

rules:

- host: example.local

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: http-echo

port:

number: 8080

Step 5.2: Apply the Ingress

Apply the Ingress resource:

kubectl apply -f http-echo-ingress.yaml

Step 5.3: Update Local DNS or Hosts File

Since the host example.local is used in the Ingress rule, map this hostname to your Ingress Controller's external IP address. For local testing, update your /etc/hosts file:

<INGRESS_CONTROLLER_IP> example.local

Replace <INGRESS_CONTROLLER_IP> with the external IP of the Ingress Controller:

kubectl get svc -n ingress-nginx

Step 5.4: Test the Setup

Use curl or a web browser to access the application:

curl http://example.local

You should receive a response from the http-echo server, confirming the Ingress Controller is routing traffic properly.

6. Enable HTTPS with TLS

Securing your Ingress with TLS is essential for production environments.

Step 6.1: Create TLS Certificates

For demonstration, generate a self-signed certificate using OpenSSL:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \

-keyout tls.key -out tls.crt -subj "/CN=example.local/O=example.local"

Step 6.2: Create a TLS Secret

Create a Kubernetes secret to store the TLS certificate:

kubectl create secret tls example-tls --key tls.key --cert tls.crt

Step 6.3: Update the Ingress Resource

Edit the Ingress manifest to include TLS configuration:

spec:

tls:

- hosts:

- example.local

secretName: example-tls

ingressClassName: nginx

rules:

- host: example.local

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: http-echo

port:

number: 8080

Apply the updated manifest:

kubectl apply -f http-echo-ingress.yaml

Step 6.4: Test HTTPS Access

Access the application via HTTPS:

curl -k https://example.local

The -k flag allows curl to accept the self-signed certificate. In production, use certificates issued by a trusted CA.

Best Practices

1. Use Namespace Segmentation

Organize your applications into namespaces to isolate resources and apply Ingress rules selectively. This improves security and manageability.

2. Enable Health Checks and Readiness Probes

Ensure your services have proper health checks and readiness probes configured. The Ingress Controller relies on these to route traffic only to healthy pods.

3. Configure Rate Limiting and Security Headers

Leverage Ingress Controller annotations to add rate limiting, IP whitelisting, and security headers such as Strict-Transport-Security and Content-Security-Policy.

4. Monitor and Log Traffic

Enable access logging and integrate with centralized logging solutions to monitor Ingress traffic patterns and troubleshoot issues effectively.

5. Automate TLS Certificate Management

Use tools like cert-manager to automate the issuance and renewal of TLS certificates, reducing manual overhead and minimizing downtime.

6. Use IngressClass Properly

Define and use IngressClass resources to manage multiple Ingress Controllers in your cluster without conflict.

Tools and Resources

Official Documentation

Nginx Ingress Controller: https://kubernetes.github.io/ingress-nginx/

Cert-Manager for TLS Automation

https://cert-manager.io/

Kubernetes Networking Concepts

Kubernetes Ingress Documentation

Helm Package Manager

https://helm.sh/

Community Tutorials and Blogs

Explore community-driven tutorials on platforms like Medium, Dev.to, and GitHub for real-world use cases and advanced configurations.

Real Examples

Example 1: Multi-Service Ingress Routing

In a scenario where multiple services require external access, an Ingress can route traffic based on hostnames or paths.

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: multi-service-ingress

annotations:

nginx.ingress.kubernetes.io/rewrite-target: /

spec:

ingressClassName: nginx

rules:

- host: app1.example.com

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: app1-service

port:

number: 80

- host: app2.example.com

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: app2-service

port:

number: 80

This configuration allows two different applications to be served via the same Ingress Controller using distinct hostnames.

Example 2: Path-Based Routing

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: path-based-ingress

annotations:

nginx.ingress.kubernetes.io/rewrite-target: /

spec:

ingressClassName: nginx

rules:

- host: example.com

http:

paths:

- path: /service1

pathType: Prefix

backend:

service:

name: service1

port:

number: 80

- path: /service2

pathType: Prefix

backend:

service:

name: service2

port:

number: 80

This example illustrates routing to different backend services based on the path in the URL.

FAQs

What is the difference between an Ingress and an Ingress Controller?

An Ingress is a Kubernetes resource object that defines external access rules for services. An Ingress Controller is the actual implementation (usually a pod or set of pods) that reads Ingress resource information and manages the routing of traffic accordingly.

Can I run multiple Ingress Controllers in one Kubernetes cluster?

Yes, you can run multiple Ingress Controllers to support different types of traffic or applications. Use the IngressClass resource to distinguish which controller handles which Ingress resources.

How do I secure Ingress traffic?

Use TLS certificates to enable HTTPS. Automate certificate management with cert-manager and configure security headers and access controls via Ingress annotations.

What are common Ingress annotations?

Annotations vary by Ingress Controller but common examples for Nginx include:

  • nginx.ingress.kubernetes.io/rewrite-target – rewrite URL paths.
  • nginx.ingress.kubernetes.io/ssl-redirect – enable HTTPS redirection.
  • nginx.ingress.kubernetes.io/whitelist-source-range – restrict IP ranges.

How do I troubleshoot Ingress Controller issues?

Check the logs of the Ingress Controller pods, verify Ingress resource configurations, ensure services are healthy, and confirm DNS settings or host mappings are correct.

Conclusion

Setting up an Ingress Controller is an essential skill for managing external access to services in Kubernetes clusters. By following this tutorial, you can deploy a robust Nginx Ingress Controller, configure routing rules, secure traffic with TLS, and apply best practices to optimize performance and security.

Understanding how Ingress Controllers work and leveraging Kubernetes native resources empowers teams to build scalable, secure, and maintainable cloud-native applications. Continuously explore advanced configurations and integrate monitoring to ensure your Ingress infrastructure adapts to evolving needs effectively.