Cómo configurar WordPress con MySQL en Kubernetes usando Helm

Introducción

A medida que más desarrolladores trabajan en entornos distribuidos, herramientas como Kubernetes han llegado a ser cruciales para mantener la estandarización de los componentes de aplicaciones entre entornos de compilación y producción dinámicos. Con la creciente complejidad de los ecosistemas de aplicaciones, y el aumento de la popularidad de Kubernetes, las herramientas que ayudan a administrar recursos en Kubernetes se volvieron esenciales.

helm es un gestor de paquetes de código abierto para Kubernetes que simplifica el proceso de implementación y actualización de aplicaciones en un clúster de Kubernetes, y también proporciona una forma de encontrar y compartir aplicaciones listas para instalar que están empaquetadas como Gráficos de Kubernetes.

A lo largo de este tutorial, usaremos Helm para configurar WordPress sobre un clúster Kubernetes a fin de crear un sitio web de alta disponibilidad. Además de aprovechar la escalabilidad intrínseca y los aspectos de alta disponibilidad de Kubernetes, esta configuración permitirá preservar la seguridad de WordPress proporcionando flujos de trabajo simplificados de actualización y reversión a través de Helm.

Usaremos un servidor de MySQL externo para extraer el componente de la base de datos, ya que puede ser parte de un clúster o servicio gestionado independiente para mayor disponibilidad. Tras completar los pasos descritos en este tutorial, tendrá una instalación de WordPress completamente funcional en un entorno de clústeres en contenedores administrado por Kubernetes.

Requisitos previos

Para completar esta guía, necesitará lo siguiente:

  • Un clúster de Kubernetes 1.10, o una versión posterior, con control de acceso basado en roles (RBCA) activado.
  • La herramienta de línea de comandos kubectl instalada en su máquina o servidor de desarrollo local, configurada para conectarse a su clúster. Consulte la documentación oficial de Kubernetes para obtener instrucciones sobre cómo configurar esto.
  • El gestor de paquetes Helm instalado en su máquina o servidor de desarrollo local, y Tiller instalado en su clúster, como se explica en este tutorial: Cómo instalar software en clústeres de Kubernetes con el gestor de paquetes Helm.
  • Un servidor MySQL externo con acceso SSH y la contraseña de root de MySQL. Para configurar esto, puede seguir uno de nuestros tutoriales sobre MySQL. Por ejemplo, Cómo instalar MySQL en Ubuntu 18.04.

Antes de continuar, asegúrese de poder iniciar sesión en su servidor de MySQL y disponer de conectividad con su clúster de Kubernetes. En caso de que tenga configurados varios clústeres en su archivo de configuración kubectl, debe asegurarse de estar conectado al clúster correcto ejecutando el siguiente comando desde su máquina o servidor de desarrollo local:

  • kubectl config get-contexts

Este es un resultado de ejemplo:

Output CURRENT   NAME                        CLUSTER                     AUTHINFO                          NAMESPACE *         do-sfo2-wordpress-cluster   do-sfo2-wordpress-cluster   do-sfo2-wordpress-cluster-admin              minikube                    minikube                    minikube                                               

El signo asterisco (*) indica el clúster que actualmente representa el contexto predeterminado. En caso de que deba cambiar el contexto actual, ejecute:

  • kubectl config use-context context-name

Con esto, debería estar listo para seguir el resto de la guía.

Paso 1: Configurar MySQL

Primero, crearemos un usuario MySQL dedicado y una base de datos para WordPress a fin de permitir conexiones desde hosts externos. Esto es necesario porque nuestra instalación de WordPress residirá en un servidor independiente dentro del clúster de Kubernetes. En caso de que ya disponga de un usuario de MySQL dedicado y una base de datos configurados para WordPress, podrá continuar con el siguiente paso.

Desde el servidor de MySQL, inicie sesión en MySQL con el siguiente comando:

  • mysql -u root -p

Se le solicitará proporcionar la contraseña que configuró para la cuenta root de MySQL cuando instaló el software. Después de iniciar sesión, MySQL le proporcionará un mensaje de comando que puede usar para crear la base de datos y el usuario que necesitamos para WordPress.

Nota: Para este tutorial, crearemos una base de datos llamada wordpress y un usuario llamado wordpress_user, identificado por la contraseña password. Tenga en cuenta que estos son valores de ejemplo no seguros;** debería modificarlos** a lo largo de esta guía.

Para crear la base de datos, puede usar la siguiente instrucción:

  • CREATE DATABASE wordpress;

