Cómo instalar WordPress en Kubernetes en Linode

WordPress es conocido como una de las herramientas de blogs más populares. Utiliza una base de datos relacional para almacenar los contenidos: artículos, metadatos involucrados, mientras que PersistentVolume (PV) y PersistentVolumeClaim (PVC) almacenan datos de activos.

Este tutorial le mostrará la forma de instalar una única réplica de un sitio de WordPress utilizando la base de datos MySQL en Kubernetes en Linode.

Configurar un clúster de Kubernetes en Linode

Esta sección recorrerá todos los pasos para configurar un Kubernetes en linode.com. Primero, registremos una cuenta en Linode y luego inicie sesión en Linode Dashboard. Vaya al submenú de Kubernetes, luego haga clic en el botón ‘Agregar un clúster’ en la esquina superior derecha y complete el campo: Etiqueta de clúster, elija una región adecuada y elija la versión de Kubernetes.

Submenú de Kubernetes en el panel de Linode

Luego, agreguemos grupos de nodos para su clúster de Kubernetes. En este tutorial, configuraremos un clúster de 1 nodo con un plan ‘Dedicado de 4 GB’, el nodo tiene 4 GB de RAM, 2 CPU y 80 GB de almacenamiento.

Agregar grupos de nodosAgregar grupos de nodos

Por último, haga clic en “Crear clúster” para aprovisionar el clúster de Kubernetes.

Crear clústerCrear clúster

Esperando unos minutos, el clúster de Kubernetes se aprovisionó correctamente. Descarguemos el archivo Kubeconfig a su máquina local, para que pueda interactuar con el clúster cómodamente.

Descarga kubeconfigDescarga kubeconfig

En su máquina local, cree una carpeta llamada .kube en el directorio de inicio y mueva el archivo descargado a esa carpeta:

$ mkdir ~/.kube
$ mv wordpress-kubeconfig.yaml .kube/config

Además, debes instalar la herramienta kubectl:

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl
$ chmod +x kubectl
$ sudo mv kubectl /usr/local/bin

Ahora puede obtener la información de su clúster de Kubernetes ejecutando el siguiente comando:

$ kubectl get node

NAME STATUS ROLES AGE VERSION
lke11043-13758-5f73eca05dae Ready 5m v1.18.8

Crear PersistentVolume y PersistentVolumeClaim

Tanto WordPress como MySQL necesitan PersistentVolume (PV) para almacenar datos. PersistentVolume (PV) y PersistentVolumeClaim (PVC) son independientes del ciclo de vida del pod de la aplicación. Cuando reinicia, reprograma o elimina un Pod, el PV y el PVC aún permanecen y conservan los datos.

En primer lugar, proporcione un PersistentVolume (PV) y un PersistentVolumeClaim (PVC) lo reclamará. Crea el archivo de manifiesto llamado pvc-mysql-wp.yaml como sigue:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi

Usando el comando kubectl aplicar para crear el PV:

$ kubectl apply -f pvc-mysql-wp.yaml
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created

Verifique que los PV se aprovisionaron automáticamente después de crear PVC:

$ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-658d8d2da7a241bd 20Gi RWO Retain Bound default/wp-pv-claim linode-block-storage-retain 5m
pvc-ca93cd86df0d49c8 20Gi RWO Retain Bound default/mysql-pv-claim linode-block-storage-retain 5m1s

Crear contraseña para la base de datos MySQL

Kubernetes usa Secret para almacenar datos confidenciales como contraseñas o claves privadas.

Vamos a crear un archivo secret.yaml con su editor favorito de la siguiente manera:

apiVersion: v1
kind: Secret
metadata:
name: mysql-pass
type: Opaque
data:
password: yourpassword

Aplicar el manifiesto:

$ kubectl apply -f secret.yaml
secret/mysql-pass created

Verifique que el secreto se haya creado correctamente:

$ kubectl get secret
NAME TYPE DATA AGE
default-token-gcgp4 kubernetes.io/service-account-token 3 7h52m
mysql-pass Opaque 1 2m33s

Implementar MySQL

Puede utilizar el siguiente archivo de manifiesto para crear una implementación de instancia única de MySQL. El PersistentVolume se montará en / var / lib / mysql.

Vamos a crear un archivo mysql-deployment.yaml:

apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim

Luego, aplique el manifiesto anterior:

$ kubectl apply -f mysql-deployment.yaml
service/wordpress-mysql unchanged
deployment.apps/wordpress-mysql created

Verifique que el pod de MySQL se haya implementado correctamente:

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-mysql-57464b4779-vtjrf 1/1 Running 0 3m33s

Implementar WordPress

Puede utilizar el siguiente manifiesto para implementar WordPress en su clúster de Kubernetes. El PersistentVolume utilizado por el contenedor de WordPress se montará en / var / www / html.

El servicio wordpress tiene tipo LoadBalancer para poder acceder desde fuera del cluster.

Vamos a crear un archivo wordpress-deployment.yaml:

apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim

Ahora, ejecutemos el siguiente comando para implementar WordPress:

$ kubectl apply -f wordpress-deployment.yaml
service/wordpress created
deployment.apps/wordpress created

Verifique que WordPress esté funcionando:

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
wordpress-6857459697-wmgn9 1/1 Running 0 3m34s
wordpress-mysql-57464b4779-vtjrf 1/1 Running 0 32m

Verifique que todos los servicios se estén ejecutando:

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.128.0.1 443/TCP 12h
wordpress LoadBalancer 10.128.108.139 172.104.37.236 80:30567/TCP 5s
wordpress-mysql ClusterIP None 3306/TCP 29m

Ahora puedes acceder a la página de WordPress mediante la IP EXTERAL del servicio wordpress. Copiemos y peguemos en su navegador web:

Página de configuración de WordPressPágina de configuración de WordPress

Conclusión

WordPress es una herramienta de blogs realmente poderosa para cualquier creador de contenido y también para desarrolladores. Este tutorial ha pasado por todos los pasos para crear un clúster de Kubernetes en Linode y configurar la página de WordPress en él.

Gracias por leer y deje su sugerencia en la sección de comentarios a continuación.