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>Examen 4 - Redes 2023-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-7b6b9d5b79-c9z99 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: # Esta línea es donde empieza la sección "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-6556db7b58-7dj7l 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 puerto80
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
...
Note
- Deja este comando corriendo
Abre otra terminal y revisa que el puerto este abierto en la máquina local
usuario@laptop ~ % nc -vz localhost 8080
Connection to localhost port 8080 [tcp/http-alt] succeeded!
Revisa que el puerto responda utilizando curl
usuario@laptop ~ % curl -vk# 'http://localhost:8080/'
* Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.87.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.25.0
< Date: Fri, 26 May 2023 07:36:54 GMT
< Content-Type: text/html
< Content-Length: 592
< Last-Modified: Fri, 26 May 2023 07:30:23 GMT
< Connection: keep-alive
< ETag: "6470600f-250"
< Accept-Ranges: bytes
<
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Examen 4 - Redes 2023-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>
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
- Reemplaza
docker.io/tonejito/nginx:linux-doc
con el nombre de la imagen de contenedor que creaste para 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-5565869db8-shs58 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
...
Note
- Deja este comando corriendo
Abre otra terminal y revisa que el puerto este abierto en la máquina local
usuario@laptop ~ % nc -vz localhost 8081
Connection to localhost port 8081 [tcp/sunproxyadmin] succeeded!
Revisa que el puerto responda utilizando curl
usuario@laptop ~ % curl -vk# 'http://localhost:8081/' | egrep '</?title>'
* Trying 127.0.0.1:8081...
* Connected to localhost (127.0.0.1) port 8081 (#0)
> GET / HTTP/1.1
> Host: localhost:8081
> User-Agent: curl/7.87.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.22.0
< Date: Fri, 26 May 2023 07:42:45 GMT
< Content-Type: text/html
< Content-Length: 145412
< Last-Modified: Fri, 29 Apr 2022 09:36:50 GMT
< Connection: keep-alive
< ETag: "626bb1b2-23804"
< Accept-Ranges: bytes
<
{ [32768 bytes data]
######################################################################### 100.0%
*Connection #0 to host localhost left intact
<title>The Linux Kernel documentation — The Linux Kernel documentation</title>
Accede con un navegador al puerto 8081
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/linux-doc 8081:80
Forwarding from 127.0.0.1:8081 -> 80
Forwarding from [::1]:8081 -> 80
Handling connection for 8081
...
^C
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
- Reemplaza
docker.io/tonejito/nginx:tareas-redes
con el nombre de la imagen de contenedor que creaste para 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-6cb9c496cd-2gdq5 1/1 Running 0 30s
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
...
Note
- Deja este comando corriendo
Abre otra terminal y revisa que el puerto este abierto en la máquina local
usuario@laptop ~ % nc -vz localhost 8082
Connection to localhost port 8082 [tcp/sunproxyadmin] succeeded!
Revisa que el puerto responda utilizando curl
usuario@laptop ~ % curl -vk# 'http://localhost:8082/' | egrep '</?title>'
* Trying 127.0.0.1:8082...
* Connected to localhost (127.0.0.1) port 8082 (#0)
> GET / HTTP/1.1
> Host: localhost:8082
> User-Agent: curl/7.87.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Server: nginx/1.22.0
< Date: Fri, 26 May 2023 07:49:37 GMT
< Content-Type: text/html
< Content-Length: 12443
< Last-Modified: Tue, 31 May 2022 01:47:02 GMT
< Connection: keep-alive
< ETag: "62957396-309b"
< Accept-Ranges: bytes
<
{ [12443 bytes data]
######################################################################### 100.0%
*Connection #0 to host localhost left intact
<title>Redes - Tareas 2023-2</title>
Accede con un navegador al puerto 8082
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/linux-doc 8082:80
Forwarding from 127.0.0.1:8082 -> 80
Forwarding from [::1]:8082 -> 80
Handling connection for 8082
...
^C
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 22m
deployment.apps/linux-doc 1/1 1 1 11m
deployment.apps/tareas-redes 1/1 1 1 6m
NAME READY STATUS RESTARTS AGE
pod/root-nginx-6556db7b58-7dj7l 1/1 Running 0 20m
pod/linux-doc-5565869db8-shs58 1/1 Running 0 10m
pod/tareas-redes-6cb9c496cd-2gdq5 1/1 Running 0 5m
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 |