Implementación de sitios web en Kubernetes#


Sitio web default#

La primer tarea es configurar un sitio web "default" que maneje todo el tráfico, esto se conoce como un sitio catch-all

  • En la práctica anterior, esto se configuró en el VirtualHost _default_ de Apache HTTPD

Crea la página de índice#

Crea un archivo llamado index.html con el siguiente contenido

  • Reemplaza Equipo-AAAA-BBBB-CCCC-DDDD con el nombre de tu equipo
  • Reemplaza example.com con tu nombre de dominio

Note

Puedes utilizar otra página index.html, siempre y cuando no utilice recursos externos y muestre la información solicitada

<!DOCTYPE HTML>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Práctica 8 - Redes 2022-2</title>
    <link href="data:image/x-icon;base64," rel="icon" type="image/x-icon" />
  </head>
  <body>
    <h1>Hola</h1>
    <div>
      <p>Esta es la página del <code>Equipo-AAAA-BBBB-CCCC-DDDD</code></p>
      <p>Nuestro dominio DNS es <code>example.com</code></p>
      <ul>
        <li><em>Esta página se está sirviendo desde el cluster de <b>Kubernetes</b> en <code>k3s.example.com</code></em></li>
      </ul>
    </div>
    <hr/>
    <code>Redes de Computadoras</code>
  </body>
</html>

Crea un configmap para guardar el contenido del archivo index.html

  • Este configmap se pasará a un servidor web para mostrar la página cuando se visita la URL del servidor
  • Reemplaza index-equipo-aaaa-bbbb-cccc-dddd con el nombre de tu equipo (en minúsculas)
usuario@laptop ~ % kubectl create configmap index-equipo-aaaa-bbbb-cccc-dddd --from-file=index.html
configmap/index-equipo-aaaa-bbbb-cccc-dddd created

Crea el deployment del servidor web#

Ejecuta el siguiente comando para crear un deployment del servidor web nginx y especifica que escucha conexiones en el puerto 80

usuario@laptop ~ % kubectl create deployment root-nginx --image=nginx --port=80

Verifica que el pod de nginx se encuentre en estado de ejecución

usuario@laptop ~ % kubectl get pods -l app=root-nginx 
NAME                          READY   STATUS    RESTARTS   AGE
root-nginx-68778df5d4-gjlkh   1/1     Running   0          60s

Asigna el volúmen de la página de índice al deployment del servidor web#

Edita el deployment root-nginx para agregar las líneas donde se monta el configmap que contiene el archivo index.html

usuario@laptop ~ % kubectl edit deployment/root-nginx
    ...

Agrega las líneas correspondientes a volumeMounts y volumes en las secciones adecuadas

  • Reemplaza index-equipo-aaaa-bbbb-cccc-dddd con el nombre de tu equipo (en minúsculas)

Warning

  • Verifica que la identación de las líneas sea correcta y que insertes las secciones en el lugar adecuado
  • YAML es un lenguaje que maneja la identación utlizando DOS ESPACIOS
---
apiVersion: apps/v1
kind: Deployment
...
spec:
...
  template:
...
    spec:  # Agrega la sección "volumes" entre "spec" y "containers"
      volumes:
      - name: index-equipo-aaaa-bbbb-cccc-dddd
        configMap:
          name: index-equipo-aaaa-bbbb-cccc-dddd
      containers:
      - name: nginx
...
        terminationMessagePolicy: File  # Agrega la sección "volumeMounts" después de esta línea
        volumeMounts:
        - name: index-equipo-aaaa-bbbb-cccc-dddd
          mountPath: /usr/share/nginx/html/index.html
          subPath: index.html

Si tienes éxito, aparecerá un mensaje indicando que el deployment fue editado, en caso contrario kubectl te regresará al editor e insertará un comentario en el archivo tratando de explicar el error

usuario@laptop ~ % kubectl edit deployment/root-nginx
deployment.apps/root-nginx edited

Espera unos segundos mientras se lanza otro pod con la nueva configuración

usuario@laptop ~ % kubectl get pods -l app=root-nginx
NAME                          READY   STATUS    RESTARTS   AGE
root-nginx-5f8f6c5d9f-2t26s   1/1     Running   0          30s