Ahora, crearemos un usuario de MySQL dedicado para esta base de datos:

  • CREATE USER wordpress_user IDENTIFIED BY 'password';

Se creó el usuario wordpress_user, pero aún no tiene permisos de acceso. El siguiente comando proporcionará a este usuario acceso de administrador (todos los privilegios) a la base de datos de wordpress desde redes locales y externas:

Para actualizar las tablas internas de MySQL que gestionan los permisos de acceso, utilice la siguiente instrucción:

  • FLUSH PRIVILEGES;

Ahora podrá cerrar el cliente de MySQL con lo siguiente:

  • exit;

Para comprobar que los cambios se realizaron correctamente, puede iniciar sesión en el cliente de línea de comandos de MySQL de nuevo, esta vez usando la nueva cuenta wordpress_user para la autenticación:

  • mysql -u wordpress_user -p

Debería usar la misma contraseña que proporcionó al crear este usuario MySQL con la declaración CREATE_USER. Para confirmar que su nuevo usuario tenga acceso a la base de datos wordpress, puede usar la siguiente instrucción:

  • show databases;

Se espera el siguiente resultado:

Output+--------------------+ | Database           | +--------------------+ | information_schema | | wordpress          | +--------------------+ 2 rows in set (0.03 sec) 

Después de confirmar que la base de datos wordpress esté incluida en los resultados, puede salir del cliente de línea de comandos de MySQL con lo siguiente:

  • exit;

Ahora, dispondrá de una base de datos de MySQL dedicada para WordPress y credenciales de acceso válidas para usarlas dentro de ella. Debido a que nuestra instalación de WordPress residirá en un servidor independiente, de todas formas necesitaremos editar nuestra configuración de MySQL para permitir conexiones provenientes de hosts externos.

Mientras se encuentre en su servidor MySQL, abra el archivo /etc/mysql/mysql.conf.d/mysqld.cnf usando el editor de línea de comandos que prefiera:

  • sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Busque el ajuste bind-address en este archivo. Por defecto, MySQL escucha solo en 127.0.0.1 (localhost). Para aceptar las conexiones desde hosts externos, debemos cambiar este valor a 0.0.0.0. Así es como debería quedar la configuración bind-address:

/etc/mysql/mysql.conf.d/mysqld.cnf

 # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address            = 0.0.0.0 

Cuando termine de realizar estos cambios, guarde y cierre el archivo. Deberá reiniciar MySQL con el siguiente comando:

  • sudo systemctl restart mysql

Para probar si puede establecer la conexión de manera remota, ejecute el siguiente comando desde su máquina o servidor de desarrollo local:

  • mysql -h mysql_server_ip -u wordpress_user -p

Recuerde cambiar mysql_server_ip por la dirección IP o el nombre de host de su servidor de MySQL. Si puede establecer conexión sin errores, estará listo para continuar con el siguiente paso.

Paso 2: Instalar WordPress

Ahora que tenemos la información necesaria para establecer conexión con la base de datos MySQL, podemos instalar WordPress usando Helm.

Por defecto, el gráfico de WordPress instala MariaDB en un pod separado dentro del clúster y lo utiliza como base de datos de WordPress. Nos convendrá deshabilitar este comportamiento y configurar WordPress para que utilice una base de datos de MySQL externa. Es posible ajustar esta y otras opciones de configuración (como el usuario de administración y la contraseña predeterminados de WordPress) en el momento de la instalación, ya sea a través de los parámetros de línea de comandos o mediante un archivo de configuración YAML independiente.

Para que todo esté organizado y se pueda extender de forma sencilla, usaremos un archivo de configuración.

Desde su máquina o servidor de desarrollo local, cree un nuevo directorio para los ajustes de su proyecto y diríjase a él:

  • mkdir myblog-settings
  • cd myblog-settings

A continuación, cree un archivo llamado values.yaml, usando el editor de texto que prefiera:

  • nano values.yaml

Dentro de este archivo, debemos configurar algunas variables que definirán la forma en que WordPress se conectará con la base de datos, así como algunas informaciones básicas sobre su sitio y el usuario de administración inicial para iniciar sesión en WordPress cuando la instalación se complete.

Basaremos nuestra configuración en el archivo predeterminado values.yaml del gráfico de Helm de WordPress. La sección _Información del blog _y del sitio contiene opciones generales para su blog de WordPress, como el nombre del blog y las credenciales de usuario iniciales. La sección Configuración de la base de datos de este archivo contiene los ajustes para la conexión con el servidor de MySQL remoto. MariaDB está desactivado en la sección final.

