254 lines
7.6 KiB
Markdown
254 lines
7.6 KiB
Markdown
# nginx-load-balancer - Mycelium Cloud LoadBalancer Website Example
|
|
|
|
Production-ready example for deploying a secure, globally accessible website on Mycelium Cloud using **LoadBalancer** services with automatic IPv6 assignment and traffic distribution.
|
|
|
|
## 🚀 Quick Start (One Command!)
|
|
|
|
**Deploy a production-ready LoadBalancer service:**
|
|
|
|
```bash
|
|
cd myceliumcloud-examples/examples/nginx-load-balancer
|
|
./deploy-and-test.sh
|
|
```
|
|
|
|
**What this script does:**
|
|
1. ✅ Deploy 3 nginx replicas (production-ready scaling)
|
|
2. ✅ Create LoadBalancer service with automatic IPv6
|
|
3. ✅ Configure hard worker node affinity (ensures pods on workers only)
|
|
4. ✅ Support both LoadBalancer IP and direct node access
|
|
5. ✅ Update website content with service information
|
|
6. ✅ Verify load balancing functionality
|
|
7. ✅ Show you the automatic IPv6 assignment
|
|
|
|
**Expected output:**
|
|
```
|
|
🎉 Deploy and Test Complete!
|
|
==================================
|
|
|
|
🌐 Access Information:
|
|
• Service URL: http://[auto-assigned-ipv6]:8080
|
|
• Load balancing: Active across 3 replicas
|
|
• Service type: LoadBalancer with IPv6
|
|
|
|
To access from a machine with Mycelium installed:
|
|
curl -6 "http://[ipv6]:8080/"
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 What This Example Teaches
|
|
|
|
- **LoadBalancer Services** - Production-grade service exposure
|
|
- **Automatic IPv6 Assignment** - Mycelium assigns IPv6 to service endpoints
|
|
- **Traffic Distribution** - Automatic load balancing across 3 replicas
|
|
- **Worker Node Preferences** - Deploy only on worker nodes (not masters)
|
|
- **Production Patterns** - Real-world scaling and reliability
|
|
- **Dual-Access Networking** - Both LoadBalancer IP and direct node access supported
|
|
|
|
---
|
|
|
|
## 📊 Architecture
|
|
|
|
```
|
|
User (with Mycelium)
|
|
↓
|
|
http://[mycelium-ipv6]:8080 (LoadBalancer Service)
|
|
↓
|
|
Kubernetes LoadBalancer Service (IPv4 + IPv6)
|
|
↓
|
|
Traffic distributed across 3 replicas
|
|
↓
|
|
Pod 1 ← Pod 2 ← Pod 3 (worker nodes)
|
|
↓
|
|
nginx → HTML (load balanced)
|
|
```
|
|
|
|
**Key Points:**
|
|
- Service type: **LoadBalancer** (not NodePort)
|
|
- IP families: **Dual-stack (IPv4 + IPv6)** ⭐ Critical
|
|
- Pod network: **Isolated** (no hostNetwork)
|
|
- Replicas: **3 by default** (production-ready)
|
|
- Traffic policy: **Local** (preserves source IP)
|
|
- IPv6: **Automatically assigned by Mycelium**
|
|
|
|
---
|
|
|
|
## ⚖️ LoadBalancer vs NodePort Comparison
|
|
|
|
| Feature | NodePort | LoadBalancer |
|
|
|---------|----------|--------------|
|
|
| **Access Method** | `http://[node-ipv6]:port` | `http://[service-ipv6]:port` |
|
|
| **IPv6 Assignment** | Manual (node IPv6) | Automatic (service IPv6) |
|
|
| **Load Balancing** | Manual (per node) | Automatic (per service) |
|
|
| **Traffic Distribution** | Via multiple NodePorts | Via single LoadBalancer |
|
|
| **Production Use** | Development/Testing | **Production Ready** |
|
|
| **Management** | Multiple URLs to manage | Single service endpoint |
|
|
| **Scalability** | Limited by node count | True service-level scaling |
|
|
|
|
**When to use each:**
|
|
- **NodePort**: Learning, development, testing
|
|
- **LoadBalancer**: Production, high availability, true scaling
|
|
|
|
---
|
|
|
|
## 🔧 Manual Deployment (Alternative)
|
|
|
|
If you want to do it step-by-step:
|
|
|
|
```bash
|
|
# 1. Deploy resources
|
|
kubectl apply -f nginx-load-balancer-configmaps.yaml
|
|
kubectl apply -f nginx-load-balancer-deployment.yaml
|
|
kubectl apply -f nginx-load-balancer-service.yaml
|
|
|
|
# 2. Wait for ready
|
|
kubectl wait --for=condition=ready pod -l app=nginx-load-balancer --timeout=90s
|
|
|
|
# 3. Update content
|
|
./update-content-load-balancer.sh
|
|
kubectl rollout restart deployment/nginx-load-balancer
|
|
|
|
# 4. Check service status
|
|
kubectl get svc nginx-load-balancer-service
|
|
|
|
# 5. Test load balancing
|
|
kubectl get pods -l app=nginx-load-balancer -o wide
|
|
```
|
|
|
|
---
|
|
|
|
## 🌍 Understanding LoadBalancer Behavior
|
|
|
|
### **Automatic IPv6 Assignment**
|
|
- Mycelium automatically assigns IPv6 address to the LoadBalancer service
|
|
- No manual IPv6 discovery needed
|
|
- Single endpoint for all traffic
|
|
- Service handles IPv6 assignment transparently
|
|
|
|
### **Load Balancing**
|
|
- **3 replicas** distributed across worker nodes
|
|
- Traffic automatically distributed by Kubernetes
|
|
- Failover and redundancy built-in
|
|
- True horizontal scaling capability
|
|
|
|
### **Production Features**
|
|
- Resource limits and requests
|
|
- Health checks (liveness + readiness)
|
|
- Worker node preferences
|
|
- Clean network isolation
|
|
|
|
---
|
|
|
|
## 📁 Files in This Directory
|
|
|
|
### Configuration
|
|
- `nginx-load-balancer-deployment.yaml` - 3-replica deployment
|
|
- `nginx-load-balancer-service.yaml` - LoadBalancer service (IPv4 + IPv6)
|
|
- `nginx-load-balancer-configmaps.yaml` - HTML content + nginx config
|
|
|
|
### Scripts
|
|
- `deploy-and-test.sh` - ⭐ **Main script** (deploy + test + verify)
|
|
- `update-content-load-balancer.sh` - Content updates for LoadBalancer
|
|
- `debug-networking.sh` - Network debugging tools
|
|
|
|
### Documentation
|
|
- `nginx-load-balancer.md` - This guide
|
|
- `PLAN.md` - Implementation details
|
|
|
|
---
|
|
|
|
## ✅ Success Indicators
|
|
|
|
**When working correctly:**
|
|
- ✅ Service type: `LoadBalancer`
|
|
- ✅ External IP: `[mycelium-ipv6]` (assigned automatically)
|
|
- ✅ IP families: `["IPv4","IPv6"]`
|
|
- ✅ Pod status: `Running` (3 replicas)
|
|
- ✅ Load balancing: Active across all replicas
|
|
|
|
**Check service status:**
|
|
```bash
|
|
kubectl get svc nginx-load-balancer-service
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Scaling and Management
|
|
|
|
### **Scale Replicas**
|
|
```bash
|
|
# Scale to 5 replicas
|
|
kubectl scale deployment nginx-load-balancer --replicas=5
|
|
|
|
# Scale down to 2 replicas
|
|
kubectl scale deployment nginx-load-balancer --replicas=2
|
|
```
|
|
|
|
### **Monitor Load Balancing**
|
|
```bash
|
|
# Check pod distribution
|
|
kubectl get pods -l app=nginx-load-balancer -o wide
|
|
|
|
# Monitor service status
|
|
kubectl get svc nginx-load-balancer-service -w
|
|
|
|
# Check load balancing behavior
|
|
kubectl get pods -l app=nginx-load-balancer
|
|
```
|
|
|
|
### **Update Content**
|
|
```bash
|
|
./update-content-load-balancer.sh
|
|
kubectl rollout restart deployment/nginx-load-balancer
|
|
```
|
|
|
|
---
|
|
|
|
## 🚨 Troubleshooting
|
|
|
|
**If LoadBalancer has no external IP:**
|
|
- Wait for Mycelium to assign IPv6 (may take 1-2 minutes)
|
|
- Check: `kubectl get svc nginx-load-balancer-service`
|
|
- Verify: `kubectl get pods -l app=nginx-load-balancer`
|
|
|
|
**If only 1 pod is running:**
|
|
- Check pod status: `kubectl get pods -l app=nginx-load-balancer`
|
|
- Review events: `kubectl describe deployment nginx-load-balancer`
|
|
- Check logs: `kubectl logs -l app=nginx-load-balancer`
|
|
|
|
**If load balancing doesn't work:**
|
|
- Verify all 3 pods are running
|
|
- Check service endpoints: `kubectl get endpoints nginx-load-balancer-service`
|
|
- Test individual pods: `kubectl exec -it [pod-name] -- curl -s localhost:8080`
|
|
|
|
---
|
|
|
|
## 🆘 Common Questions
|
|
|
|
**Q: How is LoadBalancer different from NodePort?**
|
|
A: LoadBalancer provides a single service endpoint with automatic IPv6 assignment, while NodePort requires accessing individual node IPv6 addresses.
|
|
|
|
**Q: Why 3 replicas by default?**
|
|
A: 3 replicas provide a good balance of resource usage and high availability for learning/demonstration purposes.
|
|
|
|
**Q: How do I know if load balancing is working?**
|
|
A: All 3 pods should respond to requests, and the service should distribute traffic between them automatically.
|
|
|
|
**Q: Can I use this in production?**
|
|
A: Yes! This follows production patterns with proper resource limits, health checks, and worker node preferences.
|
|
|
|
**Q: What if I need more replicas?**
|
|
A: Use `kubectl scale deployment nginx-load-balancer --replicas=5` or any number you need.
|
|
|
|
---
|
|
|
|
## 🎉 Success!
|
|
|
|
Once deployed, you'll have:
|
|
- ✅ **Production-ready** LoadBalancer service
|
|
- ✅ **Automatic IPv6** assignment from Mycelium
|
|
- ✅ **Load balancing** across 3 replicas
|
|
- ✅ **Global accessibility** via IPv6
|
|
- ✅ **High availability** with failover
|
|
|
|
**You're ready for production LoadBalancer deployments on Mycelium Cloud!** 🚀 |