Note

  • El identificador del pod debe ser diferente porque se creó uno nuevo con la configuración actualizada del deployment
  • Utiliza los siguientes comandos para forzar la creación de un nuevo pod en caso de que no se cree uno automáticamente


usuario@laptop ~ % kubectl scale deployment/root-nginx --replicas 0
usuario@laptop ~ % kubectl scale deployment/root-nginx --replicas 1

Visualiza la página de índice utilizando port-forward#

Haz una redirección de puertos de Kubernetes para visualizar la página de índice que acabas de configurar

  • Esto funciona al poner el puerto 8080 del equipo local en escucha y redireccionar las peticiones al puerto 80 del pod en el cluster
usuario@laptop ~ % kubectl port-forward deployment/root-nginx 8080:80          
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

Accede con un navegador al puerto 8080 en el equipo local

Página en Kubernetes mostrada a través de port-forward

Presiona Ctrl+C para salir de kubectl port-forward

usuario@laptop ~ % kubectl port-forward deployment/root-nginx 8080:80          
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80
Handling connection for 8080
^C

Sitio de la página de documentación del kernel Linux#

Crea un deployment donde se ejecute la imágen de contenedor que contiene el sitio web de la documentación del kernel Linux

usuario@laptop ~ % CONTAINER_IMAGE="docker.io/tonejito/nginx:linux-doc"
usuario@laptop ~ % kubectl create deployment linux-doc --image="${CONTAINER_IMAGE}" --port=80
deployment.apps/linux-doc created

Verifica que el pod asociado al deployment linux-doc se está ejecutando

usuario@laptop ~ % kubectl get pods -l app=linux-doc
NAME                        READY   STATUS    RESTARTS   AGE
linux-doc-7d564dbdf7-5d9rw   1/1     Running   0          30s

Verifica que puedas acceder al sitio web con kubectl port-forward

usuario@laptop ~ % kubectl port-forward deployment/linux-doc 8081:80                                   
Forwarding from 127.0.0.1:8081 -> 80
Forwarding from [::1]:8081 -> 80
Handling connection for 8081
    ...
Página en Kubernetes mostrada a través de port-forward

Sitio de la página de tareas de la materia#

Crea un deployment donde se ejecute la imágen de contenedor que contiene el sitio web de tareas de la materia

usuario@laptop ~ % CONTAINER_IMAGE="docker.io/tonejito/nginx:tareas-redes"
usuario@laptop ~ % kubectl create deployment tareas-redes --image="${CONTAINER_IMAGE}" --port=80
deployment.apps/tareas-redes created

Verifica que el pod asociado al deployment tareas-redes se está ejecutando

usuario@laptop ~ % kubectl get pods -l app=tareas-redes                                              
NAME                            READY   STATUS    RESTARTS   AGE
tareas-redes-59cb877d79-74kp6   1/1     Running   0          15s

Verifica que puedas acceder al sitio web con kubectl port-forward

usuario@laptop ~ % kubectl port-forward deployment/tareas-redes 8082:80
Forwarding from 127.0.0.1:8082 -> 80
Forwarding from [::1]:8082 -> 80
Handling connection for 8082
    ...
Página en Kubernetes mostrada a través de port-forward

Verifica la configuración#

Revisa que los deployments tengan estado READY 1/1 y que el estado de los pods sea Running

usuario@laptop ~ % kubectl get deployments,pods
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/root-nginx     1/1     1            1           31m
deployment.apps/linux-doc      1/1     1            1           21m
deployment.apps/tareas-redes   1/1     1            1           11m

NAME                                READY   STATUS    RESTARTS   AGE
pod/root-nginx-5f8f6c5d9f-2t26s     1/1     Running   0          30m
pod/linux-doc-7d564dbdf7-5d9rw      1/1     Running   0          20m
pod/tareas-redes-59cb877d79-74kp6   1/1     Running   0          10m

Danger

  • Verifica que TODAS las configuraciones que hiciste estén presentes respués de reiniciar la máquina antes de continuar con la siguiente sección

Note

  • Continúa en la siguiente página si los deployments y pods se están ejecutando y pudiste ver las páginas utilizando kubectl port-forward en el equipo local

Página anterior Arriba Página siguiente