Taller Kubernetes: Trabajando con Services

Ejercicio 1: Despliegue y acceso de la aplicación GuestBook

Una vez que tenemos creado el despliegue de la aplicación GuestBook, que realizamos en el anterior taller, vamos a crear los Services correspondientes para acceder a ella:

Service para acceder a la aplicación:

Vamos a crear un Service que nos va a permitir acceder a la aplicación GuestBook desde el exterior, para ello crea un fichero yaml con la definición del Service a partir de la siguiente plantilla:

apiVersion: v1
kind: Service
metadata:
  name: guestbook
  labels:
    app: guestbook
    tier: frontend
spec:
    type:
    ports:
    - port:
      targetPort:
    selector:
        app: guestbook
        tier: frontend
  • Lanzamos el servicio con el comando kubectl create -f guestbook-service.yaml y comprobamos que se ha creado correctamente con el comando kubectl get all.

1

  • Accedemos a la ip del nodo master y al puerto asignado desde un navegador web para ver la aplicación.

2

Pero claro, no funciona, ¿por qué? Porque la aplicación guestbook necesita conectarse a la base de datos redis, y no la encuentra. Para ello vamos a crear el Service para acceder a la base de datos. De esta forma, conectaremos el frontend con el backend, donde este último será de tipo ClusterIP.

Service para acceder a la base de datos:

A continuación vamos a crear el Service para acceder a la base de datos. Vamos a crear el fichero yaml. Tenemos que poner el tipo del Service, el puerto del servicio será el 6379 y el nombre del puerto de la base de datos que hemos asignado en el Deployment es redis-server. Nota: No cambies el nombre del Service, ya que la aplicación guestbook va a acceder por defecto a la base de datos usando el nombre redis.

Para ello, realizaremos lo siguientes pasos:

  • Elaboramos el fichero yaml con la definición del Service, y lo creamos.
    apiVersion: v1
    kind: Service
    metadata:
      name: redis
      labels:
        app: redis
        tier: backend
    spec:
      type: ClusterIP
      ports:
      - port: 6379
        targetPort: redis-server
      selector:
        app: redis
        tier: backend
    

Y lo creamos.

    kubectl create -f redis-service.yaml
    
  • Listamos los servicios para comprobar que se ha creado correctamente.
    kubectl get all
    

3

  • Accederemos a la ip del nodo master y al puerto asignado desde un navegador web para ver la aplicación.

4

¡EY! ¡Ya funciona! Pero claro, no es muy cómodo acceder a la aplicación usando la ip del nodo master y el puerto asignado. Para ello vamos a crear un Ingress que nos permita acceder a la aplicación usando un nombre del tipo www.mariajesus.org.

Acceso a la aplicación usando Ingress

Vamos a crear el fichero yaml de definición del recurso Ingress para acceder a la aplicación. Indicaremos un host del tipo www.mariajesus.org, también el nombre del Service que creamos para acceder a la aplicación guestbook y tendremos que tener en cuenta que el puerto de dicho servicio era el 80. Para ello realizaremos los siguientes pasos:

  • Activamos el addon ingress en minikube para instalar el Ingress Controller y creamos el recurso Ingress.
    minikube addons enable ingress
    
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook
    spec:
      rules:
      - host: www.mariajesus.org
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: guestbook
                port:
                  number: 80
    
  • Creamos la definición del recurso Ingress con los datos sugeridos, y creamos el recurso Ingress.
    kubectl create -f guestbook-ingress.yaml
    

Y comprobamos que se ha creado correctamente.

    kubectl get all
    

5

  • Modificaremos el fichero /etc/hosts de nuestro ordenador para configurar la resolución estática.
    sudo nano /etc/hosts
    

Añadimos la siguiente línea al fichero:

    192.168.15.42 www.mariajesus.org
    

6

  • Accederemos a la aplicación usando el nombre que has asignado.

7

Para eliminarlo todo, ejecutamos el siguiente comando:

Ejercicio 2: Despliegue y acceso de la Aplicación Lets-Chat

¿Qué es Lets-Chat?

Lets-Chat es una aplicación de mensajería instantánea basada en Node.js y MongoDB. Es una aplicación de código abierto que se puede desplegar en cualquier entorno de forma sencilla. En este ejercicio vamos a desplegar Lets-Chat en Kubernetes.

Para realizar el despliegue y el acceso de la aplicación, deberemos tener en cuenta los siguientes aspectos:

  • La imagen docker que vamos a usar para el despliegue de Let’s Chat es sdelements/lets-chat y para desplegar mongoDB utilizaremos la imagen mongo. Nota: utiliza imagen mongo:4, Let’s Chat es una aplicación antigua y no funciona con las últimas versiones de mongo.

  • Al crear el despliegue de Let’s Chat podemos poner varias replicas, pero el despliegue de la base de datos, sólo creará una replica.

  • El puerto en el que responde la aplicación es el 8080. La base de datos utiliza el puerto 27017.

  • Vamos acceder desde el exterior a la aplicación. Sin embargo, no es necesario acceder desde el exterior a la base de datos.

  • El nombre del Service para acceder a la base de datos debe ser mongo ya que por defecto la aplicación va a conectar a la base de datos usando ese nombre.

  • Queremos acceder a la aplicación usando un nombre del tipo www.chat-mariajesus.org.

Tras tener todo esto en cuenta, vamos a utilizar como modelos los ficheros yaml de la actividad anterior, crea los ficheros necesarios para crear los recursos en tu cluster de Kubernetes para desplegar esta aplicación.

  • Creamos los ficheros encargados del despliegue de la aplicación Lets-Chat y de la base de datos.

  • Fichero del despliegue de la aplicación Lets-Chat.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: letschat
      labels:
        name: letschat
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: letschat
      template:
        metadata:
          labels:
            name: letschat
        spec:
          containers:
          - name: letschat
            image: sdelements/lets-chat
            ports:
              - name: http-server
                containerPort: 8080
    
  • Fichero del despliegue de la base de datos.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: letschat
      labels:
        name: letschat
    spec:
      replicas: 1
      selector:
        matchLabels:
          name: letschat
      template:
        metadata:
          labels:
            name: letschat
        spec:
          containers:
          - name: letschat
            image: sdelements/lets-chat
            ports:
              - name: http-server
                containerPort: 8080
    
  • Levantamos los despliegues.
    kubectl create -f letschat-deployment.yaml
    kubectl create -f mongo-deployment.yaml
    
  • Comprobamos que se han creado correctamente.
    kubectl get all
    

8

  • Creamos los ficheros de servicios de Let’s Chat y de la base de datos.

  • Fichero del servicio de la base de datos.

    apiVersion: v1
    kind: Service
    metadata:
    name: mongo
    spec:
    ports:
    - name: mongo
        port: 27017
        targetPort: mongo
    selector:
        name: mongo
    
  • Fichero del servicio de LetsChat.
    apiVersion: v1
    kind: Service
    metadata:
    name: letschat
    spec:
    type: NodePort
    ports:
    - name: http
        port: 8080
        targetPort: http-server
    selector:
        name: letschat
    
  • Levantamos los servicios.
    kubectl create -f mongo-service.yaml
    kubectl create -f letschat-service.yaml
    
  • Comprobamos que se han creado correctamente.
    kubectl get all
    

9

Nuestra aplicación LetsChat está desplegada en el cluster de Kubernetes, pero no podemos acceder a ella desde el exterior.

10

Para poder acceder a ella desde el exterior, vamos a crear un Ingress.

  • Creamos el fichero de Ingress para LetsChat.
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: ingress-letschat
    spec:
    rules:
    - host: www.chat-mariajesus.org
        http:
        paths:
        - path: /
            pathType: Prefix
            backend:
            service:
                name: letschat
                port:
                number: 8080
    
  • Levantamos el Ingress.
    kubectl create -f letschat-ingress.yaml
    
  • Comprobamos que se ha creado correctamente.
    kubectl get all
    
  • Agregamos la siguiente línea al fichero /etc/hosts.
    192.168.100.185 www.chat-mariajesus.org
    

11

  • Comprobamos que podemos acceder a la aplicación LetsChat desde el exterior.

12