En las siguientes semanas voy a publicar una serie de post sobre cómo ejecutar Wordpress en Kubernetes paso a paso, mayormente para comprender los principales elementos de Kubernetes y cómo interactúan.
En esta primera publicación vamos a hacer una aproximación bien simple. Tomaremos un docker-compose como base y convertirlo a menos en los diferentes yaml para que funcione en Kubernetes.
En mi caso voy a usar Docker Desktop sobre Windows.
Convertir Wordpress desde docker-compose a Kubernetes
A modo de ejercicio y para asentar conocimientos la idea es, a partir de un docker-compose, generar los yaml para desplegar Wordpress en Kubernetes. Lo iremos haciendo paso a paso, desde el enfoque más simple y llegar a un buen nivel de complejidad para cubrir gran parte de los conceptos de Kubernetes.
docker-compose actual
Este docker-compose es el que aparece en Docker hub de Wordpress y lo usaremos como base.
version:'3.1'services:wordpress:image:wordpressrestart:alwaysports:-8080:80environment:WORDPRESS_DB_HOST:dbWORDPRESS_DB_USER:exampleuserWORDPRESS_DB_PASSWORD:examplepassWORDPRESS_DB_NAME:exampledbvolumes:-wordpress:/var/www/htmldb:image:mysql:5.7restart:alwaysenvironment:MYSQL_DATABASE:exampledbMYSQL_USER:exampleuserMYSQL_PASSWORD:examplepassMYSQL_RANDOM_ROOT_PASSWORD:'1'volumes:-db:/var/lib/mysqlvolumes:wordpress:db:
Tiene dos servicios, Wordpress y MySQL, un par de volúmenes, uno para la base de datos y otro para los html de Wordpress, unas variables de entorno y algunos secrets (passwords)
Primer approach
Vamos a crear la versión más simple, para ello vamos a necesitar lo mínimo para que esto funcione en Kubernetes:
- Dos deployments:
- Worpress: for wordpress app
- MySQL: for mysql app
- Dos service:
- CluterIP: para exponer MySQL dentro del cluster y que Wordpress lo puede alcanzar
- Loadbalancer: para exponer Wordpress al mundo exterior y poder usarlo.
De momento no vamos a poner storage externo, ni configuraciones ni nada.
Deployment de wordpress
Lo único particular es que le pasamos las variables de entorno y el host de MySQL es mysql y el label app=my-wordpress
apiVersion:apps/v1kind:Deploymentmetadata:name:my-wordpresslabels:app:my-wordpressspec:replicas:1selector:matchLabels:app:my-wordpresstemplate:metadata:labels:app:my-wordpressspec:containers:-name:my-wordpressimage:wordpress:latestports:-containerPort:80env:-name:WORDPRESS_DB_PASSWORDvalue:"my-secret-pw"-name:WORDPRESS_DB_USERvalue:"my-user"-name:WORDPRESS_DB_NAMEvalue:"my-db"-name:WORDPRESS_DB_HOSTvalue:"mysql"
Deployment MySQL
Similar a Wordpress, un deployment, le pasamos las variables de entorno y en este caso el label app=my-db
apiVersion:apps/v1kind:Deploymentmetadata:name:my-dblabels:app:my-dbspec:replicas:1selector:matchLabels:app:my-dbtemplate:metadata:labels:app:my-dbspec:containers:-name:my-dbimage:mysql:5.7ports:-containerPort:80env:-name:MYSQL_ROOT_PASSWORDvalue:"my-secret-pw"-name:MYSQL_DATABASEvalue:"my-db"-name:MYSQL_USERvalue:"my-user"-name:MYSQL_PASSWORDvalue:"my-secret-pw"
Servicios
Tenemos Wordpress y MySQL funcionando, pero necesitamos crear dos servicios como ya dijimos Uno para que Wordpress puede alcanzar a MySQL (un ClusterIP porque sería un ciente interno del cluster) Y otro para acceder a Wordpress desde el exterior, un LoadBalancer.
apiVersion:v1kind:Servicemetadata:name:mysql## DNS name (cluster internal)labels:app:my-dbspec:type:ClusterIPselector:app:my-db# busca el deployment que tenga esa labelports:# puertos que va a escuchar-name:httpport:3306targetPort:3306-name:mysqlport:33060targetPort:33060
Con este ClusterIP ya podemos utilizar un port-forward para probar Wordpress
kubectlport-forwarddeployment/my-wordpress8080:80
Con portforward funciona, vamos a crear el LoadBalancer
apiVersion:v1kind:Servicemetadata:name:wordpress-loadbalancerspec:type:LoadBalancerselector:app:my-wordpress# Busca a partir del laberl app: my-wordpresports:-name:"80"port:8080targetPort:80
Y listo, con esto tenemos Wordpress en el puerto 8080 conectado a MySQL
Nos leemos la próxima para mejorar la persistencia