Copie el siguiente contenido a su archivo values.yaml y sustituya los valores resaltados por sus valores personalizados:

values.yaml

 ## Blog/Site Info wordpressUsername: sammy wordpressPassword: password wordpressEmail: [email protected] wordpressFirstName: Sammy wordpressLastName: the Shark wordpressBlogName: Sammy's Blog!  ## Database Settings externalDatabase:   host: mysql_server_ip   user: wordpress_user   password: password   database: wordpress  ## Disabling MariaDB mariadb:   enabled: false 

Acabamos de configurar las siguientes opciones:

  • wordpressUsername: nombre de usuario para iniciar sesión en WordPress.
  • wordpressPassword: contraseña del usuario de WordPress.
  • wordpressEmail: correo electrónico del usuario de WordPress.
  • wordpressFirstName: nombre del usuario de WordPress.
  • wordpressLastName: apellido del usuario de WordPress.
  • wordpressBlogName: nombre del sitio o blog.
  • host: dirección IP o nombre de host del servidor de MySQL.
  • user: usuario de MySQL.
  • password: contraseña de MySQL.
  • database: nombre de la base de datos de MySQL.

Cuando termine con la edición, guarde el archivo y cierre el editor.

Ahora que realizamos toda la configuración necesaria, es el momento de ejecutar helm para instalar WordPress. El siguiente comando indica a helm que instale la versión estable más reciente del gráfico de WordPress con el nombre myblog, usando values.yaml como archivo de configuración:

  • helm install --name myblog -f values.yaml stable/wordpress

El resultado debe ser similar al siguiente:

Output NAME:   myblog LAST DEPLOYED: Fri Jan 25 20:24:10 2019 NAMESPACE: default STATUS: DEPLOYED  RESOURCES: ==> v1/Deployment NAME              READY  UP-TO-DATE  AVAILABLE  AGE myblog-wordpress  0/1    1           0          1s  ==> v1/PersistentVolumeClaim NAME              STATUS   VOLUME            CAPACITY  ACCESS MODES  STORAGECLASS  AGE myblog-wordpress  Pending  do-block-storage  1s  ==> v1/Pod(related) NAME                               READY  STATUS   RESTARTS  AGE myblog-wordpress-5965f49485-8zfl7  0/1    Pending  0         1s  ==> v1/Secret NAME               TYPE    DATA  AGE myblog-externaldb  Opaque  1     1s myblog-wordpress   Opaque  1     1s  ==> v1/Service NAME              TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)                     AGE myblog-wordpress  LoadBalancer  10.245.144.79  <pending>    80:31403/TCP,443:30879/TCP  1s  (...) 

Una vez que la instalación finalice, se creará un servicio llamado myblog-wordpress en su clúster de Kubernetes, pero pueden transcurrir unos minutos hasta que el contenedor esté listo y la información de External-IP esté disponible. Para verificar el estado de este servicio y recuperar su dirección IP externa, ejecute lo siguiente:

  • kubectl get services

El resultado debe ser similar al siguiente:

Output NAME               TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE kubernetes         ClusterIP      10.245.0.1      <none>          443/TCP                      20h myblog-wordpress   LoadBalancer   10.245.144.79   203.0.113.110   80:31403/TCP,443:30879/TCP   3m40s  

Este comando le proporciona información detallada sobre los servicios que se ejecutan en su clúster, incluidos el nombre y el tipo del servicio, y las direcciones IP utilizadas por este. Como puede ver en el resultado, la instalación de WordPress se presenta como myblog-wordpress en la dirección IP externa 203.0.113.110.

Nota: En caso de que utilice minikube para probar esta configuración, deberá ejecutar minikube service myblog-wordpress para exponer el servidor web del contenedor de modo que pueda acceder a él desde su navegador.

De esta manera, su instalación de WordPress quedará en condiciones de funcionamiento. Para acceder a la interfaz de administración, utilice la dirección IP obtenida a partir del resultado de kubectl get services, seguida de /wp-admin en su navegador web:

http://203.0.113.110/wp-admin 

Pantalla de inicio de sesión

Debería usar las credenciales definidas en su archivo values.yaml para iniciar sesión y comenzar a configurar su sitio de WordPress.

Paso 3: Actualizar WordPress

Debido a su popularidad, WordPress es a menudo objetivo de usos malintencionados. Por ello, es importante mantenerlo actualizado. Podemos actualizar las versiones de Helm con el comando helm upgrade.

