Cómo usar Kubernetes para WordPress

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

  1. Cluster Kubernetes 1.20 (minikube, kind, k3s, GKE, AKS o EKS).
  2. kubectl configurado y accesible.
  3. Helm 3.x (opcional, para chart de WordPress).
  4. 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 🙂



Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *