18 KiB
Mycelium Cloud - WordPress Example
A complete, production-ready example for deploying a WordPress CMS with MariaDB database on Mycelium Cloud Kubernetes cluster. Features multi-container pod architecture, persistent storage, and comprehensive WordPress management patterns.
📁 What This Contains
This directory contains everything you need to deploy a WordPress CMS system:
- wordpress.md - This comprehensive guide
- wordpress-deployment.yaml - Multi-container pod deployment (WordPress + MariaDB)
- wordpress-service.yaml - LoadBalancer service configuration
- wordpress-configmap.yaml - WordPress configuration, Apache config, and initialization scripts
🚀 Quick Start (3 minutes)
# 1. Deploy WordPress stack (ConfigMaps, PVCs, Deployment, Service)
kubectl apply -f wordpress-configmap.yaml
kubectl apply -f wordpress-deployment.yaml
kubectl apply -f wordpress-service.yaml
# 2. Wait for pods to be ready
kubectl wait --for=condition=ready pod -l app=wordpress --timeout=300s
# 3. Access WordPress
kubectl port-forward service/wordpress-service 8080:80 &
# 4. Visit WordPress setup
echo "🌐 Visit: http://localhost:8080"
Expected Result: WordPress installation page will appear, ready for initial setup and configuration.
📋 What You'll Learn
- ✅ Advanced Kubernetes patterns (multi-container pods, init containers)
- ✅ WordPress deployment and configuration
- ✅ MariaDB database deployment with persistent storage
- ✅ ConfigMap usage for application configuration
- ✅ LoadBalancer services on Mycelium Cloud
- ✅ PersistentVolume claims for data persistence
- ✅ Init container patterns for database initialization
- ✅ Production WordPress management
- ✅ Resource limits and container orchestration
- ✅ Health checks for both web and database services
🏗️ Architecture
This example uses a multi-container pod pattern with persistent storage and init containers:
Network Flow:
kubectl port-forward → LoadBalancer Service → Pod (wordpress + mariadb)
Multi-Container Architecture:
- wordpress: WordPress 6.4 with PHP 8.2 and Apache (port 80)
- mariadb: MariaDB 10.11 database server (port 3306)
- init-mariadb: Init container for database setup
- init-wordpress: Init container for WordPress configuration
- PersistentVolumes: Database and WordPress content storage
🔧 Files Explanation
wordpress-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
# Worker node preference (like nginx-nodeport)
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: node-role.kubernetes.io/master
operator: DoesNotExist
containers:
- name: wordpress
image: wordpress:6.4-php8.2-apache
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: "localhost"
# ... WordPress environment variables
- name: mariadb
image: mariadb:10.11
ports:
- containerPort: 3306
env:
- name: MARIADB_ROOT_PASSWORD
value: "mycelium-root-password-2025"
# ... MariaDB environment variables
initContainers:
- name: init-mariadb
# Database initialization
- name: init-wordpress
# WordPress setup
What it does:
- Creates multi-container pod with WordPress + MariaDB
- ConfigMap mounts for configuration and initialization scripts
- PersistentVolume claims for database and content storage
- Init containers for database and WordPress setup
- Resource limits for both containers
- Worker node preference for production deployments
wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
spec:
selector:
app: wordpress
ports:
- name: wordpress
port: 80
targetPort: 80
type: LoadBalancer
ipFamilies:
- IPv4
- IPv6
ipFamilyPolicy: RequireDualStack
What it does:
- Creates LoadBalancer service for Mycelium Cloud
- Exposes WordPress port 80
- Dual-stack (IPv4 + IPv6) support
- Routes traffic to multi-container pod
wordpress-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
data:
wp-config.php: |
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'wordpress');
define('DB_PASSWORD', 'mycelium-secure-password-2025');
# ... WordPress configuration
wordpress.conf: |
<VirtualHost *:80>
# ... Apache configuration
init-wordpress.sh: |
#!/bin/bash
# WordPress initialization script
What it does:
- WordPress configuration (wp-config.php)
- Apache virtual host configuration
- Database initialization scripts
- WordPress setup automation
🌐 Access Methods
Method 1: Port-Forward (Recommended for Mycelium Cloud)
Option 1: Simple (Recommended)
# Keep terminal open, forward WordPress port
kubectl port-forward service/wordpress-service 8080:80
# Access WordPress setup
curl http://localhost:8080
Option 2: Background
# Start in background
nohup kubectl port-forward service/wordpress-service 8080:80 > wordpress-access.log 2>&1 &
# Access WordPress
curl http://localhost:8080
Method 2: Direct Pod Access (Inside Cluster)
WordPress CLI Access:
# Execute WordPress commands
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- wp --allow-root --info
# Access WordPress shell
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- /bin/bash
Database Access:
# Access MariaDB
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- mysql -u root -p"mycelium-root-password-2025"
# WordPress database access
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- mysql -u wordpress -p"mycelium-secure-password-2025" wordpress
Method 3: LoadBalancer IP Access (If Available)
# Get LoadBalancer IP (may be internal on Mycelium Cloud)
kubectl get svc wordpress-service
# Access WordPress (if external IP available)
curl http://<external-ip>:80
📊 WordPress Management
Initial Setup
- Visit WordPress Setup: http://localhost:8080
- Choose Language: Select your preferred language
- Site Configuration:
- Site Title: "Mycelium Cloud WordPress"
- Username: "admin" (or your choice)
- Password: Generate secure password
- Email: Your email address
- Complete Setup: WordPress will create database tables and configure
WordPress CLI Management
# Install WordPress CLI in pod
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
curl -O https://raw.githubusercontent.com/wp-cli/wp-cli/master/phar/wp-cli.phar && \
chmod +x wp-cli.phar
# Basic WordPress operations
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root --info
# List plugins
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root plugin list
# Install theme
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root theme install twentytwentyfour
Database Operations
# Access WordPress database
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysql -u wordpress -p"mycelium-secure-password-2025" wordpress -e "SHOW TABLES;"
# Check WordPress users
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysql -u wordpress -p"mycelium-secure-password-2025" wordpress -e "SELECT * FROM wp_users;"
# Database backup
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysqldump -u wordpress -p"mycelium-secure-password-2025" wordpress > wordpress-backup.sql
🔍 Troubleshooting
Check Deployment Status
# Check pods status (should show 2/2 Ready)
kubectl get pods -l app=wordpress
# Check service details
kubectl get svc wordpress-service
# Check PersistentVolumeClaims
kubectl get pvc wordpress-database-pvc wordpress-content-pvc
# Check ConfigMaps
kubectl get configmap wordpress-config wordpress-mariadb-config
Common Issues
Pod Not Starting
# Check pod status and events
kubectl describe pod -l app=wordpress
# Check container logs
kubectl logs -l app=wordpress
kubectl logs -l app=wordpress -c wordpress
kubectl logs -l app=wordpress -c mariadb --previous
Database Connection Issues
# Check MariaDB connectivity from WordPress container
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
mysqladmin ping -h localhost -u wordpress -p"mycelium-secure-password-2025"
# Test database access
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysql -u root -p"mycelium-root-password-2025" -e "SHOW DATABASES;"
WordPress Installation Issues
# Check WordPress configuration
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
cat /var/www/html/wp-config.php
# Check WordPress directory permissions
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
ls -la /var/www/html/
# Test WordPress initialization
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
/init-wordpress.sh
Persistent Volume Issues
# Check PVC status
kubectl describe pvc wordpress-database-pvc
kubectl describe pvc wordpress-content-pvc
# Check volume mount in containers
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
ls -la /var/lib/mysql/
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
ls -la /var/www/html/
Port Conflicts
# Check if port 8080 is in use
lsof -i :8080
# Check port 80 conflicts
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
netstat -tlnp | grep :80
🛠️ Common Operations
Scaling (Note: WordPress scaling is complex)
# Note: WordPress is typically single-instance due to file-based sessions
# For horizontal scaling, you'd need shared storage and session management
kubectl scale deployment wordpress --replicas=1
# Check distribution
kubectl get pods -o wide
Updates
# Update WordPress image
kubectl set image deployment/wordpress wordpress=wordpress:6.5-php8.2-apache
# Update MariaDB image
kubectl set image deployment/wordpress mariadb=mariadb:11.0
# Restart deployment
kubectl rollout restart deployment/wordpress
# Check rollout status
kubectl rollout status deployment/wordpress
Data Management
# Access WordPress database
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- mysql -u wordpress -p"mycelium-secure-password-2025" wordpress
# Common database operations inside pod:
# SHOW TABLES;
# DESCRIBE wp_posts;
# SELECT * FROM wp_options;
# FLUSH PRIVILEGES;
Monitoring
# View logs from both containers
kubectl logs -f deployment/wordpress
kubectl logs -f deployment/wordpress -c wordpress
kubectl logs -f deployment/wordpress -c mariadb
# Monitor resource usage
kubectl top pod -l app=wordpress
# Check database status
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysqladmin -u root -p"mycelium-root-password-2025" status
🧹 Cleanup
When you're done testing:
# Delete the application and service
kubectl delete -f wordpress-deployment.yaml -f wordpress-service.yaml -f wordpress-configmap.yaml
# Wait for cleanup
kubectl wait --for=delete pod -l app=wordpress --timeout=60s
# Kill any port-forwards
lsof -ti:8080 | xargs kill -9 2>/dev/null || true
# Verify cleanup
kubectl get all -l app=wordpress
kubectl get pvc wordpress-database-pvc wordpress-content-pvc 2>/dev/null || echo "PVCs deleted"
kubectl get configmap wordpress-config wordpress-mariadb-config 2>/dev/null || echo "ConfigMaps deleted"
🎯 What This Demonstrates
This example shows:
- Advanced Kubernetes patterns - multi-container pods, init containers, persistent volumes
- Production WordPress deployment - proper configuration, security, performance
- Database integration - MariaDB setup, persistent storage, initialization
- Mycelium Cloud networking - LoadBalancer services, port-forwarding, dual-stack
- Container orchestration - resource management, health monitoring, init containers
- Development workflows - testing, debugging, configuration management
- Production patterns - worker node preferences, scaling considerations
🔗 Next Steps
Once you understand this example, try:
- WordPress Clustering - Multiple WordPress instances with shared database
- Advanced Scaling - Load balancing, shared storage, session management
- WordPress Multisite - Multiple WordPress sites on one deployment
- Plugin Management - Automated plugin/theme deployment
- Backup Strategies - Database and file backups
- Security Hardening - SSL/TLS, security headers, access controls
- Performance Optimization - Caching, CDN integration
- Monitoring - WordPress performance and database monitoring
📚 More Examples
Other available examples:
- hello-world/ - Basic web application deployment
- nginx-static/ - Static website hosting
- python-flask/ - Python API server
- redis-cache/ - Data caching services
- nginx-nodeport/ - NodePort scaling with workers
💡 Pro Tips
- Multi-Container Access: Use
-c container-nameto access specific containers - Init Containers: Check init container logs for setup issues
- WordPress CLI: Great for automated WordPress management
- Database Backup: Always backup before major changes
- Resource Monitoring: Watch memory usage, especially during WordPress operations
- Network Testing: Use
kubectl execfor internal cluster testing - Background Services: Use
&to run multiple port-forwards - Persistent Storage: Verify PVC mounting for data persistence
🔧 WordPress-Specific Tips
Plugin Management
# List installed plugins
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root plugin list
# Install popular plugins
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root plugin install seo yoast-seo contact-form-7
Theme Management
# List installed themes
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root theme list
# Install and activate theme
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root theme install twentytwentyfour --activate
Content Management
# Create sample post
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c wordpress -- \
./wp-cli.phar --allow-root post create --post_type=post --post_title="Welcome to Mycelium Cloud WordPress" --post_content="This is a sample post deployed on Mycelium Cloud!" --post_status=publish
Database Maintenance
# Optimize database tables
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysql -u wordpress -p"mycelium-secure-password-2025" wordpress -e "OPTIMIZE TABLE wp_posts, wp_options;"
# Check database size
kubectl exec -it $(kubectl get pod -l app=wordpress -o jsonpath='{.items[0].metadata.name}') -c mariadb -- \
mysql -u wordpress -p"mycelium-secure-password-2025" wordpress -e "SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.tables WHERE table_schema = 'wordpress' GROUP BY table_schema;"
🎉 Success Indicators
You'll know everything is working when:
- ✅
kubectl get podsshows "2/2 Running" for wordpress pod - ✅
kubectl get svcshows wordpress-service with LoadBalancer type - ✅
kubectl get pvcshows both PVCs as "Bound" - ✅
curl http://localhost:8080returns WordPress installation page - ✅ Database initialization completes without errors
- ✅ WordPress setup wizard can be accessed and completed
- ✅ No errors in
kubectl get events
Congratulations! You've successfully deployed a production-ready WordPress CMS system on Mycelium Cloud! 🚀
🆘 Support
If you encounter issues:
- Check the troubleshooting section above
- Verify your kubeconfig is set correctly:
kubectl get nodes - Ensure your cluster is healthy:
kubectl get pods --all-namespaces - Check WordPress logs:
kubectl logs -l app=wordpress -c wordpress - Check MariaDB logs:
kubectl logs -l app=wordpress -c mariadb - Verify PersistentVolumeClaim status:
kubectl get pvc - Test WordPress functionality via browser at http://localhost:8080
For more help, visit our documentation or contact support.