Skip to main content

Lab 8.1 - NGINX Ingress Configuration

Lab Objectives​

By the end of this lab, you will be able to:

  • Install an NGINX Ingress Controller.
  • Understand the role of an Ingress Controller.
  • Create a basic Ingress resource.
  • Expose an application via Ingress.
  • Test access to the application via Ingress.

Estimated Duration​

45-60 minutes

Prerequisites​

  • kubectl installed and configured.
  • Functional local Kubernetes cluster (minikube or kind).
  • Knowledge of Ingress (Chapter 8.1 and 8.2).

Part 1: Installing the NGINX Ingress Controller​

Step 1.1: Enable Ingress on Minikube​

If you are using minikube, enable the Ingress addon:

minikube addons enable ingress

Verify that the Ingress Controller is installed:

kubectl get pods -n ingress-nginx

You should see Pods from the NGINX Ingress Controller.

Step 1.2: Manual Installation (Alternative)​

If you are not using minikube or for a manual installation, use:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml

Wait for the Pods to be ready:

kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=90s

Part 2: Deploying a Test Application​

Before configuring Ingress, let's deploy a simple application.

Step 2.1: Create a Deployment​

Create a file app-deployment.yaml:

# app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80

Apply the Deployment:

kubectl apply -f app-deployment.yaml

Step 2.2: Create a Service​

Create a file app-service.yaml:

# app-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
type: ClusterIP

Apply the Service:

kubectl apply -f app-service.yaml

Verify that the Service is created:

kubectl get svc web-app-service

Part 3: Creating an Ingress Resource​

Step 3.1: Create the Ingress​

Create a file ingress-basic.yaml:

# ingress-basic.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
spec:
ingressClassName: nginx # Specifies the Ingress Controller to use
rules:
- host: webapp.local # Hostname (for local, use this name or modify /etc/hosts)
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80

Explanation:

  • ingressClassName: nginx: Indicates to use the NGINX Ingress Controller.
  • host: webapp.local: The hostname to access the application.
  • path: /: All paths starting with /.
  • backend: The backend Service that handles the traffic.

Apply the Ingress:

kubectl apply -f ingress-basic.yaml

Step 3.2: Verify the Ingress​

Verify that the Ingress is created:

kubectl get ingress

Check the details:

kubectl describe ingress web-app-ingress

You should see the IP address of the Ingress Controller (on minikube, this may take a few seconds).


Part 4: Accessing the Application​

Step 4.1: Get the Ingress IP Address​

On minikube, get the IP:

minikube ip

Or check the Ingress:

kubectl get ingress web-app-ingress

Step 4.2: Configure the Hostname (Local)​

For a local cluster, you need to add the entry to /etc/hosts (Linux/Mac) or C:\Windows\System32\drivers\etc\hosts (Windows):

# On Linux/Mac, edit /etc/hosts
sudo nano /etc/hosts

# Add this line (replace <INGRESS_IP> with the Ingress IP):
<INGRESS_IP> webapp.local

On Windows, edit C:\Windows\System32\drivers\etc\hosts with administrator permissions.

Step 4.3: Test Access​

Test access to the application:

curl http://webapp.local

Or open http://webapp.local in your browser.

You should see the default NGINX page.

Step 4.4: Alternative with Port-Forward (Without Modifying /etc/hosts)​

If you do not want to modify /etc/hosts, use port-forward to the Ingress Controller:

# Find the name of the Ingress Controller Pod
INGRESS_POD=$(kubectl get pods -n ingress-nginx -l app.kubernetes.io/component=controller -o jsonpath='{.items[0].metadata.name}')

# Port-forward
kubectl port-forward -n ingress-nginx $INGRESS_POD 8080:80

Then test:

curl -H "Host: webapp.local" http://localhost:8080

Part 5: Checking the Logs​

Check the Ingress Controller logs to see the requests:

kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller --tail=20

You should see the incoming HTTP requests.


Part 6: Cleanup​

Delete the created resources:

kubectl delete ingress web-app-ingress
kubectl delete -f app-service.yaml
kubectl delete -f app-deployment.yaml

To disable Ingress on minikube:

minikube addons disable ingress

Lab Summary​

In this lab, you installed and configured an NGINX Ingress Controller, created a basic Ingress resource, and exposed an application via Ingress. You learned how to access the application via the configured hostname.


Next Steps​

The next lab will show you how to configure path-based routing to direct traffic to different applications.

Lab 8.2: Path-based Routing


Lab created: December 2024