Para enumerar todas sus versiones actuales, ejecute el siguiente comando desde su computadora local o servidor de desarrollo:

  • helm list

El resultado deberá ser similar a este:

OutputNAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE myblog      1           Fri Jan 25 20:24:10 2019    DEPLOYED    wordpress-5.1.2   5.0.3     default    

Como puede ver en el resultado, nuestra versión actual de WordPress es la 5.0.3 (versión app), mientras que la versión del gráfico es la 5.1.2. Si desea actualizar a una versión más reciente de un gráfico, primero actualice sus repositorios de Helm con lo siguiente:

  • helm repo update

El siguiente resultado estará previsto:

OutputHang tight while we grab the latest from your chart repositories... ...Skip local chart repository ...Successfully got an update from the "stable" chart repository Update Complete. ⎈ Happy Helming!⎈ 

Ahora, podrá verificar si hay una versión más reciente del gráfico de WordPress disponible con lo siguiente:

  • helm inspect chart stable/wordpress

El resultado deberá ser similar a este:

OutputapiVersion: v1 appVersion: 5.1.1 description: Web publishing platform for building blogs and websites. engine: gotpl home: http://www.wordpress.com/ icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png keywords: - wordpress - cms - blog - http - web - application - php maintainers: - email: [email protected]   name: Bitnami name: wordpress sources: - https://github.com/bitnami/bitnami-docker-wordpress version: 5.9.0 

Como puede ver en el resultado, hay un nuevo gráfico disponible (versión 5.9.0) con WordPress 5.1.1 (versión app). Cuando desee actualizar su versión de WordPress al gráfico de WordPress más reciente, debería ejecutar lo siguiente:

  • helm upgrade -f values.yaml myblog stable/wordpress

Con este comando se generará un resultado muy similar al de helm install. Es importante proporcionar el mismo archivo de configuración que usamos al instalar el gráfico de WordPress por primera vez, ya que contiene los ajustes de la base de datos personal que definimos para nuestra configuración.

Ahora, si ejecuta helm list de nuevo, debería ver información actualizada sobre su versión:

Output NAME    REVISION    UPDATED                     STATUS      CHART           APP VERSION     NAMESPACE myblog  2           Fri May  3 14:51:20 2019    DEPLOYED    wordpress-5.9.0   5.1.1         default    

Con esto, habrá realizado de forma correcta la actualización de WordPress a la última versión del gráfico de WordPress.

Volver a una versión anterior

Cada vez que actualice una versión, Helm creará una nueva revisión de esta. Una revisión establece un punto de control fijo que podrá restablecer si no obtiene los resultados que espera. Es similar a una confirmación en Git, porque crea un historial de cambios que pueden compararse y revertirse. Si se produce algún error durante el proceso de actualización, siempre puede restablecer una revisión anterior de una versión de Helm concreta con el comando helm rollback:

  • helm rollback release-name revision-number

Por ejemplo, si queremos deshacer la actualización y restablecer nuestra primera versión de WordPress, lo haríamos así:

  • helm rollback myblog 1

Con esto, se restablecería la primera versión de la instalación de WordPress. Debería ver el siguiente resultado, lo cual indica que la reversión se realizó correctamente:

Output Rollback was a success! Happy Helming! 

Al ejecutar helm list de nuevo, se debería indicar que WordPress volvió a la versión 5.0.3, versión del gráfico 5.1.2:

Output NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE myblog      3       Mon Jan 28 22:02:42 2019    DEPLOYED    wordpress-5.1.2   5.0.3         default    

Observe que con el restablecimiento a una versión anterior se creará una nueva revisión, basada en la revisión de destino de la reversión. La revisión de nuestra versión de WordPress llamada myblog ahora tiene el número tres, que se basó en el número de revisión uno.

Conclusión

A lo largo de esta guía, instalamos WordPress con un servidor de MySQL externo en un clúster de Kubernetes usando la herramienta de línea de comandos de Helm. También aprendimos a actualizar una versión de WordPress a una nueva del gráfico, y a volver a una versión anterior si se produce un error durante la actualización.

Como pasos adicionales, podría considerar configurar Nginx Ingress con Cert-Manager para permitir alojamiento virtual basado en nombres y configurar un certificado SSL para su sitio de WordPress. También debería verificar los ajustes de producción recomendados para obtener información sobre gráfico de WordPress que usamos en esta guía.

Si desea obtener más información sobre Kubernetes y Helm, consulte la sección Kubernetes de la página de nuestra comunidad.