Skip to content

Ingress NGINX Module ​

What is This? ​

This module provides Helm values for deploying the NGINX Ingress Controller to Kubernetes. An ingress controller manages external access to services in your cluster, typically via HTTP/HTTPS.

When to Use This Module ​

  • Need to expose services to the internet
  • Want to use domain names instead of IP addresses
  • Need TLS/SSL termination
  • Require load balancing across multiple pods
  • Building web applications or APIs

What is an Ingress Controller? ​

An Ingress Controller:

  • Receives external traffic
  • Routes to services based on rules (hostname, path)
  • Terminates TLS/SSL
  • Provides load balancing
  • Acts as a reverse proxy

Without Ingress: Services need LoadBalancer type (one per service, expensive)

With Ingress: One LoadBalancer routes to many services (cost-effective)

How It Works ​

Internet
   │
   ▼
┌─────────────────────────────┐
│  LoadBalancer (GCP)         │
│  - Single external IP       │
└─────────────────────────────┘
   │
   ▼
┌─────────────────────────────┐
│  Ingress NGINX Controller  │
│  - Routes based on rules    │
│  - Terminates TLS           │
└─────────────────────────────┘
   │
   ├───► Service 1 (app.example.com)
   ├───► Service 2 (api.example.com)
   └───► Service 3 (admin.example.com)

Usage ​

Install Ingress NGINX ​

bash
# Add Helm repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update

# Install
helm install ingress-nginx ingress-nginx/ingress-nginx \
  -f modules/kubernetes/ingress-nginx/helm-values.yaml \
  -n ingress-nginx --create-namespace

Get External IP ​

bash
kubectl get service ingress-nginx-controller -n ingress-nginx
# Wait for EXTERNAL-IP to be assigned (may take 2-5 minutes)

Create an Ingress Resource ​

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: my-app
spec:
  ingressClassName: nginx
  rules:
  - host: my-app.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app-service
            port:
              number: 80

Apply it:

bash
kubectl apply -f ingress.yaml

Configuration Explained ​

LoadBalancer Service ​

yaml
service:
  type: LoadBalancer
  annotations:
    cloud.google.com/load-balancer-type: "External"

Creates a GCP Load Balancer with an external IP.

Resource Limits ​

yaml
resources:
  limits:
    cpu: 500m
    memory: 512Mi

Prevents the controller from consuming too many resources.

Pod Disruption Budget ​

yaml
podDisruptionBudget:
  enabled: true
  minAvailable: 1

Ensures at least one pod is always available during updates.

Metrics ​

yaml
metrics:
  enabled: true

Enables Prometheus metrics for monitoring.

Features ​

  • High Availability: 2 replicas by default
  • Auto-scaling: Can enable horizontal pod autoscaling
  • TLS Support: Automatic TLS with cert-manager
  • Metrics: Prometheus metrics enabled
  • Webhooks: Admission webhooks for validation

Common Use Cases ​

Expose Argo Workflows UI ​

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argo-workflows-ui
  namespace: argo
spec:
  ingressClassName: nginx
  rules:
  - host: argo.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argo-workflows-server
            port:
              number: 2746

Multiple Services ​

yaml
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: frontend
            port:
              number: 80
  - host: api.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: backend
            port:
              number: 8080

Requirements ​

  • Kubernetes Cluster: Version 1.19 or higher
  • Helm: Version 3.x
  • kubectl: Configured to access cluster
  • LoadBalancer Support: Cluster must support LoadBalancer services

Cost Considerations ​

  • LoadBalancer: ~$0.025/hour (GCP)
  • Data Processing: Standard egress charges
  • Controller Resources: Minimal (2 pods)

Tip: One ingress controller can handle many services, making it cost-effective.

Security Best Practices ​

  1. Use TLS: Always use HTTPS in production
  2. Restrict Access: Use firewall rules to limit source IPs
  3. Rate Limiting: Configure rate limits to prevent abuse
  4. WAF: Consider Web Application Firewall for production

Troubleshooting ​

External IP Not Assigned ​

bash
# Check service status
kubectl describe service ingress-nginx-controller -n ingress-nginx

# Check events
kubectl get events -n ingress-nginx --sort-by='.lastTimestamp'

# May take 2-5 minutes for GCP to provision

502 Bad Gateway ​

bash
# Check backend service
kubectl get svc <backend-service> -n <namespace>

# Check backend pods
kubectl get pods -n <namespace>

# Check ingress configuration
kubectl describe ingress <ingress-name> -n <namespace>

Cannot Access Service ​

bash
# Verify ingress rule
kubectl get ingress -A

# Check controller logs
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller

Learn More ​

  • argo-workflows - Often exposed via this ingress controller

Released under the MIT License.