Contents
Introducción
En el panorama actual de la infraestructura como código y los despliegues automatizados, Kubernetes se ha consolidado como la plataforma de orquestación de contenedores más popular. Por su parte, WordPress sigue siendo el CMS (#1 en cuota de mercado) para la creación de sitios web y blogs. Integrar WordPress en Kubernetes aporta escalabilidad, tolerancia a fallos y despliegues continuos.
¿Por qué Kubernetes para WordPress
- Alta disponibilidad: reinicio automático de pods, self-healing.
- Escalado horizontal: aumentar o disminuir réplicas según demanda.
- Despliegues continuos: integración con CI/CD (Jenkins, GitLab CI, GitHub Actions).
- Gestión de configuraciones: ConfigMaps y Secrets para separar código de configuración.
- Portabilidad: despliegue en cualquier cloud o on-premise.
Arquitectura recomendada
Componentes clave
- Deployment de WordPress: define réplicas y actualizaciones.
- Service tipo LoadBalancer o ClusterIP Ingress.
- PersistentVolumeClaim (PVC) para almacenamiento de uploads y temas.
- MySQL/MariaDB como base de datos en un StatefulSet o como servicio gestionado.
- ConfigMap para wp-config.php o ajustes de plugins.
- Secret para credenciales de la BD y llaves de WordPress.
Requisitos previos
- Cluster Kubernetes 1.20 (minikube, kind, k3s, GKE, AKS o EKS).
- kubectl configurado y accesible.
- Helm 3.x (opcional, para chart de WordPress).
- Almacenamiento persistente: NFS, AWS EBS, Google Persistent Disk, Ceph, Portworx.
Instalación de la base de datos MySQL/MariaDB
A) Usando StatefulSet
Un StatefulSet garantiza identidades de red estables y volúmenes persistentes por réplica.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb
spec:
serviceName: mariadb
replicas: 1
selector:
matchLabels:
app: mariadb
template:
metadata:
labels:
app: mariadb
spec:
containers:
- name: mariadb
image: mariadb:10.5
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: root-password
ports:
- containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 10Gi
B) Chart oficial de Bitnami
Bitnami ofrece charts optimizados. Para instalar:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-mariadb bitnami/mariadb --set auth.rootPassword=
Despliegue de WordPress
A) Manual con Deployment y Service
Archivo wordpress-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 2
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:5.8-apache
env:
- name: WORDPRESS_DB_HOST
value: mariadb.default.svc.cluster.local:3306
- name: WORDPRESS_DB_USER
valueFrom:
secretKeyRef:
name: mariadb-secret
key: user
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mariadb-secret
key: password
ports:
- containerPort: 80
volumeMounts:
- name: wordpress-pvc
mountPath: /var/www/html
volumes:
- name: wordpress-pvc
persistentVolumeClaim:
claimName: wordpress-pvc
---
apiVersion: v1
kind: Service
metadata:
name: wordpress-svc
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
app: wordpress
B) Usando Helm Chart de Bitnami
Más rápido y configurable:
helm install my-wordpress bitnami/wordpress
--set mariadb.auth.rootPassword=
--set mariadb.auth.password=
--set wordpressUsername=admin
--set wordpressPassword=secretpassword
--set wordpressEmail=admin@example.com
--set service.type=LoadBalancer
Documentación oficial: Chart WordPress – Bitnami
Almacenamiento persistente (PVC)
StorageClass | Recomendado para | Requisito Cloud / On-prem |
---|---|---|
standard | Desarrollo / pruebas | GKE, AKS, EKS |
gp2 / io1 | Producción con EBS | AWS |
nfs-client | Compartido on-premise | Servidor NFS |
Gestión de Configuración y Secrets
ConfigMap para wp-config.php
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-config
data:
wp-config.php:
Montar en el Deployment:
volumeMounts:
- name: config
mountPath: /var/www/html/wp-config.php
subPath: wp-config.php
volumes:
- name: config
configMap:
name: wp-config
Secrets para credenciales
apiVersion: v1
kind: Secret
metadata:
name: mariadb-secret
type: Opaque
data:
root-password:
user:
password:
database:
Ingress y TLS
Para exponer HTTPS con cert-manager:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wordpress-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt
spec:
tls:
- hosts:
- www.ejemplo.com
secretName: tls-ejemplo-com
rules:
- host: www.ejemplo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wordpress-svc
port:
number: 80
Más info: Ingress – Kubernetes Docs
Escalado y Autoescalado
- Horizontal Pod Autoscaler (HPA): escala réplicas según CPU/memoria.
- Cluster Autoscaler: añade nodos al cluster cuando faltan recursos.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: wordpress-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: wordpress
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Monitoreo y Logging
- Prometheus Grafana: métricas de pods, nodos y MySQL.
- ELK Stack o Loki Grafana para logs de Apache y PHP.
Backup Restore
- Base de datos: usar
mysqldump
o herramientas nativas (Velero). - Volúmenes: snapshots de PV según cloud provider.
Velero: velero.io
Buenas prácticas de seguridad
- Escalar los contenedores con
runAsNonRoot
y PSP/OPA/Gatekeeper. - Usar Network Policies para aislar tráfico entre pods.
- Escanear imágenes con Trivy o Clair.
- Rotar credenciales periódicamente.
Conclusión
Desplegar WordPress en Kubernetes ofrece flexibilidad y robustez. Adoptando mejores prácticas en almacenamiento, configuración, seguridad y monitoreo, obtendrás una plataforma lista para producción con alta disponibilidad y escalabilidad automática. Para profundizar en cada tema, consulta la documentación oficial de Kubernetes y WordPress.
Fuentes fiables:
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |