Introducción

En este taller vamos a ver cómo podemos desplegar aplicaciones parametrizadas en Kubernetes. Para ello, vamos a utilizar un ejemplo muy sencillo: una aplicación web que gestione las temperaturas de una localidad y el despliegue y acceso a Nextcloud.

Ejercicio 1: Configurando nuestra aplicación Temperaturas

Recordamos que el componente frontend hace peticiones al componente backend utilizando el nombre temperaturas-backend, que es el nombre que asignamos al Service ClusterIP para el acceso al backend.

Vamos a cambiar la configuración de la aplicación para indicar otro nombre.

Podemos configurar el nombre del servidor backend al que vamos acceder desde el frontend modificando la variable de entorno TEMP_SERVER a la hora de crear el despliegue del frontend.

Por defecto el valor de esa variable es:

TEMP_SERVER temperaturas-backend:5000

Vamos a modificar esta variable en el despliegue del frontend y cambiaremos el nombre del Service del backend para que coincidan, para ello realiza los siguientes pasos:

  1. Vamos a crear el recurso con los siguientes valores:
kubectl create cm temperaturas --from-literal=SERVIDOR_TEMPERATURAS=servidor-temperaturas:5000

Y verificamos que se ha creado correctamente:

kubectl get cm
kubectl describe cm temperaturas
  1. Creamos los ficheros necesarios para el despliegue de la aplicación:
  • frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: temperaturas-frontend
  labels:
    app: temperaturas
    tier: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: temperaturas
      tier: frontend
  template:
    metadata:
      labels:
        app: temperaturas
        tier: frontend
    spec:
      containers:
      - name: contenedor-temperaturas
        image: iesgn/temperaturas_frontend
        ports:
          - name: http-server
            containerPort: 3000
        env:
          - name: TEMP_SERVER
            valueFrom:
              configMapKeyRef:
                name: temperaturas
                key: SERVIDOR_TEMPERATURAS
  • frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: temperaturas-frontend
  labels:
    app: temperaturas
    tier: frontend
spec:
  type: NodePort
  ports:
  - port: 3000
    targetPort: http-server
  selector:
    app: temperaturas
    tier: frontend
  • backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: temperaturas-backend
  labels:
    app: temperaturas
    tier: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: temperaturas
      tier: backend
  template:
    metadata:
      labels:
        app: temperaturas
        tier: backend
    spec:
      containers:
        - name: contendor-servidor-temperaturas
          image: iesgn/temperaturas_backend
          ports:
            - name: api-server
              containerPort: 5000
  • backend-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: servidor-temperaturas
  labels:
    app: temperaturas
    tier: backend
spec:
  type: ClusterIP
  ports:
  - port: 5000
    targetPort: api-server
  selector:
    app: temperaturas
    tier: backend
  1. Y realizamos el despliegue de la aplicación:
kubectl apply -f .
kubectl get all
  1. Accedemos a la aplicación y verificamos que funciona correctamente:

Ejercicio 2: Desplegando Nextcloud

Vamos a realizar el despliegue de la aplicación NextCloud + MariaDB. Para ello ten en cuenta lo siguiente:

  • El despliegue de la base de datos se realizará con una imagen de MariaDB:10.5.

  • Las variables de entorno que se deben configurar son:

    • MYSQL_HOST: nombre del servicio que se creará para la base de datos.
    • MYSQL_DATABASE: nombre de la base de datos que se creará.
    • MYSQL_USER: nombre del usuario que se creará.
    • MYSQL_PASSWORD: contraseña del usuario que se creará.
  • Deberemos usar un recurso Secret para los datos sensibles y un COnfigMAp para el resto de variables de entorno.

Paso 1: Crear el recurso Secret

Para crear el recurso Secret, ejecuta el siguiente comando:

kubectl create cm bd-datos --from-literal=bd_user=nextcloud \
--from-literal=bd_dbname=nextcloud -o yaml --dry-run=client > bd_datos_configmap.yaml

kubectl create secret generic bd-passwords --from-literal=bd_password=nextcloud \
--from-literal=bd_rootpassword=nextcloud -o yaml --dry-run=client > bd_passwords_secret.yaml

Y los desplegamos:

kubectl apply -f bd_datos_configmap.yaml
kubectl apply -f bd_passwords_secret.yaml

Paso 2: Creamos el fichero de despliegue de la base de datos

Creamos el fichero de despliegue de la base de datos:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mariadb-deployment
  labels:
    app: nextcloud
    type: database
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextcloud
      type: database
  template:
    metadata:
      labels:
        app: nextcloud
        type: database
    spec:
      containers:
        - name: contenedor-mariadb
          image: mariadb:10.5
          ports:
            - containerPort: 3306
            name: db-port
          env:
            - name: MYSQL_USER
              valueFrom:
                configMapKeyRef:
                  name: bd-datos
                  key: bd_user
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: bd-datos
                  key: bd_dbname
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: bd-datos
                  key: bd_password
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: bd-datos
                  key: bd_root_password

Paso 3: Creamos el servicio de la base de datos

Creamos el servicio de la base de datos:

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

Paso 4: Creamos el despliegue de Nextcloud

Creamos el despliegue de Nextcloud:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextcloud-deployment
  labels:
    app: nextcloud
    type: frontend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextcloud
      type: frontend
  template:
    metadata:
      labels:
        app: nextcloud
        type: frontend
    spec:
      containers:
        - name: contenedor-nextcloud
          image: nextcloud:latest
          ports:
            - containerPort: 80
              name: http-port
            - containerPort: 443
              name: https-port
          env:
            - name: MYSQL_HOST
              value: mariadb-service
            - name: MYSQL_USER
              valueFrom:
                configMapKeyRef:
                  name: bd-datos
                  key: bd_user
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: bd-datos
                  key: bd_password
            - name: MYSQL_DATABASE
              valueFrom:
                configMapKeyRef:
                  name: bd-datos
                  key: bd_dbname

Paso 6: Creamos el servicio de Nextcloud

Creamos el servicio de Nextcloud:

apiVersion: v1
kind: Service
metadata:
  name: nextcloud-service
  labels:
    app: nextcloud
    type: frontend
spec:
  selector:
    app: nextcloud
    type: frontend
  ports:
    - name: http-sv-port
      port: 80
      targetPort: http-port
    - name: https-sv-port
      port: 443
      targetPort: https-port
    type: NodePort

Paso 7: Creamos el fichero ingress

Creamos el fichero ingress:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nextcloud-ingress
  labels:
    app: nextcloud
    type: frontend
spec:
  rules:
  - host: www.maria-nextcloud.org
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nextcloud-service
              port:
                number: http-sv-port

Paso 8: Desplegamos la aplicación

Desplegamos la aplicación:

kubectl apply -f .

Y comprobamos que están desplegados los servicios:

kubectl get all

Paso 9: Modificamos el fichero /etc/hosts

Modificamos el fichero /etc/hosts:

sudo nano /etc/hosts

Y añadimos la siguiente línea:

192.168.100.185 www.maria-nextcloud.org

Paso 10: Accedemos a la aplicación

Accedemos a la aplicación:

Introducimos las credenciales:

  • Usuario: nextcloud
  • Contraseña: bmV4dGNsb3Vk