242 lines
7.2 KiB
Markdown
242 lines
7.2 KiB
Markdown
# nginx-nodeport - Mycelium Cloud NodePort Website Example
|
|
|
|
Complete, production-ready example for deploying a secure, globally accessible website on Mycelium Cloud using **NodePort** services with **worker node preference**.
|
|
|
|
## 🚀 Learn by Doing (Recommended!)
|
|
|
|
**This example is designed to teach you NodePort scaling step-by-step:**
|
|
|
|
### Step 1: Start with 1 Replica (Worker Node Only)
|
|
```bash
|
|
cd myceliumcloud-examples/examples/nginx-nodeport
|
|
./deploy-and-test.sh
|
|
```
|
|
|
|
**What happens:**
|
|
- ✅ Deploys 1 pod replica on a **worker node** (not master)
|
|
- ✅ Service accessible on 1 worker node only
|
|
- ✅ Easy to understand and test
|
|
- ✅ Shows you the single access URL
|
|
|
|
### Step 2: Scale to 3 Worker Replicas (Production Ready!)
|
|
```bash
|
|
# Scale to 3 replicas (all on worker nodes)
|
|
kubectl scale deployment nginx-nodeport --replicas=3
|
|
|
|
# Update content to show ALL accessible worker nodes
|
|
./update-content-many.sh
|
|
|
|
# Apply the changes
|
|
kubectl rollout restart deployment/nginx-nodeport
|
|
```
|
|
|
|
**What happens:**
|
|
- ✅ Service now accessible on 3 worker nodes
|
|
- ✅ Automatic load distribution across workers
|
|
- ✅ Shows you all 3 working URLs
|
|
- ✅ Perfect for production use
|
|
|
|
**Example 3-worker output:**
|
|
```
|
|
🌐 Access Information:
|
|
• URL 1: http://[437:9faf:1f1a:e2b1:ff0f:1fd9:7fd5:1095]:30091 (Worker Node)
|
|
• URL 2: http://[552:5984:2d97:72dc:ff0f:39ef:6ec:a48c]:30091 (Worker Node)
|
|
• URL 3: http://[5c3:a162:45ab:6c53:ff0f:8c55:36b0:24af]:30091 (Worker Node)
|
|
|
|
✅ All 3 worker replicas working! Anyone can access from anywhere with Mycelium!
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Learning Journey
|
|
|
|
1. **Start Simple**: Deploy 1 worker replica to understand the basics
|
|
2. **Scale Up**: Add 2 more worker replicas to see load distribution
|
|
3. **Production Ready**: Learn how externalTrafficPolicy: Local works on workers
|
|
4. **Global Access**: Understand Mycelium IPv6 networking from worker nodes
|
|
|
|
---
|
|
|
|
## 📚 Available Scripts
|
|
|
|
### 1. `deploy-and-test.sh` - **Start Here** ⭐
|
|
**Deploys 1 replica and shows you the basics**
|
|
|
|
```bash
|
|
./deploy-and-test.sh
|
|
```
|
|
|
|
Does everything: deploy 1 worker replica, test, configure, and show results.
|
|
|
|
### 2. `update-content-many.sh` - **For Multiple Worker Replicas** 🚀
|
|
**Updates content to show all worker replica URLs**
|
|
|
|
```bash
|
|
# After scaling to 3 worker replicas
|
|
./update-content-many.sh
|
|
kubectl rollout restart deployment/nginx-nodeport
|
|
```
|
|
|
|
This script properly handles multiple worker replicas and shows all accessible URLs.
|
|
|
|
### 3. `update-content-single.sh` - **For Single Worker Replica** 📝
|
|
**For single worker replica deployments** - updates content for 1 worker pod
|
|
|
|
### 4. `debug-networking.sh` - **Troubleshooting** 🔧
|
|
**Diagnose networking issues and verify all URLs are working**
|
|
|
|
```bash
|
|
./debug-networking.sh
|
|
```
|
|
|
|
Tests connectivity to all nodes and shows which URLs are working.
|
|
|
|
---
|
|
|
|
## 🔧 Manual Step-by-Step (Alternative)
|
|
|
|
If you want to do everything manually to learn the details:
|
|
|
|
```bash
|
|
# Step 1: Deploy resources
|
|
kubectl apply -f nginx-nodeport-configmaps.yaml
|
|
kubectl apply -f nginx-nodeport-deployment.yaml
|
|
kubectl apply -f nginx-nodeport-service.yaml
|
|
|
|
# Step 2: Wait for ready
|
|
kubectl wait --for=condition=ready pod -l app=nginx-nodeport --timeout=60s
|
|
|
|
# Step 3: Test 1 worker replica
|
|
curl -6 "http://[your-worker-node-ipv6]:30091/"
|
|
|
|
# Step 4: Scale to 3 worker replicas
|
|
kubectl scale deployment nginx-nodeport --replicas=3
|
|
|
|
# Step 5: Update content for all worker replicas
|
|
./update-content-many.sh
|
|
kubectl rollout restart deployment/nginx-nodeport
|
|
|
|
# Step 6: Verify all URLs work
|
|
./debug-networking.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Architecture
|
|
|
|
```
|
|
User (with Mycelium)
|
|
↓
|
|
http://[worker-node-mycelium-ipv6]:30091
|
|
↓
|
|
kube-proxy (dual-stack enabled)
|
|
↓
|
|
Kubernetes Service (IPv4 + IPv6)
|
|
↓
|
|
Pod (container port 8080) ← 1-3 pods on worker nodes only
|
|
↓
|
|
nginx → HTML
|
|
```
|
|
|
|
**Key Points:**
|
|
- Service type: **NodePort** (not LoadBalancer)
|
|
- IP families: **Dual-stack (IPv4 + IPv6)** ⭐ Critical
|
|
- Pod network: **Isolated** (no hostNetwork)
|
|
- Traffic policy: **Local** (preserves source IP)
|
|
- Port: **30091** (NodePort)
|
|
- Node preference: **Worker nodes only** (not master nodes)
|
|
- Replicas: **Start with 1, scale to 3 for production**
|
|
|
|
---
|
|
|
|
## 🌐 Understanding the Worker-Only Scaling
|
|
|
|
### 1 Worker Replica (Learning Phase)
|
|
- **Service accessible on**: 1 worker node (where pod runs)
|
|
- **URLs shown**: 1 URL
|
|
- **Use case**: Learning, testing, development
|
|
|
|
### 3 Worker Replicas (Production Phase)
|
|
- **Service accessible on**: 3 worker nodes (where pods run)
|
|
- **URLs shown**: 3 URLs
|
|
- **Use case**: Production, high availability, global access
|
|
- **Benefit**: Anyone can access from any of the 3 worker URLs
|
|
- **Architecture**: Keeps master nodes free for control plane operations
|
|
|
|
---
|
|
|
|
## 📁 Files in This Directory
|
|
|
|
### Configuration
|
|
- `nginx-nodeport-deployment.yaml` - Pod configuration (starts with 1 replica, worker-friendly)
|
|
- `nginx-nodeport-service.yaml` - NodePort service (dual-stack)
|
|
- `nginx-nodeport-configmaps.yaml` - HTML content + nginx config
|
|
|
|
### Scripts
|
|
- `deploy-and-test.sh` - ⭐ **Start here** (deploy 1 worker replica + test)
|
|
- `update-content-many.sh` - 🚀 **For scaling** (shows all worker replica URLs)
|
|
- `update-content-single.sh` - For single worker replica deployments
|
|
|
|
### Documentation
|
|
- `nginx-nodeport.md` - Complete technical guide
|
|
|
|
---
|
|
|
|
## ✅ Success Indicators
|
|
|
|
**1 Worker Replica (Working):**
|
|
- ✅ Service type: `NodePort`
|
|
- ✅ NodePort: `30091`
|
|
- ✅ IP families: `["IPv4","IPv6"]`
|
|
- ✅ Pod status: `Running`
|
|
- ✅ Node type: `Worker` (not Master)
|
|
- ✅ Test output: `✅ External Mycelium IPv6 connectivity is working!`
|
|
- ✅ Shows 1 accessible URL
|
|
|
|
**3 Worker Replicas (Production Ready):**
|
|
- ✅ All above indicators
|
|
- ✅ 3 pods running across 3 **worker nodes**
|
|
- ✅ Shows 3 accessible URLs
|
|
- ✅ All 3 worker URLs respond successfully
|
|
- ✅ Debug script confirms: `✅ HTTP connectivity: WORKING` for all
|
|
|
|
---
|
|
|
|
## 🚨 Prerequisites
|
|
|
|
1. **kubectl** installed and configured
|
|
2. **Mycelium Cloud cluster** with at least 1 worker node
|
|
3. **Mycelium installed** on your local machine (for testing)
|
|
4. **IPv6 connectivity** (Mycelium provides this)
|
|
|
|
---
|
|
|
|
## 🆘 Common Questions
|
|
|
|
**Q: Why start with 1 worker replica?**
|
|
A: It's easier to understand and debug. You can see exactly which worker node is serving the content.
|
|
|
|
**Q: Why only worker nodes?**
|
|
A: Production best practice - keep master nodes free for Kubernetes control plane operations.
|
|
|
|
**Q: Why scale to 3 worker replicas?**
|
|
A: This makes the service accessible from all 3 worker nodes, providing global availability and load distribution.
|
|
|
|
**Q: What does "externalTrafficPolicy: Local" do on workers?**
|
|
A: It ensures the service is only accessible on worker nodes where pods are running, preserving the source IP and improving performance.
|
|
|
|
**Q: How do I know if scaling worked?**
|
|
A: Use `update-content-many.sh` - it will show you all 3 accessible worker URLs.
|
|
---
|
|
|
|
|
|
## 🎉 Success!
|
|
|
|
Once you complete both steps, you'll have:
|
|
- ✅ **Learned** how NodePort scaling works on worker nodes
|
|
- ✅ **Deployed** a production-ready, multi-worker replica service
|
|
- ✅ **Understood** Mycelium IPv6 networking from workers
|
|
- ✅ **Tested** global accessibility from all worker nodes
|
|
- ✅ **Followed** production best practices (workers vs masters)
|
|
|
|
**You're now ready for production workloads on Mycelium Cloud!** 🚀 |