freeleaps-ops/docs/examples/ingress-example.yaml

266 lines
20 KiB
YAML
Raw Normal View History

2025-09-03 23:59:04 +00:00
# Enhanced Ingress Example with Detailed Comments
# This example shows how to expose your applications externally with SSL/TLS
#
# 🎯 What this does: Creates an Ingress that:
# - Routes traffic from external domains to your services
# - Automatically handles SSL/TLS certificates
# - Provides load balancing across multiple pods
# - Supports path-based routing (different URLs to different services)
# - Includes security features like rate limiting and CORS
# 📊 ASCII Diagram: How Ingress Works in Your Cluster
#
# ┌─────────────────────────────────────────────────────────────────────────────┐
# │ INTERNET │
# │ │
# │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
# │ │ Browser │ │ Mobile │ │ API │ │ Other │ │
# │ │ │ │ App │ │ Client │ │ Clients │ │
# │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
# │ │ │ │ │ │
# │ └────────────────┼───────────────┼───────────────┘ │
# │ │ │ │
# │ ▼ ▼ │
# │ ┌─────────────────────────────────────────────────────────────────────┐ │
# │ │ AZURE LOAD BALANCER │ │
# │ │ IP: 4.155.160.32 (prod-usw2-k8s-freeleaps-lb-fe-ip) │ │
# │ │ Port: 80/443 │ │
# │ └─────────────────────────────────────────────────────────────────────┘ │
# │ │ │
# │ ▼ │
# │ ┌─────────────────────────────────────────────────────────────────────┐ │
# │ │ NGINX INGRESS CONTROLLER │ │
# │ │ ┌─────────────────────────────────────────────────────────────┐ │ │
# │ │ │ Pod: ingress-nginx-controller-abc123 │ │ │
# │ │ │ IP: 10.0.1.100 Port: 80/443 │ │ │
# │ │ └─────────────────────────────────────────────────────────────┘ │ │
# │ └─────────────────────────────────────────────────────────────────────┘ │
# │ │ │
# │ ▼ │
# │ ┌─────────────────────────────────────────────────────────────────────┐ │
# │ │ INGRESS RULES │ │
# │ │ │ │
# │ │ argo.mathmast.com → argo-cd-server:80 │ │
# │ │ gitea.freeleaps.mathmast.com → gitea-http:3000 │ │
# │ │ magicleaps.mathmast.com → magicleaps-frontend-service:80 │ │
# │ │ alpha.magicleaps.mathmast.com → magicleaps-frontend-service:80 │ │
# │ │ │ │
# │ └─────────────────────────────────────────────────────────────────────┘ │
# │ │ │
# │ ▼ │
# │ ┌─────────────────────────────────────────────────────────────────────┐ │
# │ │ KUBERNETES SERVICES │ │
# │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
# │ │ │argo-cd-svc │ │gitea-http │ │magic-front │ │magic-api │ │ │
# │ │ │ClusterIP │ │ClusterIP │ │ClusterIP │ │ClusterIP │ │ │
# │ │ │10.0.1.10 │ │10.0.1.11 │ │10.0.1.12 │ │10.0.1.13 │ │ │
# │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
# │ └─────────────────────────────────────────────────────────────────────┘ │
# │ │ │
# │ ▼ │
# │ ┌─────────────────────────────────────────────────────────────────────┐ │
# │ │ APPLICATION PODS │ │
# │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
# │ │ │argo-cd-pod │ │gitea-pod │ │magic-front │ │magic-api │ │ │
# │ │ │10.0.1.101 │ │10.0.1.102 │ │10.0.1.103 │ │10.0.1.104 │ │ │
# │ │ │argo-cd:v2.8 │ │gitea:1.20 │ │nginx:latest │ │api:v1.2 │ │ │
# │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
# │ └─────────────────────────────────────────────────────────────────────┘ │
# └─────────────────────────────────────────────────────────────────────────────┘
#
# 🔄 Request Flow Example:
# 1. User visits: https://magicleaps.mathmast.com/
# 2. DNS resolves to Azure Load Balancer IP (4.155.160.32)
# 3. Load Balancer forwards to nginx-ingress-controller
# 4. Ingress controller checks rules:
# - Host: magicleaps.mathmast.com ✓
# - Path: / matches /* prefix ✓
# 5. Routes to magicleaps-frontend-service:80
# 6. Service load balances to magicleaps-frontend pods
# 7. Pod returns response through same path
# 🔐 SSL/TLS Certificate Flow:
# ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
# │ Browser │ │ Ingress │ │cert-manager │ │Let's Encrypt│
# │ │ │ Controller │ │ │ │ │
# └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
# │ │ │ │
# │ HTTPS Request │ │ │
# │───────────────▶│ │ │
# │ │ Check Cert │ │
# │ │───────────────▶│ │
# │ │ │ Request Cert │
# │ │ │───────────────▶│
# │ │ │ │ DNS Challenge
# │ │ │ │◀───────────────│
# │ │ │ Cert Ready │
# │ │ │◀───────────────│
# │ │ Cert Ready │ │
# │ │◀───────────────│ │
# │ HTTPS Response │ │ │
# │◀───────────────│ │ │
# 🏭 YOUR ACTUAL PRODUCTION SETUP
#
# Based on your codebase, here are your actual production values:
#
# Load Balancer IP: 4.155.160.32 (prod-usw2-k8s-freeleaps-lb-fe-ip)
#
# Current Applications:
# 1. ArgoCD: argo.mathmast.com → argo-cd-server:80 (freeleaps-devops-system)
# 2. Gitea: gitea.freeleaps.mathmast.com → gitea-http:3000 (freeleaps-prod)
# 3. Magicleaps Prod: magicleaps.mathmast.com → magicleaps-frontend-service:80 (magicleaps)
# 4. Magicleaps Alpha: alpha.magicleaps.mathmast.com → magicleaps-frontend-service:80 (magicleaps)
#
# Certificate Issuer: mathmast-dot-com (Let's Encrypt + GoDaddy DNS01)
# Ingress Controller: nginx-ingress-controller:v1.12.0 (freeleaps-controls-system)
#
# Commands to check your actual setup:
# kubectl get ingress --all-namespaces
# kubectl get certificates --all-namespaces
# kubectl get pods -n freeleaps-controls-system -l app.kubernetes.io/name=ingress-nginx
# curl -I http://4.155.160.32
# nslookup argo.mathmast.com
# nslookup gitea.freeleaps.mathmast.com
# nslookup magicleaps.mathmast.com
# 📚 EDUCATIONAL EXAMPLE BELOW
# This is a generic example for learning purposes. Your actual setup is above.
# Ingress for external access and routing
apiVersion: networking.k8s.io/v1 # ← Kubernetes API version for Ingress resources
kind: Ingress # ← Resource type: Ingress (external access layer)
metadata: # ← Metadata section: describes the ingress
name: web-app-ingress # ← Unique name for this ingress
namespace: my-app # ← Namespace where ingress will be created
labels: # ← Labels for organizing and selecting ingresses
app: web-app # ← Label: identifies this as a web application ingress
environment: production # ← Label: environment this runs in
annotations: # ← Annotations: configuration for ingress controller
# 🔧 Nginx Ingress Controller Annotations
# These tell the nginx-ingress-controller how to behave
nginx.ingress.kubernetes.io/rewrite-target: / # ← Rewrite URL paths (remove /api prefix)
nginx.ingress.kubernetes.io/ssl-redirect: "true" # ← Redirect HTTP to HTTPS
nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # ← Force HTTPS redirect
# 🔐 Cert-Manager Integration
# This tells cert-manager to automatically get SSL certificates
cert-manager.io/cluster-issuer: "letsencrypt-prod" # ← Use Let's Encrypt for certificates
# 🛡️ Rate Limiting
# Prevent abuse by limiting requests per time window
nginx.ingress.kubernetes.io/rate-limit: "100" # ← 100 requests per window
nginx.ingress.kubernetes.io/rate-limit-window: "1m" # ← 1 minute window
# 🌐 CORS (Cross-Origin Resource Sharing)
# Allow web browsers to make requests from different domains
nginx.ingress.kubernetes.io/enable-cors: "true" # ← Enable CORS
nginx.ingress.kubernetes.io/cors-allow-origin: "*" # ← Allow all origins (customize for production)
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS" # ← Allowed HTTP methods
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" # ← Allowed headers
# ⚡ Performance Optimizations
# These improve performance for your applications
nginx.ingress.kubernetes.io/proxy-body-size: "0" # ← No limit on request body size
nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # ← 10 minute read timeout
nginx.ingress.kubernetes.io/proxy-send-timeout: "600" # ← 10 minute send timeout
spec: # ← Specification: defines routing rules
# 🔐 TLS Configuration
# This defines SSL/TLS certificates for secure HTTPS connections
tls: # ← TLS (Transport Layer Security) configuration
- hosts: # ← List of hostnames this certificate covers
- myapp.example.com # ← Main application domain
- api.myapp.example.com # ← API subdomain
secretName: myapp-tls # ← Name of the secret containing the certificate
# cert-manager will automatically create this secret with the SSL certificate
# 🛣️ Routing Rules
# These define how traffic is routed to different services
rules: # ← List of routing rules
# Rule 1: Main application (myapp.example.com)
- host: myapp.example.com # ← Hostname to match (like a domain name)
http: # ← HTTP traffic configuration
paths: # ← List of URL paths and their destinations
# Path 1: Root path (/) → web application
- path: / # ← URL path to match (root path)
pathType: Prefix # ← How to match the path (Prefix = starts with)
backend: # ← Where to send the traffic
service: # ← Backend service configuration
name: web-app-service # ← Service name to route to
port: # ← Service port
number: 80 # ← Port number (80 = HTTP)
# Path 2: Static files (/static) → static file server
- path: /static # ← URL path to match (static files)
pathType: Prefix # ← Match paths starting with /static
backend: # ← Where to send the traffic
service: # ← Backend service configuration
name: static-service # ← Service name for static files
port: # ← Service port
number: 80 # ← Port number
# Rule 2: API subdomain (api.myapp.example.com)
- host: api.myapp.example.com # ← Different hostname for API
http: # ← HTTP traffic configuration
paths: # ← List of URL paths and their destinations
# Path 1: Root path (/) → main API service
- path: / # ← URL path to match (root path)
pathType: Prefix # ← How to match the path
backend: # ← Where to send the traffic
service: # ← Backend service configuration
name: api-service # ← Service name for main API
port: # ← Service port
number: 8080 # ← Port number (8080 = common API port)
# Path 2: Version 1 API (/v1) → v1 API service
- path: /v1 # ← URL path to match (v1 API)
pathType: Prefix # ← Match paths starting with /v1
backend: # ← Where to send the traffic
service: # ← Backend service configuration
name: api-v1-service # ← Service name for v1 API
port: # ← Service port
number: 8080 # ← Port number
# Path 3: Version 2 API (/v2) → v2 API service
- path: /v2 # ← URL path to match (v2 API)
pathType: Prefix # ← Match paths starting with /v2
backend: # ← Where to send the traffic
service: # ← Backend service configuration
name: api-v2-service # ← Service name for v2 API
port: # ← Service port
number: 8080 # ← Port number
# 🚀 How to use this:
# kubectl apply -f ingress-example.yaml
# kubectl get ingress # Check ingress status
# kubectl describe ingress web-app-ingress # See detailed ingress info
# kubectl get certificates # Check SSL certificate status
# curl -H "Host: myapp.example.com" http://your-cluster-ip/ # Test routing
# 📊 What happens when you apply this:
# 1. Kubernetes creates the Ingress resource
# 2. nginx-ingress-controller reads the Ingress and configures nginx
# 3. cert-manager sees the cert-manager.io/cluster-issuer annotation
# 4. cert-manager requests SSL certificate from Let's Encrypt
# 5. Let's Encrypt validates domain ownership via DNS challenge
# 6. Certificate is stored in Kubernetes secret
# 7. nginx-ingress-controller uses the certificate for HTTPS
# 8. Traffic flows: Internet → Load Balancer → nginx → Services → Pods
# 🔍 Your Current Setup Analysis:
# Based on your codebase, you're using:
# - nginx-ingress-controller in freeleaps-controls-system namespace
# - cert-manager with Let's Encrypt for SSL certificates
# - Custom ingress manager that automatically creates ingresses
# - Annotations for SSL redirect, rate limiting, and CORS
# - DNS-based certificate validation (DNS01 challenge)
# 📚 Learn more:
# - Ingress: https://kubernetes.io/docs/concepts/services-networking/ingress/
# - nginx-ingress: https://kubernetes.github.io/ingress-nginx/
# - cert-manager: https://cert-manager.io/docs/
# - SSL/TLS: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
# - Rate Limiting: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting
# - CORS: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#enable-cors