# Mycelium Cloud - Hello World Example A complete, standalone example for deploying a Hello World web application on Mycelium Cloud Kubernetes cluster. ## ๐Ÿ“ What This Contains This directory contains everything you need to deploy a simple web application: - **hello-world.md** - This guide - **hello-world-deployment.yaml** - Application deployment - **hello-world-service.yaml** - Service configuration - **src/** - Source files (optional, for customization) ## ๐Ÿš€ Quick Start (2 minutes) ```bash # 1. Deploy the application kubectl apply -f hello-world-deployment.yaml # 2. Create the service kubectl apply -f hello-world-service.yaml # 3. Access your app via port-forward **Option 1: Simple (Recommended)** ```bash # Keep terminal open, see connection logs (Ctrl+C to stop) kubectl port-forward service/hello-world-service 8080:8080 ``` **Option 2: Advanced (Background)** ```bash # Start in background nohup kubectl port-forward service/hello-world-service 8080:8080 > /dev/null 2>&1 & # Kill when done lsof -ti:8080 | xargs kill -9 ``` # 4. Visit http://localhost:8080 curl http://localhost:8080 ``` **Expected Result:** You'll see the Hello Kubernetes webpage with pod information. ## ๐Ÿ“‹ What You'll Learn - โœ… Basic Kubernetes deployment patterns - โœ… Service creation and networking - โœ… Port-forwarding for external access (Mycelium Cloud method) - โœ… Troubleshooting common issues - โœ… Resource management and cleanup ## ๐Ÿ—๏ธ Architecture This example uses a **two-file approach** for clean separation: 1. **hello-world-deployment.yaml** - Contains the Pod/Deployment logic 2. **hello-world-service.yaml** - Contains the networking configuration **Network Flow:** `kubectl port-forward โ†’ Service โ†’ Pod` ## ๐Ÿ”ง Files Explanation ### hello-world-deployment.yaml ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: hello-world spec: replicas: 1 selector: matchLabels: app: hello-world template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: paulbouwer/hello-kubernetes:1.10 ports: - containerPort: 8080 ``` **What it does:** - Creates 1 pod with the Hello Kubernetes web app - Uses image `paulbouwer/hello-kubernetes:1.10` - Exposes port 8080 ### hello-world-service.yaml ```yaml apiVersion: v1 kind: Service metadata: name: hello-world-service spec: selector: app: hello-world ports: - port: 8080 targetPort: 8080 type: LoadBalancer ``` **What it does:** - Creates a service to expose the app - LoadBalancer type (for Mycelium Cloud) - Routes traffic to pods with label `app: hello-world` ## ๐ŸŒ Access Methods ### Method 1: Port-Forward (Recommended for Mycelium Cloud) **Option 1: Simple (Recommended)** ```bash # Keep terminal open, see connection logs (Ctrl+C to stop) kubectl port-forward service/hello-world-service 8080:8080 # Access via browser or curl curl http://localhost:8080 ``` **Option 2: Advanced (Background)** ```bash # Start in background nohup kubectl port-forward service/hello-world-service 8080:8080 > /dev/null 2>&1 & # Access via browser or curl curl http://localhost:8080 ``` **Why this works in Mycelium Cloud:** - LoadBalancer external IPs are internal cluster addresses - Port-forward creates a local tunnel to the cluster - Most reliable method for external access ### Method 2: Local Port (Different Port) ```bash # Forward to a different local port kubectl port-forward service/hello-world-service 9000:8080 # Access at http://localhost:9000 curl http://localhost:9000 ``` ### Method 3: Development Mode (Foreground) ```bash # Keep terminal open, shows connection logs kubectl port-forward service/hello-world-service 8080:8080 ``` ## ๐Ÿ” Troubleshooting ### Check Deployment Status ```bash # Check if pods are running kubectl get pods -l app=hello-world # Check service details kubectl get svc hello-world-service # Check what's deployed kubectl get all -l app=hello-world ``` ### Common Issues #### Port Already in Use ```bash # Check what's using port 8080 lsof -i :8080 # Kill the process kill -9 $(lsof -ti:8080) ``` #### Pod Not Starting ```bash # Check pod status and events kubectl describe pod -l app=hello-world # Check pod logs kubectl logs -l app=hello-world ``` #### Service Not Accessible ```bash # Check service endpoints kubectl get endpoints hello-world-service # Test from within cluster kubectl run test-curl --rm -it --image=curlimages/curl:8.7.1 -- \ sh -lc 'curl http://hello-world-service:8080' ``` ## ๐Ÿ› ๏ธ Common Operations ### Scaling ```bash # Scale to 3 replicas kubectl scale deployment hello-world --replicas=3 # Check distribution kubectl get pods -o wide ``` ### Updates ```bash # Update to a new image kubectl set image deployment/hello-world hello-world=paulbouwer/hello-kubernetes:1.9 # Check rollout status kubectl rollout status deployment/hello-world ``` ### Viewing Logs ```bash # View logs from a specific pod kubectl logs deployment/hello-world # Follow logs in real-time kubectl logs -f deployment/hello-world ``` ## ๐Ÿงน Cleanup When you're done testing: ```bash # Delete the application and service kubectl delete -f hello-world-deployment.yaml -f hello-world-service.yaml # Kill any port-forwards lsof -ti:8080 | xargs kill -9 # Verify cleanup kubectl get all -l app=hello-world ``` ## ๐ŸŽฏ What This Demonstrates This example shows: - **Basic Kubernetes patterns** - deployments and services - **Mycelium Cloud networking** - port-forward access method - **Resource management** - creating, monitoring, and cleaning up - **Troubleshooting skills** - common issues and solutions - **Production readiness** - proper separation of concerns ## ๐Ÿ”— Next Steps Once you understand this example, try: 1. **Add ConfigMaps** - Add configuration to your app 2. **Use Secrets** - Store sensitive data 3. **Add Ingress** - Multiple applications, proper routing 4. **Resource Limits** - CPU and memory constraints 5. **Health Checks** - Readiness and liveness probes ## ๐Ÿ“š More Examples This is currently the only complete example. Future examples will include: - **python-server/** - Python HTTP servers with load balancing - **wordpress/** - WordPress deployment - **nextcloud/** - Nextcloud file sharing - **prometheus/** - Monitoring setup ## ๐Ÿ’ก Pro Tips 1. **Start Simple**: Begin with foreground port-forward (`kubectl port-forward`) 2. **Background Optional**: Use `nohup` only when you need persistent port-forwards 3. **Port Management**: Use `lsof -ti:PORT` to find and kill processes 4. **Resource Monitoring**: `kubectl get pods -o wide` shows pod distribution 5. **Quick Testing**: `curl -s http://localhost:8080` to verify app is working 6. **Clean State**: Always cleanup resources when done ## ๐ŸŽ‰ Success Indicators You'll know everything is working when: - โœ… `kubectl get pods` shows "Running" status - โœ… `kubectl get svc` shows service created - โœ… `curl http://localhost:8080` returns Hello Kubernetes webpage - โœ… No errors in `kubectl get events` **Congratulations! You've successfully deployed your first application on Mycelium Cloud! ๐Ÿš€** --- ## ๐Ÿ“– File Contents For reference, here are the complete file contents: ### hello-world-deployment.yaml [File contents would be here in the actual file] ### hello-world-service.yaml [File contents would be here in the actual file] ## ๐Ÿ†˜ Support If you encounter issues: 1. Check the troubleshooting section above 2. Verify your kubeconfig is set correctly: `kubectl get nodes` 3. Ensure your cluster is healthy: `kubectl get pods --all-namespaces` 4. Check the [Getting Started Guide](../../docs/getting-started.md) For more help, visit our [documentation](../../README.md) or contact support.