En este ejemplo vamos a desplegar la aplicación Wordpress, para ello será necesario realizar dos despliegues: uno para ejecutar los Pods que sirven la aplicación, y otro para desplegar la base de datos MySql necesaria para el funcionamiento. Veamos algunos aspectos antes de empezar:

  • Como hemos estudiado en los ejemplos vistos en este módulo, al crear el despliegue de MySql tendremos que configurar las siguientes variables de entorno:
    • MYSQL_ROOT_PASSWORD: Contraseña del usuario root de la base de datos.
    • MYSQL_DATABASE: El nombre de la base de datos que se va a crear.
    • MYSQL_USER: Nombre del usuario de la base de datos que se va carear.
    • MYSQL_PASSWORD: Contraseña de este usuario.
  • Si comprobamos la documentación de la imagen bitnami/wordpress en Docker Hub las variables de entorno que vamos a definir son las siguientes:
    • WORDPRESS_DATABASE_HOST: La dirección del servidor de base de datos.
    • WORDPRESS_DATABASE_USER: El usuario que se va a usar para acceder a la base de datos.
    • WORDPRESS_DATABASE_PASSWORD: La contraseña de dicho usuario.
    • WORDPRESS_DATABASE_NAME: El nombre de la base de datos a las que vamos a conectar para gestionar las tablas de Wordpress.
  • El valor de la variable WORDPRESS_DATABASE_HOST será el nombre del Service que creemos para acceder a la base de datos, como ya hemos estudiado, se creará un registro en el DNS del cluster que permitirá que Wordpress acceda a la base de datos usando el nombre del Service.
  • Los valores de las credenciales para el acceso a la base de datos, las vamos a guardar en dos recursos de nuestro cluster: los datos no sensibles (nombre de usuario y nombre de la base de datos) lo guardaremos en un ConfigMap y los datos sensibles, las contraseñas, la guardaremos en un Secret.

Creación y configuración del proyecto

Trabajamos con el usuario developer creando un nuevo proyecto, y configurándolo de manera adecuada para poder ejecutar Pods privilegiados.

oc new-project wordpress

oc login -u kubeadmin https://api.crc.testing:6443
oc adm policy add-scc-to-user anyuid -z default
oc login -u developer -p developer https://api.crc.testing:6443
...
Using project "wordpress".

Creación del ConfigMap y el Secret

oc create cm wordpress-cm --from-literal=bd_user=user_wordpress \
                           --from-literal=bd_name=wordpress

oc create secret generic wordpress-secret --from-literal=bd_password=password1234 \
                                           --from-literal=bd_rootpassword=root1234

Podríamos usar los ficheros con al definición de los recursos. El fichero configmap.yaml:

apiVersion: v1
kind: ConfigMap
metadata:
  name: wordpress-cm
data:
  bd_name: wordpress
  bd_user: user_wordpress

Y el fichero secret.yaml:

apiVersion: v1
kind: Secret
metadata:
  name: wordpress-secret
data:
  bd_password: cGFzc3dvcmQxMjM0
  bd_rootpassword: cm9vdDEyMzQ=

Y creamos los recursos ejecutando:

oc apply -f configmap.yaml
oc apply -f secret.yaml

Despliegue de la base de datos MySql

Utilizamos el fichero de despliegue mysql-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: wordpress
    type: database
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
        type: database
    spec:
      containers:
        - name: contenedor-mysql
          image: bitnami/mysql
          ports:
            - containerPort: 3306
              name: db-port
          env:
            - name: MYSQL_USER
              valueFrom:
                configMapKeyRef:
                  name: wordpress-cm
                  key: bd_user
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: wordpress-cm
                  key: bd_name
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress-secret
                  key: bd_password
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress-secret
                  key: bd_rootpassword

Y la definición del recurso Service, en el fichero mysql-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: wordpress
    type: database
spec:
  selector:
    app: wordpress
    type: database
  ports:
  - port: 3306
    targetPort: db-port
  type: ClusterIP

Creamos los dos recursos:

oc apply -f mysql-deployment.yaml
oc apply -f mysql-service.yaml

Despliegue de Wordpress

En este caso usaremos la definición del despliegue que tenemos en el fichero wordpress-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
    type: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
      type: frontend
  template:
    metadata:
      labels:
        app: wordpress
        type: frontend
    spec:
      containers:
        - name: contenedor-wordpress
          image: bitnami/wordpress
          ports:
            - containerPort: 8080
              name: http-port
            - containerPort: 443
              name: https-port
          env:
            - name: WORDPRESS_DATABASE_HOST
              value: mysql
            - name: WORDPRESS_DATABASE_NAME
              valueFrom:
                configMapKeyRef:
                  name: wordpress-cm
                  key: bd_name
            - name: WORDPRESS_DATABASE_USER
              valueFrom:
                configMapKeyRef:
                  name: wordpress-cm
                  key: bd_user
            - name: WORDPRESS_DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress-secret
                  key: bd_password
            

Y el Service definido en wordpress-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
    type: frontend
spec:
  selector:
    app: wordpress
    type: frontend
  ports:
  - name: http-sv-port
    port: 8080
    targetPort: http-port
  - name: https-sv-port
    port: 443
    targetPort: https-port
  type: ClusterIP

Ejecutamos:

oc apply -f wordpress-deployment.yaml
oc apply -f wordpress-service.yaml

Además como al despliegue de Wordpress necesitamos acceder desde el exterior, vamos a crear un recurso Route:

oc expose service/wordpress

Comprobaciones finales

Finalmente visualizamos todos los recursos que hemos creado:

oc get all
NAME                             READY   STATUS    RESTARTS   AGE
pod/mysql-547989d679-2ws9s       1/1     Running   0          90s
pod/wordpress-64bfd486d5-75l7v   1/1     Running   0          62s

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                               AGE
service/mysql               ClusterIP   172.30.221.14    <none>        3306/TCP                              82s
service/wordpress           ClusterIP   172.30.187.161   <none>        8080/TCP,443/TCP                      51s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql       1/1     1            1           90s
deployment.apps/wordpress   1/1     1            1           62s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-547989d679        1         1         1       90s
replicaset.apps/wordpress-64bfd486d5   1         1         1       62s

NAME                                 HOST/PORT                              PATH   SERVICES    PORT           TERMINATION   WILDCARD
route.route.openshift.io/wordpress   wordpress-wordpress.apps-crc.testing          wordpress   http-sv-port                 None

Y podemos acceder a la URL generada para que comprobar que el Wordpress está funcionando:

wp

Si accedemos a la consola web, podremos gestionar todos los recursos de la aplicación, por ejemplo en la topología tendremos la representación de los despliegues que hemos creado:

wp

Actualizado: