Modularización de GKACHELE SaaS

This commit is contained in:
gkachele
2026-01-17 11:40:17 +01:00
commit b6820848b8
1338 changed files with 339275 additions and 0 deletions

86
kubernetes/README.md Normal file
View File

@@ -0,0 +1,86 @@
# WordPress con Kubernetes
Ejemplo básico de WordPress desplegado en Kubernetes.
## 🚀 Requisitos
- Cluster de Kubernetes funcionando (minikube, kind, EKS, GKE, AKS, etc.)
- `kubectl` instalado y configurado
## 📦 Instalación
### 1. Aplicar los manifiestos
```bash
kubectl apply -f wordpress-deployment.yaml
```
### 2. Verificar el estado
```bash
# Ver los pods
kubectl get pods
# Ver los servicios
kubectl get services
# Ver los PVCs
kubectl get pvc
```
### 3. Acceder a WordPress
#### Con minikube:
```bash
minikube service wordpress-service
```
#### Con LoadBalancer (cloud):
```bash
kubectl get service wordpress-service
# Usa la IP externa del LoadBalancer
```
#### Con port-forward (desarrollo):
```bash
kubectl port-forward service/wordpress-service 8080:80
# Luego abre http://localhost:8080
```
## 🛠️ Comandos Útiles
### Ver logs
```bash
kubectl logs -f deployment/wordpress-deployment
kubectl logs -f deployment/mysql-deployment
```
### Escalar WordPress
```bash
kubectl scale deployment wordpress-deployment --replicas=3
```
### Eliminar todo
```bash
kubectl delete -f wordpress-deployment.yaml
```
### Ver detalles de un pod
```bash
kubectl describe pod <nombre-del-pod>
```
## 📝 Notas
- Los PersistentVolumeClaims requieren un StorageClass configurado en tu cluster
- En producción, usa un gestor de secretos (AWS Secrets Manager, HashiCorp Vault, etc.)
- Considera usar Ingress para manejar el tráfico HTTP/HTTPS
- Para alta disponibilidad, configura múltiples réplicas y un LoadBalancer
## 🔒 Seguridad
⚠️ **IMPORTANTE**: Este ejemplo usa Secrets en texto plano. En producción:
- Usa un gestor de secretos externo
- Implementa RBAC apropiado
- Configura NetworkPolicies
- Usa certificados SSL/TLS con Ingress

View File

@@ -0,0 +1,208 @@
---
# ConfigMap para configuración de WordPress
apiVersion: v1
kind: ConfigMap
metadata:
name: wordpress-config
labels:
app: wordpress
data:
WORDPRESS_DB_HOST: "mysql-service"
WORDPRESS_DB_NAME: "wordpress"
WORDPRESS_DB_USER: "wordpress"
---
# Secret para contraseñas (⚠️ En producción usar un gestor de secretos)
apiVersion: v1
kind: Secret
metadata:
name: wordpress-secret
labels:
app: wordpress
type: Opaque
stringData:
WORDPRESS_DB_PASSWORD: "wordpress_password"
MYSQL_ROOT_PASSWORD: "root_password"
MYSQL_PASSWORD: "wordpress_password"
---
# PersistentVolumeClaim para MySQL
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
# PersistentVolumeClaim para WordPress
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
# Deployment de MySQL
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: wordpress-config
key: WORDPRESS_DB_USER
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-secret
key: MYSQL_PASSWORD
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-secret
key: MYSQL_ROOT_PASSWORD
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
livenessProbe:
exec:
command:
- mysqladmin
- ping
- -h
- localhost
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- mysqladmin
- ping
- -h
- localhost
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
# Service para MySQL
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
clusterIP: None
---
# Deployment de WordPress
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-deployment
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
valueFrom:
configMapKeyRef:
name: wordpress-config
key: WORDPRESS_DB_HOST
- name: WORDPRESS_DB_NAME
valueFrom:
configMapKeyRef:
name: wordpress-config
key: WORDPRESS_DB_NAME
- name: WORDPRESS_DB_USER
valueFrom:
configMapKeyRef:
name: wordpress-config
key: WORDPRESS_DB_USER
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: wordpress-secret
key: WORDPRESS_DB_PASSWORD
volumeMounts:
- name: wordpress-storage
mountPath: /var/www/html
volumes:
- name: wordpress-storage
persistentVolumeClaim:
claimName: wordpress-pvc
---
# Service para WordPress
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
labels:
app: wordpress
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: wordpress